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