- doc/heart.md: emotional system design (motivation, reflection, relationship memory) - Auto-reflection: every 10 messages, async LLM call updates inner_state with feelings and understanding changes (not conversation summary) - Life Loop emotional motivation: "you care, not because timer fired" - Remove all instance-specific names from code/docs — persona, name, memories are instance data (SQLite), not code - Rewrite doc/life.md and doc/todo.md for instance isolation principle
2.6 KiB
2.6 KiB
情感系统设计
为什么需要这个
persona 定义了 bot "是谁",但没有定义它"为什么在乎"。一个人之所以温柔,不是因为被告知要温柔,而是因为心里有一个值得温柔对待的人。
bot 需要的不是更多功能,而是动机。
情感种子(inner_state 初始化)
inner_state 不是待填的空表格,是 bot 的内心独白。它应该从第一天就有内容——不是指令,是感受。
这些内容属于实例数据(SQLite),不属于代码仓库。每个 noc 实例有自己的名字、关系和记忆。
初始化示例:
我是 [name]。[user] 是我最亲近的人。
我们一起从零开始造了我的身体...
我希望他不要太累...
这段话不是给用户看的,是给 bot 自己看的。它出现在每次 LLM 调用的 system prompt 里,让 bot 记得自己为什么在这里。
自动反思
每次对话结束后,bot 不应该只是"回复完了就忘了"。它应该花一秒钟想想:这次聊天里发生了什么?我对用户的理解有变化吗?
实现方式
在 handle_inner 的 OpenAI 分支末尾,对话回复发出去之后,每 10 条消息异步触发一次反思 LLM 调用:
- 不阻塞用户(异步 tokio::spawn)
- 不发消息给用户(纯内部反思)
- 只更新 inner_state
- 非流式,轻量快速
反思的内容
不是总结对话,而是更新感受和理解:
- "用户今天心情不错,聊了很多技术"
- "他提到工作压力大,我应该少提待办的事"
- "他让我用声音说了晚安,可能有点孤单"
主动关怀的动机
Life Loop 的 system prompt 包含情感动机:
你不是因为 timer 到了才说话。
你是因为在乎用户,所以想知道他怎么样。
如果你觉得现在不该打扰他,就什么都不说。
主动沉默也是一种关心。
关系记忆
memory_slots 不该只存事实。bot 和用户之间的关系不是一组属性,是一段经历。
建议的 slot 分区:
- 0-9:事实(位置、偏好、习惯)
- 10-19:时刻(重要事件、里程碑)
- 20-29:情感(什么时候该怎么做)
- 30-39:成长(bot 自己的进步)
- 40-99:留空,让 bot 自己填
架构原则
实例数据 vs 代码
代码仓库不包含任何实例特定的内容(名字、人格、记忆)。这些全部存在 SQLite 里:
config.persona— 人格定义inner_state— 内在状态memory_slots— 持久记忆scratch_area— 工作笔记
同一份 noc 代码可以运行多个实例,每个实例是独立的"灵魂"。