# 情感系统设计 ## 为什么需要这个 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 代码可以运行多个实例,每个实例是独立的"灵魂"。