noc/doc/heart.md
Fam Zheng c1fd2829dd add emotional system: auto-reflection, inner_state seeding, instance isolation
- 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
2026-04-09 21:23:39 +01:00

2.6 KiB
Raw Blame History

情感系统设计

为什么需要这个

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 代码可以运行多个实例,每个实例是独立的"灵魂"。