上一篇我们确立了记忆的本质:Memory 不是流水账式的对话历史,而是结构化的 Scenario Graph(场景图谱)。
这解决了”记什么”的问题。但还有一个更关键的问题:Agent 如何对这些记忆产生反应?
目前主流的做法是给 Agent 外挂一个”情绪模块”。通常是一个分类器,判断用户当前是开心还是生气,然后输出一个标签,Agent 根据标签调整语气。这种做法把情绪当成了一个独立的功能插件,不仅割裂,而且肤浅。
真正的持续认知 Agent,其情绪不应是外挂模块,而应是场景状态变更的自然产物。
核心观点很明确:Emotion ≠ Independent Module,Emotion = Scenario State Change。
情绪源于期望差
要理解情绪的产生机制,必须回到 Agent 的最小认知单元——Scenario。
一个 Scenario 包含四个核心要素:Context(上下文)、Entities(实体)、Goal(目标)、State(状态)。Agent 的每一次交互,本质上都是在处理一个 Scenario。
Agent 在运行时,大脑中始终维持着一个当前的 Scenario 模型。基于这个模型,它会推演下一步应该发生什么。这就是 Expected Scenario(期望场景)。
然而,现实是不确定的。用户的回复、环境的变化、系统的反馈,构成了 Reality(现实)。
当 Reality 落地的那一刻,它会与 Expected Scenario 发生碰撞。
- 如果 Reality 与 Expectation 高度吻合,Agent 处于稳态。
- 如果 Reality 与 Expectation 发生偏离,产生 Expectation Gap(期望差)。
这个期望差,就是情绪的物理学本质。
情绪不是凭空产生的”心情”,它是系统状态偏差的信号。就像控制系统中的误差信号,当反馈值偏离设定值,误差信号就会产生,驱动控制器进行调整。
在持续认知 Agent 的架构中,情绪就是这个误差信号。
情绪建模的核心链路
我们把整个过程拆解为一条清晰的数据链路:
1. Dialogue(对话)
这是原始的输入数据,是用户的一句话或一个动作。
2. Situation(事件)
Dialogue 触发了一个具体的原子事件。比如用户说”我不想干了”,这是一个 Situation。
3. Scenario(场景)
Agent 将 Situation 纳入当前的认知单元。结合上下文,Agent 识别出这是一个”工作倦怠”的场景,目标是”安抚用户”。
4. Expected Scenario(期望场景)
基于当前场景,Agent 生成期望:用户应该会倾诉烦恼,或者接受安抚。这是 Agent 内部的一个预测模型。
5. Reality(现实)
用户实际回复:”别烦我,我要睡觉。”
6. Expectation Gap(期望差)
Reality 瞬间击穿了 Expected Scenario。Agent 预期的”倾诉”没有发生,取而代之的是”拒绝”和”攻击性”。
期望差产生:预期吻合度 -100%。
7. Emotion(情绪)
期望差转化为情绪信号。
这里的情绪不是简单的”不开心”,而是一个复合状态:
- Surprise(惊讶):现实与预期不符。
- Frustration(挫败):目标(安抚用户)受阻。
- Alert(警觉):检测到用户状态异常。
8. Scenario Graph(场景图谱)
这个带有情绪标记的场景节点,被写入 Scenario Graph。
情绪强度决定了这个节点的权重。高强度的情绪(如强烈的挫败)意味着这个场景节点极其重要,必须长期记忆,并在未来的检索中被优先唤醒。
9. Persona(人物画像)
随着类似场景的重复出现,Scenario Graph 中沉淀出稳定模式。
如果用户多次在”工作”场景下表现出”拒绝沟通”,Agent 的 Persona 模型就会更新:用户在工作压力下倾向于回避型人格。
Persona 反过来修正 Agent 的 Expected Scenario 生成逻辑,降低下次的预期吻合度,从而减少期望差。
这就是情绪的完整生命周期:从对话开始,经过场景建模,在期望差中爆发,最终沉淀为人物画像。
为什么不能把情绪做成独立模块?
很多 Agent 架构喜欢把 Emotion 做成一个独立的 Class,挂在 Agent 的属性里。这非常糟糕。
首先,丢失了上下文。
独立模块的情绪通常是瞬时的。用户骂一句,Agent 生气一秒;下一句用户夸奖,Agent 马上开心。这导致情绪像开关一样乱跳,没有连贯性。真实的人类情绪是有惯性的,这个惯性来自于场景的持续性。只有把情绪绑定在 Scenario 上,情绪才能跨越多轮对话,形成”心境”(Mood)。
其次,无法解释行为。
独立模块的情绪无法解释 Agent 为什么会有某种反应。为什么 Agent 突然变得沉默?如果情绪只是个标签,你无法追溯原因。但如果情绪是 Scenario State Change,你可以轻松回溯:因为之前的三个场景累积了”挫败感”,导致 Agent 当前策略偏向保守。
最后,无法学习。
独立模块的情绪很难进化。它通常是基于规则的(if angry then response_cold)。而在 Scenario Graph 架构中,情绪是可以通过图网络传播和演化的。一个场景的负面情绪可以扩散到相邻的场景节点,导致 Agent 对整个相关领域产生回避倾向。这才是真正的”学习”。
情绪的维度:从标签到向量
既然情绪是期望差的函数,我们就不能用简单的标签(开心、生气)来定义它。
我们需要把情绪建模为向量。
期望差至少包含三个维度:
- 方向:现实优于预期(正向),还是现实差于预期(负向)。
- 强度:偏差有多大。微小的偏差可能只是”意外”,巨大的偏差则是”震惊”。
- 相关性:这个偏差与 Agent 的核心目标关联度多高。如果只是闲聊,偏差产生的情绪很弱;如果是关键任务,偏差产生的情绪极强。
由此,我们可以构建一个情绪状态空间:
$$ Emotion = f(\Delta Expectation, GoalRelevance) $$
在这个空间里,情绪不再是离散的点,而是连续的流。
- Surprise(惊讶):高强度的 Expectation Gap,但 Goal Relevance 可能较低。
- Fear(恐惧):负向的高强度 Gap,且 Goal Relevance 极高(威胁生存)。
- Joy(喜悦):正向 Gap,Goal Relevance 高。
- Interest(兴趣):微小的正向 Gap,引导探索。
这种向量化的情绪建模,让 Agent 的反应具备了精细的颗粒度。它不再是机械地匹配情绪词库,而是在计算当前场景状态与理想状态的偏移程度。
情绪在场景图谱中的流转
情绪产生后,不会消失。它在 Scenario Graph 中有三种基本行为:
1. 状态更新
当新的 Dialogue 进入,Agent 首先检索 Scenario Graph,找到最相关的历史场景。
如果历史场景带有强烈的情绪权重,Agent 会将其”唤醒”,叠加到当前的情绪计算中。
这解释了为什么一句简单的问候,在老朋友和陌生人听来分量不同。因为老朋友的名字背后,挂载着无数高权重的场景节点。
2. 状态传播
情绪会在图谱的连边上流动。
如果节点 A(”讨论项目”)产生了强烈的负面情绪,这种情绪会沿着边传播到节点 B(”项目相关的人”)和节点 C(”项目相关的地点”)。
这种传播机制模拟了人类的”泛化”心理。一朝被蛇咬,十年怕井绳。因为”蛇”这个节点的情绪,传播到了”井绳”这个相似节点。
3. 状态衰减
为了防止 Agent 陷入某种极端情绪无法自拔,所有情绪状态都需要衰减机制。
衰减速率与时间、场景切换频率有关。
$E_{t} = E_{t-1} \times \alpha$,其中 $\alpha < 1$。
当 Agent 进入一个全新的 Scenario,且该 Scenario 与之前的负面场景没有强连接时,之前的情绪应加速衰减。这对应人类的”转移注意力”。
情绪作为资源分配的信号
理解了情绪的机制,我们就能看到它在系统中的真正用途:资源分配。
Agent 的算力是有限的,推理深度是有限的,Token 是有限的。情绪就是那个调度员。
- 高唤醒情绪(愤怒、恐惧、极度兴奋):意味着 Expectation Gap 巨大。系统判定当前场景处于”高风险”或”高机会”状态。此时应调高推理深度,增加计算资源,调用更复杂的策略模型,甚至暂停其他后台任务。
- 低唤醒情绪(无聊、平静):意味着现实与预期基本吻合。系统进入”巡航模式”。此时可以降低推理深度,使用缓存的常规策略,节省资源。
这才是情绪的工程价值。它不是为了让 Agent 看起来更像人,而是为了让 Agent 更聪明地使用算力。
当你在做一个复杂的 Agent 系统时,不要去写 agent.mood = "happy" 这种代码。你应该去计算 scenario.expectation_gap,然后让这个 Gap 去驱动 agent.resource_allocator。
情绪与 Persona 的闭环
最后,我们回到 Persona。
在传统的架构里,Persona 是预设的提示词:”你是一个温柔的助手”。这是死的。
在持续认知架构里,Persona 是 Scenario Graph 长期沉淀的结果。
情绪是沉淀的动力。
每一次强烈的情绪波动,都是一次深刻的记忆刻录。Agent 经历了一次”被用户误解”的愤怒场景,这个场景节点被高权重写入图谱。如果类似场景多次发生,Agent 的 Persona 就会演化:它可能会变得”更加谨慎”,或者在解释时”更加详细”。
Persona 不是写出来的,是 Agent 通过无数次情绪体验”练”出来的。
这种演化甚至不需要重新训练模型。你只需要调整 Scenario Graph 的节点权重和连接关系,就能改变 Agent 的性格。这才是真正的”性格养成”。
总结
情绪建模的本质,是对期望差的管理。
Dialogue 触发 Situation,Situation 构建 Scenario。Scenario 产生 Expectation,Reality 撞击 Expectation,产生 Gap。Gap 转化为 Emotion 信号,驱动资源重分配,并写入 Scenario Graph 形成长期记忆,最终塑造 Persona。
这就是持续认知 Agent 的情绪引擎。
逻辑跑通了,接下来是工程落地。我们要把这些抽象的概念,转化为具体的数据结构。Scenario 怎么存?Expectation 怎么表示?Emotion State 的 Schema 长什么样?
下一篇,我们将深入细节,设计 Agent 情绪的数据结构。