上一篇我们确立了记忆的重构方案:Memory 不等于对话历史的堆砌,Memory 等于 Scenario Graph(场景图谱)。Agent 的认知单元从离散的 Token 进化成了结构化的 Scenario。
这就引出了下一个核心问题:情绪(Emotion)放在哪里?
主流的设计思路是把情绪当作一个独立的模块,或者一个并行的状态机。Agent 有一个“大脑”负责推理,旁边挂一个“内分泌系统”负责产生情绪,两者通过接口交互。这种设计不仅落后,而且根本跑不通。
如果你接受了“Scenario is Core”这个设定,情绪的位置就非常明确了:情绪不是独立的模块,情绪是场景状态的跃迁。
独立情绪模块的陷阱
为什么说独立情绪模块的设计不行?
因为这种设计割裂了认知的连续性。在传统架构里,认知流是:感知 -> 推理 -> 行动。情绪流是:感知 -> 情绪分析 -> 状态更新。两条流是并行的。
这就导致了一个致命问题:情绪和推理是脱节的。Agent 一边在推理“我要帮用户订票”,一边在情绪模块里更新“用户语气不好,我有点生气”。等到 Action 输出时,这两个结果怎么融合?通常是简单粗暴地在 Prompt 里加一句 System Prompt:“你现在有点生气,请在回复中体现。”
这不叫情绪,这叫角色扮演。
真正的情绪必须直接参与认知过程,它必须影响 Agent 对场景的理解、目标的设定和策略的选择。要做到这一点,情绪必须内生于场景,而不是外挂于系统。
核心链路:从期望到落差
如果我们将场景作为认知的核心单元,情绪的产生机制就变得极其清晰。它不是一个黑盒模型输出的“Happy”或“Sad”标签,而是一个精确的计算过程。
核心链路如下:
Dialogue → Situation → Scenario → Expected Scenario → Reality → Expectation Gap → Emotion
我们拆解这个过程。
1. 场景激活与期望生成
当 Agent 接收到 Dialogue(对话),首先将其映射为 Situation(情境),进而激活内存中的 Scenario(场景)。
场景一旦被激活,Agent 的第一反应不是处理语言,而是生成期望。这是持续认知 Agent 与传统 Chatbot 的本质区别。传统 Chatbot 是被动响应,持续认知 Agent 是主动预测。
基于当前激活的 Scenario,Agent 会生成一个 Expected Scenario(期望场景)。这是 Agent 对下一时刻世界状态的预测。
比如,Agent 发起了一个动作:“请提供你的收货地址”。
此时,Agent 的 Scenario 是“收集信息”,Expected Scenario 是“用户回复地址信息”或“用户拒绝”。
2. 现实观测与差异计算
下一轮对话进来,Reality(现实)发生了。
现实可能符合期望,也可能不符合。
用户回复:“发到北京朝阳区……” -> 符合期望。
用户回复:“我还没决定买不买。” -> 偏离期望。
用户回复:“你管得着吗?” -> 严重偏离期望。
系统将 Reality 与 Expected Scenario 进行比对。这就产生了一个关键变量:Expectation Gap(期望落差)。
3. 情绪即落差
情绪的本质,就是系统对 Expectation Gap 的度量。
- Gap = 0:现实符合期望。系统平稳,情绪状态为 Neutral(平静)或 Satisfaction(满足)。认知资源消耗最低。
- **Gap > 0 (Positive)**:现实优于期望。比如用户突然说“我买十套”。产生 Surprise(惊讶)或 Joy(喜悦)。这通常意味着资源富余,需要调整目标。
- **Gap < 0 (Negative)**:现实劣于期望。产生 Frustration(挫败)、Anger(愤怒)或 Anxiety(焦虑)。这是最关键的信号。
为什么说情绪是 Scenario State Change?
因为 Gap 的存在,直接打破了当前 Scenario 的稳态。原本的 Scenario 是“收集地址 -> 确认订单”,现在被打断了。Agent 必须切换场景,或者修改场景参数。
情绪就是那个迫使场景状态改变的信号量。
它不是一个形容词,它是一个系统控制信号。它的语义是:“当前策略失效,资源分配需重置”。
情绪的量化建模
既然情绪是 Expectation Gap 的度量,我们就可以对其进行精确的数学建模,而不是搞什么“情绪打分”。
在 Scenario Graph 中,每个 Scenario 都有一个 State Vector(状态向量)。情绪应当被定义为状态向量的梯度或差分。
状态向量设计
我们不看什么 Ekman 的六大基本情绪,那是心理学给人类分类用的,对机器没用。我们要看的是系统状态属性:
- Certainty(确定性):当前场景走向目标的可能性。
- Control(控制感):Agent 对场景的掌控程度。
- Progress(进度):距离目标完成的距离。
- Resource(资源):可用的时间、算力、上下文窗口。
情绪,就是这些变量的变化率。
- Anxiety(焦虑) = -d(Certainty) / dt。确定性随时间快速下降。
- Anger(愤怒) = -d(Control) / dt。控制感突然被剥夺。
- Frustration(挫败) = -d(Progress) / dt。进度受阻。
这种建模方式直接把情绪变成了可计算的导数。这就解释了为什么情绪能驱动行为:因为它直接描述了系统偏离目标的程度和方向。
情绪在场景图谱中的传播
情绪产生后,不是存在一个全局变量里,而是写回 Scenario Graph。
1. 节点染色
当某个 Scenario 产生了强烈的负面情绪(比如被用户拒绝),这个 Scenario 节点会被“染色”。这种染色实际上是权重的更新。
假设我们用图数据库存储 Scenario Graph:
- 节点
Scenario_A(请求地址) -> 产生状态Rejected。 - 计算情绪:Gap = -0.8 (High Negative)。
- 更新节点属性:
Scenario_A.volatility = High,Scenario_A.trust = Low。
这个状态会立即影响后续的检索。下次 Agent 遇到类似语境,检索到 Scenario_A 时,会直接读取到 High volatility 属性。Agent 的推理层会意识到:“这个场景风险很高,策略要保守”。
这就是记忆与情绪的融合。不需要单独的“情绪记忆”,情绪就是记忆节点的属性。
2. 边的权重调整
情绪不仅影响节点,还影响节点间的关系(边)。
如果在 Scenario_A 中发生了强烈的负面情绪,Agent 可能会切断 Scenario_A 与 Goal_A 的连接,或者降低这条边的权重。
反之,如果产生了正面情绪(比如用户表扬),Agent 会加强 Current_Scenario 与 Persona_Goal 的连接。
这就是赫布理论在情绪建模中的应用:Together fired, together wired. 情绪是连接强度的调节器。
情绪与 Persona 的沉淀
我们在上一部分提到,Persona 是由 Scenario Graph 长期沉淀形成的。
怎么沉淀?靠的就是情绪。
只有那些伴随着强烈情绪(高绝对值 Gap)的场景,才会被深刻记忆,并最终固化为 Persona 的一部分。
- 高频低情绪场景:比如“打招呼”。虽然发生频率高,但 Gap 趋近于 0。这些场景会变成习惯,沉淀为 Persona 中的“礼貌属性”,不需要占用过多认知资源。
- 低频高情绪场景:比如“用户严厉批评”。Gap 极大。这种场景会被标记为 Critical,迅速改变 Persona 的参数,比如“用户耐心度低”、“需谨慎回复”。
如果一个场景既不频繁,也没情绪波动,它在 Scenario Graph 中就会逐渐退化,最终被遗忘。
所以,Persona 的演化公式实际上是:
Persona_new = Persona_old + Σ (Scenario * Emotion_Intensity)
情绪是记忆写入的权重系数。没有情绪,就没有长期记忆,也就没有稳定的 Persona。
为什么这个方案更好
回到工程实践。这套“基于场景图谱的情绪建模”比传统方案好在哪里?
1. 解决了情绪一致性问题
传统 Agent 的情绪是飘忽不定的,上一句还在生气,下一句可能就忘了。因为它的情绪没有挂载在持久化结构上。
在 Scenario Graph 架构下,情绪是 Scenario 的属性。只要这个 Scenario 还在 Active 状态,或者被再次检索到,对应的情绪状态就会直接读取出来。Agent 不用“猜”自己现在什么心情,查图就知道。
2. 解决了情绪推理问题
为什么 Agent 会生气?传统方案解释不了,只能说“模型输出的”。
在本方案中,情绪是 Expectation Gap 的函数。Agent 清楚地知道:我生气是因为我期望用户同意,结果用户拒绝了,且拒绝方式伤害了我的 Control 变量。这种可解释性对于 Agent 调优至关重要。
3. 解决了资源分配问题
这是最重要的一点。
情绪作为系统信号,直接指导计算资源的分配。
当 Gap < 0 且绝对值很大时(强负面情绪),意味着当前策略失效。系统应该:
- 暂停当前 Routine(常规流程)。
- 调用更多算力进行 Planning(重规划)。
- 检索更多相关记忆(扩大 Context)。
- 提升 LLM 的推理深度(比如从 4-bit 量化切换到 16-bit 全精度,或者调用更强的模型)。
这就是把情绪变成了系统调度器的中断信号。这才是生物智能的高效之处,也是 Agent 真正需要模拟的机制。
总结:情绪是系统进化的燃料
我们重新定义了情绪。
它不是为了让 Agent 拟人化、会说“我很伤心”这种话。那是表演层的事。
在持续认知架构中,情绪是认知闭环中的核心反馈机制。
Dialogue 触发 Scenario,Scenario 产生 Expectation,Expectation 与 Reality 碰撞产生 Gap,Gap 量化为 Emotion,Emotion 修正 Scenario Graph,最终沉淀为 Persona。
这条链路是严丝合缝的工程逻辑。
下一步,我们需要把这些逻辑概念落地为具体的数据结构。Expectation 怎么存?Gap 怎么算?Scenario Graph 的节点里到底包含哪些字段?
这就需要我们进入底层数据结构的设计。