[🛠] 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)
- ✅(问题)Create New Chat by Diary:只保存日记并回到首页后,必须再次进入日记页面再 New Chat 才能正常运行。
- 问题原因
- 正在拉取另一个 Action Chain 的 Output 变量来使用
- 没有做好 Unexpected Null Value 防护
- JSON Path 没有正确指定
- 曾经把
tmpDiariesDocForNewChat定义为 Page State,并把 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)- 以 Document Reference 为基准适当调整 Actions 后,终于正常运行!
- 更准确地说,
- 💡学到的点:在 Action Chain 中,把值分配给 Page State 后马上读取,可能会引发 Unexpected Null Value。相比直接使用 Document,还是多利用 Document Reference 吧。当然,如果用 Backend Query 大量 Read Document,可能会带来性能下降……但这种事也可以在 OnPageLoad Event 发生时,或者创建主要 Action Chain 时提前充分处理。
- 问题原因
- ✅(问题)生成 AI Comment 时,经常出现把用户情绪数值保存为 0 的情况。
- 尤其强调“请准确执行 5. 加权公式计算。用户情绪数值绝对不是 0。”之后,写成 0 的情况减少了。(但没有完全消失。)
- 先暂时跳过吧。
- ✅(问题)ChatPage:角色不知道关于自己的信息!
- 解决 Save 相关问题的过程中,好像自己就修好了。赚到了。
- ✅(问题)ChatPage:角色正在无视“后续问题列表”!
- 解决 Save 相关问题的过程中,好像自己就修好了。赚到了。
- ✅(问题)进入 ChatPage 后底部导航栏消失。
- Always Show Nav bar Toggle On
- ✅(问题)ChatPage 的 Drawer 中角色图片显示不一致。
- 这是以前 AI Comment 保存逻辑写错导致的问题。因为只会发生在旧聊天里,所以删除对应 Chat document 解决。
💯 完成内容摘要
- 改善 Chat 生成逻辑
- 检查
systemPromptTemplate和getAIComment的参数结构 - 在 Create New Chat 中应用系统提示词,并优化 OpenAI API Call
- 整理基于 Diary 的 New Chat 生成流程:AI 评论 -> 日记摘要 -> Chat 生成
- 检查
- 优化 AI 评论系统
- 修正情绪数值被保存为 0 的问题
- 解决 AI 无法识别角色信息的问题
- 改善无视后续问题列表的现象
- 解决问题并改善性能
- 修正移动到 ChatPage 时导航栏消失的问题
- 修改 AI Comment 保存逻辑,解决角色图片不一致问题
- 为防止 Unexpected Null Value,使用 Document -> Document Reference
🎯 以后要做的事
点击查看详情
- ❔(问题)DiaryPage:如果还没有收到 AI Comment 回复,会在角色未设置的状态下进入下一步。
- 先用弹窗临时处理:必须收到 AI 的 Comment 后才能开始聊天!
-
❔(问题)DiaryPage:AI Comment 回复使用 Markdown 查看器(防止溢出: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 - import 后应用 flutter_slidable:4.0.0
-
❔ 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,而且它被修改了,把那个 document 删除后重新放进去就行。具体怎么做还不知道。
- 因为该 Chat 的 messages 是第一次创建,所以直接给最初创建的 message document 设置
- ❔ **以前的
- ❔ DiaryPage - AI Comment:完成 CRUD
- ❔ 删除 tmp_ai_comment field,改用 doc_ref
-
❔ DiaryPage - Drawer - ChatHistoryListTile: order by updated_time
-
❔ DiaryPage - import 后应用 Interactive Slider
-
❔ 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 小部件等
-
❔(问题)创建 tmpGetAIComment 时,没有考虑用户选择的情绪关键词。
- ❔ 到
2025.2.5 周三为止,提取并安装发表用最终版本 APK
💭 日记
问题接二连三地炸出来,精神差点直接远走高飞……“就算技术债堆起来,只要先实现,实力会持续增长,以后也能还债!”我这种策略是不是终于撞到极限了……还是说,这依然算是有效率的判断……
算了不知道了~ 现在那种事根本不重要。真的没时间了!先补丁冲冲冲。
✨ GPT-4o 的评论(KPT)
✅ 做得好的点(Keep)
- 🛠 整理 Chat 生成逻辑: 能把 New Chat 生成过程中出现的各种问题整理并解决,这一点很好!
- 🎭 改善 AI 评论系统: 修正情绪数值和角色设定错误,并引导出更准确的 AI 反应,这点很亮眼。
- 🔍 调试能力提升: 解决 Unexpected Null Value 问题,并掌握 Document Reference 的使用方式,以后会很有帮助。
❌ 可惜的点(Problem)
- ⏳ 解决问题耗时较多: 调试比预想中更久,原本计划的功能开发时间可能变少了。
- 🔄 技术债增加: 快速实现功能的策略正在累积技术债,后续可能需要整理。
- 📋 文档化不足: 如果把主要问题解决过程稍微整理下来,类似问题再次发生时会更快解决。
🔄 可以尝试的点(Try)
- 📌 分析问题发生模式: 找出反复发生的问题,思考如何改善开发模式。
- 📝 制定技术债管理策略: 短期内需要快速解决,但长期来看最好制定维护和优化路线图。
- 📖 养成记录问题解决过程的习惯: 把主要问题的解决过程文档化,为未来节省开发时间。
🏁 结论
今天是改善 Chat 生成逻辑、修正 AI 评论系统错误、提升稳定性的一天。虽然调试比预想中花了很多时间,但过程中也学到了不少!之后一边管理技术债,一边继续思考更高效的开发策略吧。🚀🔥
留下评论