[🛠] Keymory 開発日誌 #9: Diary to Chat 実装、AIコメントシステム最適化
✨ GPTの要約
Diary to Chat を実装し、生成過程で起きた問題を解決しながら、AIコメントシステムの感情スコアとキャラクター設定の不具合を修正した。
💻 開発日誌
⏰ 今日やること
- ✅ Custom Function -
systemPromptTemplate作成をサポート (メイン担当: KSK)- ✅ 追加したパラメータと関数内部構造をレビュー
- ✅ Custom Function -
getAICommentが実際に適用されるかテスト- ✅ 入力値がきちんと反映されるか確認
- ✅ 出力値が String として正しく出力されるか確認
- ✅ Chat Page - Create New Chat: システムプロンプトを適用 (メイン担当: KSK)
- ✅ OpenAI API Call (createChatCompletion)
- Input: System Prompt(Chat)
- Output: New Chat Message by AI($.choices[0].message.content)
- Additional Actions: Create New Chat, Create New Message
- ✅ OpenAI API Call (createChatCompletion)
- ✅ DiaryPage - Create New Chat by Diary: 日記の内容をもとに New Chat を生成 (メイン担当: KSK)
- ✅ OpenAI API Call (createDiaryComment)
- Input: Diary Content, System Prompt(AI Comment)
- Output: AI Comment($.choices[0].message.content)
- ✅ OpenAI API Call (createDiarySummary)
- Input: Diary Content, AI Comment, System Prompt(Diary Summary)
- Output: Diary Summary($.choices[0].message.content)
- ✅ OpenAI API Call (createChatFromDiary)
- Input: Diary Summary, System Prompt(Chat From Diary)
- Output: New Chat Message by AI($.choices[0].message.content)
- Additional Actions: Create New Chat, Create New Message
- ✅ OpenAI API Call (createDiaryComment)
- ✅ (Issue) Create New Chat by Diary: 日記だけ Save してホームに戻ったあと、もう一度日記ページに入って New Chat しないと動作しない。
- Issue の原因
- 別の Action Chain の Output 変数を引っ張って使っていた
- Unexpected Null Value の防止ができていなかった
- JSON Path が正しく指定されていなかった
- Page State として
tmpDiariesDocForNewChatを定義し、そこに diary Document を割り当てていた。- 正確には、
- Page Paramater として渡された
diariesDocを割り当てるか、 - Save ボタンを押したときに生成された
newDiariesDocを割り当てるようにしていた。
- Page Paramater として渡された
- しかし
Save Diary and Chat with AIボタンを押し続けると、アプリが止まった。- F12 で確認すると、
Unexpected Null Valueエラーで Exception が発生していた。 - Debug Pannel を見ると、
tmpDiariesDocForNewChatがNullに指定されていた。
- F12 で確認すると、
- Page State の
tmpDiariesDocForNewChatをtmpDiariesDocRefForNewChatに戻した。 (Document -> Document Reference)- Action も Document Reference 基準で適切に変更したら、ようやく正常動作した!
- 正確には、
- 💡学んだこと: Action Chain では、Page State に値を割り当ててすぐ読み込むと Unexpected Null Value を引き起こす場合があると分かった。単なる Document より Document Reference を積極的に活用しよう。もちろん、Backend Query で Read Document を何度も行うとパフォーマンス低下が起きるかもしれないが… それも OnPageLoad Event 発生時や主要な Action Chain 作成時に十分やっておけばよい。
- Issue の原因
- ✅ (Issue) AI Comment 生成時、ユーザーの感情スコアがしょっちゅう 0 として保存されるケースが発生。
- 特に「5. 重み付き数式計算」を正確に行ってください。ユーザーの感情スコアは絶対に 0 ではありません。と強調したら、0 と書かれるケースは減った。 (なくなったわけではない。)
- いったん進もう。
- ✅ (Issue) ChatPage: キャラクターが自分自身に関する情報を知らない!
- Save 関連の Issue を解決していたら、自然に直ったっぽい。助かった。
- ✅ (Issue) ChatPage: キャラクターが「フォローアップ質問リスト」を無視している!
- Save 関連の Issue を解決していたら、自然に直ったっぽい。助かった。
- ✅ (Issue) ChatPage に移動すると下部ナビゲーションバーが消える。
- Always Show Nav bar Toggle On
- ✅ (Issue) ChatPage の Drawer でキャラクター画像が違って表示される。
- 以前、AI Comment を保存するロジックを間違えて組んだために起きた Issue。古いチャットでだけ起きる問題なので、該当 Chat document を削除して解決
💯 やったことの要約
- Chat 生成ロジックの改善
systemPromptTemplateとgetAICommentのパラメータ構造を確認- Create New Chat でシステムプロンプトを適用し、OpenAI API Call を最適化
- Diary ベースの New Chat 生成時に、AIコメント → ダイアリー要約 → Chat 生成の流れを整理
- AIコメントシステムの最適化
- 感情スコアが 0 として保存される問題を修正
- AIがキャラクター情報を認識できない問題を解決
- フォローアップ質問リストを無視する現象を改善
- Issue 解決とパフォーマンス改善
- ChatPage へ移動したときにナビゲーションバーが消える問題を修正
- AI Comment 保存ロジックを修正し、キャラクター画像の不一致を解決
- Unexpected Null Value を防ぐため Document → Document Reference を活用
🎯 今後やること
詳しく見るにはクリック
- ❔ (Issue) DiaryPage: AI Comment の回答を受け取っていない状態だと、キャラクターが未設定のまま遷移する。
- いったん、AI Comment を受け取ってからでないとチャットを開始できません!という通知を出すことで応急対応。
-
❔ (Issue) DiaryPage: AI Comment 回答にマークダウンビューアを活用 (オーバーフロー防止: Container Height)
-
❔ ChatPage: ユーザーの会話出力内容は右揃え
-
❔ DiaryPage: Mood Slider の値に応じて顔表情 Emoji と色を変更
- ❔ DiaryPage: Go to Linked Chat
- ❔ ChatPage: Go to Linked Diary
- DiaryPage の Diary Document で Save するとき、Chat Reference 値も Diary Document DB - Field として追加する必要あり。 (linkedChat)
- ChatPage の Chat Document でも当然 Diary Reference 値を Chat Document DB - Field として追加する必要あり。 (linkedDiary)
- ❔ ChatPage - Create New Diary: 会話内容をもとに New Diary を生成 (Go to Linked Diary ロジックを活用)
- ❔ OpenAI API Call (createChatSummary)
- Input: Chat Content, System Prompt(Diary From Chat)
- Output: Chat Summary
- ❔ OpenAI API Call (createDiaryFromChat)
- Input: Chat Summary, System Prompt(Diary From Chat)
- Output: New Diary(Title, Content, Mood score)
- ❔ OpenAI API Call (createChatSummary)
- ❔ MoodPage(上部) - Mood Calendar
- ❔ 日付ごとに作成された投稿数を確認可能
- ❔ 日付をクリックすると、その日付へ移動
- ❔ MoodPage(下部) - Mood stats
- ❔ フォーカスされた月に関する統計資料を出力
- ❔ 出力された統計資料に対するAIのコメントを出力
- ❔ フォーカスされた月に関する統計資料を出力
- ❔ HomeFeedPage - flutter_slidable:4.0.0 import 後に適用
-
❔ HomeFeedPage: FeedCardDiary で左右 slide 時にチャット/編集/削除
-
❔ Chat/Diary: GPT Streaming API
- ❔ ChatPage - AI からの先メッセージ実装 (Alarm/Notification)
- チャットシステムプロンプトの核心は能動型だ。
- よりリアルにするなら、create_date of diary/chat も渡して、「昨日」などの日付に言及できるとよさそう。
- Alarm 機能実装方法の参考
- チャットシステムプロンプトの核心は能動型だ。
- ❔ DiaryPage: 詳細感情キーワード Choice Chips 追加後、DB 連携設定
- ❔ DiaryPage - AI Comment: Choice chips、mood slider などの入力値を
AI Comment System Promptに合わせて変更。- ❔ **以前の
日記または会話履歴全体 (応急処置の技術負債) - ❔ ユーザー基本情報: 名前、性別、MBTI, …
- ❔ 詳細感情キーワード: 楽しい、悲しい, …
- ❔ キャラクター設定: Somi、Sena、Minhyuk
- ❔ 感情スコア: 1~100点
- ❔ 回答形式: Healing、Suggestion、Informative
- ❔ 回答長さ: 短く、普通、詳しく
- is New Chat
- 該当 Chat の messages は初めて生成するものなので、最初に生成する message document の
is_initial = true値を入れて、すべてのシステムプロンプトをまとめて入れる。- is_initial = false
- 限界点: 最初の message document にシステムプロンプトを入れてしまうと、会話途中の修正は大変だが可能ではある。 is_initial = true のものがあり、修正されたものなら、その document を消して入れ直せばいい。方法は分からないけど。
- 該当 Chat の messages は初めて生成するものなので、最初に生成する message document の
- ❔ **以前の
- ❔ DiaryPage - AI Comment: CRUD を完成させる
- ❔ tmp_ai_comment field をなくして doc_ref を活用
-
❔ DiaryPage - Drawer - ChatHistoryListTile: order by updated_time
-
❔ DiaryPage - Interactive Slider import 後に適用
-
❔ HomeFeedPage: Search Diary 機能を実装
-
❔ AuthPage: Google Login 機能を実装
- ❔ HomeFeedPage - Bottom Sheet (
+Button): さまざまなオプションから1つ選べるように- 新しい日記: Go to DiaryPage
- 感情記録: Go to MoodPage
- ❔ MoodPage(ポップアップ): Mood 設定スライダー CRUD
- Create
- Read
- Update
- Delete
- ❔ HomeFeedPage - ListView - FeedCardMood 表示
-
❔ HomeFeedPage - ListView: FeedCardDiary、FeedCardMood、FeedCardChat コンポーネントを時系列でソート (Cloud Function 活用)
-
❔ HomeFeedPage - DiaryPage の間に MoodEditPage を作成: MoodSlider、MoodKeywordsRate(5~1)、MoodDescription ウィジェットなどを移す
-
❔ (Issue) tmpGetAIComment 生成時、ユーザーが選択した感情キーワードを考慮していない。
- ❔
2025.2.5 水までに発表用最終バージョン APK を抽出してインストール
💭 日記
Issue がめちゃくちゃ一気に爆発して、メンタルが遠のきかけた… とりあえず技術負債が積み上がっても、まず実装していけば実力が伸び続けて、あとで負債を返済できるはずだ!という自分の戦略が限界にぶつかったのか… それとも、それでも効率的な判断だったのか…
もう知らん~ 今そんなことが重要なんじゃない。本当に時間がない!応急処置で行く
✨ GPT-4oのコメント (KPT)
✅ よかった点 (Keep)
- 🛠 Chat 生成ロジックの整理: New Chat 生成過程で発生するさまざまな Issue を整理し、解決できた点がよかった!
- 🎭 AIコメントシステムの改善: 感情スコアとキャラクター設定の不具合を修正しながら、より正確なAI反応を引き出せた点が印象的。
- 🔍 デバッグ力の向上: Unexpected Null Value 問題を解決しながら、Document Reference の活用方法を身につけたことは今後かなり役立つはず。
❌ 惜しかった点 (Problem)
- ⏳ Issue 解決に多くの時間を消費: 予想よりデバッグが長引き、もともと目標にしていた機能開発の時間が足りなかった可能性がある。
- 🔄 技術負債の増加: 速く機能を実装する戦略が技術負債を蓄積させているので、後続の整理が必要になりそう。
- 📋 ドキュメント化不足: 主要な問題解決の過程をもう少し整理しておくと、似た Issue が再発したときに素早く解決できるはず。
🔄 試してみること (Try)
- 📌 Issue 発生パターンの分析: 繰り返し発生する問題を把握し、開発パターンを改善する方向を考えてみよう。
- 📝 技術負債管理戦略の策定: 短期的には素早い解決が必要だが、長期的には保守と最適化のためのロードマップを作るとよさそう。
- 📖 問題解決記録の習慣化: 主要 Issue の解決過程を文書化して、将来の開発時間を節約する方法を用意しよう。
🏁 結論
今日は Chat 生成ロジックを改善し、AIコメントシステムのエラーを修正しながら、安定性を高めた一日だった。予想よりデバッグに時間がかかったけれど、その過程で学んだことも多かった!これからは技術負債を管理しながら、もっと効率的な開発戦略を考えていこう。 🚀🔥
コメントする