はじめに
Qiitaの皆さん、こんにちは。仕事のチームメンバーとなら、お互いの意見が違っても、割と「建設的な意見交換」ができますよね。
なのに、相手が家族だと、なぜかそれが難しくなる! そんな経験、ありませんか?(私はめっちゃあります)
- もう限界!家事分担を見直したい!
- 子どものゲーム時間、この間約束したのに、またオーバーしてる!
この状態で「ちょっと話あるんだけど!」とスタートしても、感情論で炎上し、「今日はもういいや…(疲)」とそのままフェードアウトすること多々...
このモヤモヤ、なんとかしたい!家庭にこそ「心理的安全性」が必要なのでは!?
なんで家族会議は「うまくいかない」んだろう?
「仕事の会議」と「家族会議」って、何が違うんだろう? あらためて考えてみました。
理由1:「責められてる」と感じやすい
仕事よりも家庭の方が、自分で「どうするか」を決める自由度が高いですよね(例えば、トイレットペーパーが残り少ないとき、補充するか・放置するかは自分次第)。
家族から言われたことが「実は自分が罪悪感を感じていること」だった場合、言われた方は「責められてる」と感じてしまう。そうなると、自己防衛が作動し、怒り出したり黙り込んだりして、話し合いが難しくなります。
例えば、こんな感じです。
- 家事AとBを一人でやるのは大変なんだけど... → (ギクリ) 自分だって頑張ってる!
- 最近、ゲームの時間が長くない? → (ドキッ) 友達はもっとやってる!
理由2:「遠慮のない間柄」だからこそ
家族は、良くも悪くも「遠慮のない」関係です。
だからこそ、仕事相手には無意識にできている「相手の話を最後まで聞く」とか「頭ごなしに否定しない」といった、話し合いの暗黙のルール がついお留守になってしまうこと、ないですか?(私はしょっちゅうです)
また、自分の主張を相手に一方的に言い聞かせる場(つまり説教)になり、話し合いになってない...というパターンもよくあります。
この「モヤモヤ」を解消するには?
これって、ファシリテーターがいて、「次はこれを話してみましょう」とか「今は〇〇さんの話を聞きましょう」とか仕切ってくれたら、話し合いがうまくいくんでは?
でも、家族の話し合いに毎回ファシリテーターを呼んでくるのは現実的じゃない。
だったら、ファシリテーターのように話し合いをサポートしてくれる、お助けツールがいればよいのでは? ということで作りました!
家族会議をサポートするアプリ 「fameet」
作ったのがこちら、あなたの家族会議をサポートするアプリ、「fameet」です。
- サービスLP: https://sakinokoto.esm.co.jp/fameet
- App Store: https://apps.apple.com/jp/app/id6744429051
- Google Play: https://play.google.com/store/apps/details?id=jp.co.esm.fameet
上記の課題を解決する機能を実装しました!
また、家族みんなに親しんでもらえるよう、マスコット的な何かがほしい!ということで、猫のような、タヌキのような不思議なキャラクター「みーとん」が生まれました。
1. 話し合いたいことを見える化
仕事の会議では、スムーズに進めるためアジェンダを用意し、目的やゴールを共有してスタートします。
家族会議でも同じことができれば、「責められている」ではなく「この問題の解決に向かっている」と前向きな気持ちになれて、かつ話し合いもスムーズに進むのでは!
ということで、fameetでは、こんな流れで話し合いを進めます。
-
準備
- ユーザー:「こんなことに困ってる、こんなことを話したい」というテーマを入力する
- アプリ:「建設的な話し合いができるアジェンダ」を生成AIで作成する
-
話し合い
- アプリ:準備で作成したアジェンダに沿って、話し合う内容をナビゲートする
- 家族:アプリのナビゲートに沿って話し合う
2. 「みーとん」が安全な話し合いをサポート
家族だとついやってしまう「相手の話をさえぎる」「相手の意見を否定する」といった暗黙のルール破りや、お説教モード。
fameetではこの問題が発生しにくいよう、「みーとん」というキャラクターを導入しました。
まずは、話し合いの最初に話し合いのルールを共有するしくみです。みーとんが提案するルールを全員で選ぶことで、「これを守るんだな」という共通認識ができます。
ルールが決まったら、準備したアジェンダに沿って話し合います。このとき、みーとんが家族一人ひとりに声をかけてくれるので、家族全員が自然に話し合いに参加できます。
3. 「記憶」ではなく「記録」に残す
仕事の会議でも、決まったことを忘れちゃうこと、ありますよね。そんなときは議事録を確認して、「そうそう、そうだった」と思い出します。
fameetでも、話したことや決まったことを記録に残して、いつでも見返せるようにしました。
この機能は当初、話し合いをすべて録音して文字に起こし、生成AIで議事録を作ろうとしましたが、プロトタイプの結果、「決まったこと」を個別で音声で入力できるという仕様にしました。
変更した理由は、UX的な懸念と技術的なハードルの両方です。
- UX:家族の話し合いが全部録音されることに抵抗感がある、というフィードバックがあった
- 技術:テーブルにスマホ(またはタブレット)を一台置いて、それを家族で囲んで話し合った場合、全員の発言を拾って文字起こしするのが難しかった。
Flutterのspeech_to_textライブラリでのリアルタイム文字起こしと、録音データをWhisperで文字起こしする方法を試したが、どちらも会話の一部が欠損してしまい、専用マイクがないと難しいという結論になった
技術のはなし
技術要素
使用した技術要素です。
- アプリFW:Flutter
- クロスプラットフォームが前提で、React Native と Flutter で迷ったが、標準でいろいろできるFlutterの方が簡単に始められそうと判断
- Flutter未経験なので、使ってみたかった
- DB:drift (SQLite)
- 生成AI:OpenAI API
- 生成AIバックエンド化:Firebase Functions
- APIキーをアプリ側に持たせたくないので、API呼び出しをバックエンドに封印
- API呼び出し前に、Microsoft Presidio で個人情報をマスキング処理
- 生成AIコンテンツへのフィードバック:Firestore
- Google Playのガイドライン(下記)への対応で、レポート機能が必須だった
AI を使用してコンテンツを生成するアプリには、ユーザーがアプリを終了せずにデベロッパーに不適切なコンテンツを報告または通報できるアプリ内ユーザー レポート機能が用意されていなければなりません。
- デベロッパーが参照できる場所、ということでFirestoreに格納
- Google Playのガイドライン(下記)への対応で、レポート機能が必須だった
困りごとを解決するアジェンダの生成
このアプリの心臓部は、ユーザーの「困りごと」を「建設的な話し合いのアジェンダ」に変換する処理です。
ただ、単にAIに「家族会議のアジェンダを作って:{ユーザ入力}」と投げるだけでは、実用的な機能にはなりませんでした。ユーザーが入力する「解決したいこと」の粒度が人によってバラバラだからです。
例えば、ユーザが「おこづかいについて」と入力した場合、金額を決めたいのか、使い方が心配だから話し合いたいのか、それによってアジェンダは変わってきます。
アジェンダをユーザーの意図に近づけるため、以下の2段階構成にしました。
Step 1:AIで具体化する
まずはユーザーの入力から、AIで「具体的に話し合うべきトピックの候補」をいくつか生成し、ユーザーに提案します。
Step 2:ユーザーの選択からアジェンダを生成
ユーザーが選択した具体的なトピックと、最初に入力した「困りごと」から、アジェンダを生成します。
これにより、「なんか思ってたのと違う...」というガッカリ体験を減らし、ユーザーが本当に話したいことにフォーカスできるようになりました。
AIとがっつり開発
Flutter未経験、かつ実装者が一人、という状況で無謀にもFlutterに挑んだのは、ここ2年くらいの開発で「生成AIがいればけっこう何とかなる」という感覚があったからです。
普通にGoogle検索していたころから比べると「自分が欲しい情報をピンポイントに得られるまで」が格段に速くなり、その分実装スピードも速くなったと感じていました。
そんな目論見で、AIと二人三脚で実装を始めました。
開発に使った生成AIたち
実装に使ったAIはこんな感じです。
-
Cline (APIはClaude):
VS Codeの拡張機能で、VS Code上にあるコードは勝手に読みながら推測してくれるので、エージェントっぽく使えました。ただ、難易度高めなタスクをお願いすると
Cline: 「できました
」 ⇒ 私:「いやできてないし
」
の無限ループに入り、このやりとりの間もAPI課金が発生します。なので、二回目の指摘で思うようにいかない場合は、Clineへの依頼はあきらめて、他のAIにお願いし、それでもダメなら自分でやるようにしました。 -
ChatGPT :
「こういうことやりたいんだけど、どうするとよい?」という設計相談を主にしていました。また、エラーが出たらスタックトレースを張り付けて原因を聞くと、ほぼピンポイントで解決できるので助かっていました。
入力を全部チャット画面に張り付けるのですが、入力が多いと「全部読んでないな?」「手抜きしたな?」みたいな時がちょいちょいありました。 -
Gemini:
ChatGPTのセカンドオピニオン的な感じで使用していました。
たまにChatGPTと違う回答をくれて、そっちが当たりだったりしました。
今回得た教訓
私がちゃんと調べずAIの提案をそのまま採用した結果なのですが、苦労した点と、そこから得た教訓です。
採用するライブラリは、自分でも調べる
途中でAI推奨の状態管理ライブラリが変わったのが、一番きつかったです...
AI提案のコードが Provider というライブラリを使っていたので、素直にそれで実装していたら、別の機能の実装で『Riverpod が最適です』と言い出しました。
「え、Provider 使ってんだけど...」と伝えたところ、『Provider の問題点解消のために Riverpod が生まれたので、Riverpod を使うべきです』と言われ、「いやいや、最初に言ってよ」と思わずツッコミいれました。
新しく実装する機能は Riverpod が最適なのもその通りだったので、Provider を Riverpodに置き換えようとしたのですが、一筋縄ではいかず...(Clineへ置き換えを依頼したところ、「できた ⇒ できてない」の無限ループでした。想定通り
)
結局リリースを優先し、現状は Provider と Riverpod が混在した状態となっています。(これからリファクタリング予定)
これ以降ライブラリを導入する際は、メンテされているか、後継が出ていないか、どれくらい使われているかを自分で調べてから導入するようになりました。
AIのコードには丁寧なコメントを!
AIが生成したコードは、自分なりに理解して採用するようにしていましたが、なかなか動かずAIと試行錯誤したところは、うまくいった時に「やっと動いた~!」と勢いでそのまま採用してしまったことがありました。
しかし、後から見直した時に「なんでこんなことしてるの?無駄に複雑じゃない?」となっても、それが「本当に必要なハック」なのか、それとも「AIとやり取りしすぎて生まれたスパゲッティ」なのか、判別がつかなくなる恐怖を味わいました。
この失敗を経て、 「AIが書いたコードこそ、人間が書く以上のコメントが必要」 と痛感しました。 現在は、AIの提案コードを採用する際は、「なぜその処理が必要なのか」を必ずコメントに残し、未来の自分が困らない運用を徹底しています。
おわりに
こんな感じで作った fameet 、ひとつでも多くの家族会議を平和にできると嬉しいです!
ご興味あれば、ぜひ使ってみてください!!
最後まで読んでいただき、ありがとうございました!



