☰
从表征分离到情感世界模型:LLM情感机制实践全记录
2026/10/21 13:55:43 网站建设 项目流程

1. 为什么2025年要谈“LLM里的情感机制”

1.1 一个被主流叙事掩盖的事实

2025年了,大语言模型圈的讨论基本被几件事占满:上下文长度突破百万级、推理时扩展算力、多模态融合、智能体编排。大家都在比谁的模型更能“想清楚”,却很少有人认真问一个问题:模型在跟你说话的时候,它到底“感觉到”了什么?

我并不是在写科幻。过去一年,我在做一个模拟项目X,目标是把开源对话模型改造成面向长程陪伴场景的助手。训着训着就发现一个很有意思的现象:同样一个模型,在同样的安全对齐条件下,面对“用户连续三次说‘我好烦’”这种输入,它会稳定地表现出某种倾向——有的模型倾向多给建议,有的模型倾向先安抚情绪,还有的模型甚至会带一点不耐烦的措辞。这种倾向在多次重复实验里是可复现的。

这说明什么?说明大语言模型内部并不是一个纯粹的“词元预测器”,它的行为里存在某种可以被观测、被度量、甚至被定向操纵的情感相关机制。这个机制不是谁刻意训出来的,更像是海量语料和人类反馈共同作用下涌现出的一种副产品。

顺着这条线,我和某高校课题组的几位同学做了一整套探索:先证明LLM内部存在可分离的情感表征,再构建一套“情感—原因—方式”三元组数据集,最后把一个带情感模块的世界模型原型跑了起来。

这篇文章就是这份探索的完整笔记。如果你也在做大模型应用、对话系统或者智能体,这篇文章会给你一个很少有人系统讲过的视角:情感机制如何识别、如何分离、如何数据化、如何接进系统。

1.2 一个容易被忽视的问题:情感不是“prompt能解决的事”

大部分团队处理模型“情绪”的方式很简单:在system prompt里写“请表现得有同理心”。实测下来,这种做法的效果非常不稳定。同一个prompt,换个模型、换个温度参数,输出的情感浓度就差很多。

原因在于:prompt只是在文本层面对模型做了约束,而情感在模型内部是以表征形式存在的。如果表征层面上根本没有结构化的情感方向,你写一万遍“请共情”也没用,模型只能靠模仿训练数据里“看起来像共情”的句式来应付。

所以说,真正要动刀的地方,是表征空间。

我后面会用一个具体实验说明这件事:在某个开源模型的中间层表征上加一个线性探针,情感类别的可分性高得惊人。这个发现是整个项目的地基,也是“情感分离”能够成立的前提。

2. 从“识别情绪”到“分离情感”:表征层面的机制拆解

2.1 情感识别只是起点

传统情感识别任务,不管是用分类模型还是用prompt标注,本质都是给一段文本打个离散标签:愤怒、喜悦、悲伤、中性。这种做法的天花板很明显——标签是离散的,但情感是连续的,而且情感信息在模型内部根本不以“标签”的形式存在。

想想看,一个7B模型在推理“今天被领导骂了”这句话时,内部激活的是一整套与情境理解、自我投射、语言风格选择相关的复杂模式。这个模式里肯定包含“负面情绪”的成分,但你要问它在哪个神经元上,答案是没有。

这也是为什么我坚持用“表征级情感分离”而不是“分类级情感识别”作为主路径。分类只能告诉你“是什么”,分离才能告诉你“在哪”以及“能不能拆出来”和“能不能重新装回去”。

2.2 情感方向与隐空间里的“可分离性质”

这里分享一个可以被复现的实验。

我们取某个开源对话模型,固定一个中间层(大概在层深的60%位置),对输入句子跑一次前向传播,拿到该层每个token的hidden state,然后做序列维度的均值池化,得到一个句子级向量。接下来构造二分类任务:愤怒 vs 非愤怒、喜悦 vs 非喜悦等。用这些句子级向量去训练一个线性逻辑回归探针。

结果如下表所示:

情感类别探针准确率随机基线样本数
愤怒0.910.504200
喜悦0.880.503900
悲伤0.850.503600
焦虑0.820.503100

注意,这个准确率是用线性探针跑出来的。线性可分意味着什么?意味着情感的“方向”在这个表征空间里是几何上被拉伸开的。如果情感信息复杂到需要非线性决策边界才能分开,探针准确率不会这么高,而且后续的编辑操作也不可能成功。

既然每个情感类别都对应一个可分的区域,那自然可以算一个“情感方向”出来——把某类样本的平均表征向量减去全体样本的平均表征向量,差向量就是该类情感的“方向”。

有了方向,就能做操作:把“中性”句子的表征朝着“喜悦”方向平移,生成结果的情绪就变了。我们在实验里做了最直观的验证:随机抽了50条中性指令,用激活编辑把表征加上“喜悦方向”再喂给生成层,有42条被评测人员判断为“明显更积极”。反向做“愤怒方向”的平移,有38条被判断为“明显更消极”。

这一步做完,我基本确认了一件事:LLM里的情感机制不是比喻,而是可以在几何层面被分离和重新注入的工程对象。

2.3 分离之后还能拿来干什么

如果你觉得“分离情感”只是学术自嗨,那就想简单了。分离意味着可控,可控意味着可以做产品。

举两个已经落到我们原型里的例子:

  • 客服场景:用户反复抱怨时,模型在内部表征上先做一个“愤怒方向检测”,一旦激活强度过高,生成层就压低“愤怒响应方向”的权重,同时拉高“耐心解释方向”,让输出在情绪上降级而不是升级。
  • 教育场景:学生在同一个问题上卡住三次,模型检测到“挫败感方向”激活,自动切换成更简短、更鼓励式的表达风格,而不是继续长篇大论讲原理。

这个思路的本质是把情感当作和“时态”“人称”类似的句法语义属性来处理:先识别,再分离,再控制,最后按需注入。它不需要重新训练模型,只改推理时的表征方向,成本很低。

需要强调的是,这里做的所有操作都发生在模型内部表征上,不是改prompt、不是改输出后处理规则,所以它对模型行为的改变是“内生”的,而不是“表面”的。

3. 情感—原因—方式数据集:把“情绪标签”升级成“情感因果”

3.1 三元组结构设计的动机

如果只做情感分离,上面那套表征方法就够了。但要把情感机制接进世界模型,光有“情绪类别”完全不够。

原因很简单:世界模型要预测的是“下一步会发生什么”。如果模型只知道用户现在很生气,不知道他为什么生气,也不知道什么回应方式能让事态缓和,那这个预测就是瞎猜。

所以我们在设计数据集时,直接抛弃了“文本→标签”的扁平结构,换成“情感—原因—方式”三元组。

三个字段的定义如下:

  • 情感:包含类别(愤怒、悲伤、喜悦、焦虑等)和强度(1到5的连续值)。
  • 原因:触发该情感的事件、条件或内部信念。要求可追溯到对话中的具体证据。
  • 方式:在该情感状态下,个体可能采取的表达方式、行为倾向或期望的调节策略。

举个例子:用户说“我改了三个版本方案,客户还是说不行”。

  • 情感:愤怒+ 挫败,强度4。
  • 原因:反复修改但被否定,感觉到努力没有回报,同时隐含“客户需求不明确”的归因。
  • 方式:用户可能继续抱怨细节,也可能用反问句表达不满,比如“这到底要改成什么样才算行”。期望的疏导策略是“先共情,再给确定性的下一步动作”。

三元组结构的价值在于:它让情感从“一个静态状态”变成了“一条因果关系链”。有了这条链,模型才能回答“用户下一步情绪会怎样变化”以及“我该怎么做才能改变这个走向”。

3.2 数据生产的四步流程

这套数据集我们前后做了三轮迭代,最终稳定下来的生产流程分四步:

第一步,原始语料收集。来源覆盖客服对话记录、公开论坛长帖、故事类文本、日常对话模拟数据。为了保证场景覆盖率,我们刻意控制了不同来源的比例:客服类占35%,论坛类占30%,故事类占20%,其余为合成对话。

第二步,候选三元组生成。用强模型把原始语料批量标注成“情感—原因—方式”候选。这里的关键是给模型明确的抽取规则,尤其是“原因必须引用原文证据”,防止模型靠常识脑补。

第三步,人工质检与修正。质检人员按照下面这份checklist逐条检查:

  • 情感类别是否与文本语气一致。
  • 情感强度是否在合理区间(不能所有负面情绪都标5)。
  • 原因是否能在原文中找到对应片段。
  • 方式描述是否具体,避免“用户会很生气”这种废话。
  • 是否存在同一事件被拆成多个互相矛盾的三元组。

第四步,冲突消解与合并。把同一话题下重复出现的三元组做聚类,保留信息量最大的一条,把其他条目的补充信息合并进去。这一步对数据质量影响极大,因为原始语料里用户往往反复抱怨同一件事,如果不合并,模型会被高频重复数据带偏。

三轮迭代后,数据集规模稳定在约5万条高质量三元组,覆盖情感类别12种,场景类型30余种。

3.3 标注质量管理的三个坑

写这段是因为我们真的在这上面损失过大量时间,零零散散踩了不少坑,最典型的有三个。

坑一:情感强度的标注不一致。同一个“用户语气略带抱怨”的片段,一个标注员标2,另一个标4。后来我们把强度标准量化成行为锚点:1表示“中性提及”,3表示“有明显情绪词”,5表示“情绪化表达,有夸张或重复”。锚点一上,标注员之间的一致性才从0.61提升到0.84。

坑二:原因抽取颗粒度不统一。有的标注员把原因写成“用户提出了修改要求”,有的写成“客户在三天内连续改了两次需求”,后者明显粒度更细。我们后来规定原因字段必须包含“主体动作+结果反馈”两个部分,例如“用户提交方案后被拒绝”而不是“用户被拒绝”。

坑三:方式字段容易变成“正确的废话”。很多标注员会写“需要安抚情绪”“应该提供帮助”这种毫无信息的描述。纠正方式是要求方式字段必须可操作化,至少要具体到“使用疑问句表达不满”“倾向于用讽刺语气”“期望得到明确的时间节点承诺”这个级别。

另外还要提一句文化差异问题。中文语料里大量存在“客气地表达不满”的现象——表面措辞非常礼貌,但深层情绪是愤怒或失望。我们专门给这类样本设计了“表层情感/深层情感”双通道标注,虽然在数据上增加了成本,但对后面世界模型的效果提升非常明显。

4. 大型情感世界模型:从架构设想到可运行的最小系统

4.1 世界模型到底在预测什么

“世界模型”这个词大家应该不陌生了,核心思想是让模型对环境建立一个内部动态模型,能预测在当前状态下采取某个动作之后,环境会转移到什么状态。

常规世界模型预测的是物理状态和任务状态:物体在哪、门开没开、下一步移动到哪里。但对话系统里的“世界”不是物理世界,而是对话双方的认知与情感状态。

所以我们在做的“情感世界模型”要预测的核心变量是:在当前对话状态下,如果系统采用候选回应方式A,用户的情感状态会怎样转移——是缓和、维持、还是升级?

这比单纯“预测下一个词”复杂得多。它要求模型同时理解三个层次的信息:

  • 当前用户的情感状态和强度。
  • 导致这个情感状态的原因。
  • 不同类型回应方式对情感状态的转移概率。

我们原型系统的核心结构和模块划分如下:

模块职责输入/输出
情境编码器将多轮对话历史编码为情境向量输入:对话token序列;输出:情境表示
情感状态追踪器维护用户情感状态估计输入:当前轮文本+历史状态;输出:情感类别、强度、原因片段
回应方式生成器生成候选回应动作输入:情境向量+情感状态;输出:N种候选回应方式
情感转移预测器预测每种回应方式导致的情感转移输入:当前情感状态+候选方式;输出:转移概率与最终情感状态
策略选择器在候选方式中做选择输入:转移预测结果+任务目标;输出:最终回应

4.2 情感机制怎么“接”进LLM

架构设计完了,落地是最棘手的部分。我们选择的做法不是重新训练一个大模型,而是在现有开源LLM外面套一层“情感控制环”。

第一层:情感状态向量注入。把情感追踪器输出的情感状态编码成向量,通过一个轻量adapter模块注入到LLM的decoder层。这样LLM生成时能感知“当前用户处于什么情绪状态”,而不是只看上一句文本。

第二层:表征方向约束。生成每个token之前,计算当前部分输出的表征在“不耐烦方向”上的激活强度,如果超过阈值,就往“耐心方向”平移一段距离,再继续生成。这就是前面说的情感分离的工程化应用。

第三层:外部预测校准。LLM生成完一轮回应后,情感转移预测器立刻评估一个分数:这个回应让用户情绪恶化的概率有多大。如果超过预设阈值,策略选择器会否决当前方案,让模型换一种回应方式重试。

这个三层结构的好处是解耦:情感追踪、策略选择、生成控制可以独立调优。坏处是延迟增加了。实测下来,每轮对话增加约120毫秒的推理开销,考虑到情感世界模型本来就不是高频交易那种低延迟场景,这个成本可以接受。

我们跑下来的基线数据是这样:加了情感控制环之后,模拟对话中用户自报“感到被理解”的比例从基准LLM的37%提升到61%,而“情绪升级导致对话中断”的比例从14%降到8%。

4.3 训练与评估:不能只看困惑度

把数据集做出来之后,最直观的做法是拿三元组去finetune LLM。但这里有个大坑:标准语言模型训练的损失函数是下一个词预测损失,它根本不关心模型有没有学到情感转移逻辑。

一个模型可能把“愤怒→安抚回应→情绪缓和”这个序列背得滚瓜烂熟,但你换个场景、换个表达方式,它就露馅了。原因在于它学到的是“文本关联”,不是“因果机制”。

所以我们设计了一套分层的评估方案:

  • 第一层:情感转移符合率。给定对话前序和候选回应,模型预测的用户情感状态变化是否和人工标注一致。这个指标直接检验世界模型的核心能力。
  • 第二层:原因覆盖度。检查模型生成回应时,是否覆盖了对话中真实存在的情感触发原因,覆盖越多说明模型越不是只做表面应对。
  • 第三层:生成自然度。请评测人员以盲打分方式评估回应是否像人话,防止为了控情绪把话说得僵硬。
  • 第四层:任务完成度。在客服场景下看问题是否被解决,在陪伴场景下看用户是否愿意继续对话。

这一套跑下来才算是有效评估。如果你只盯着困惑度或者BLEU,很容易得到一个“损失很低但实际交互很蠢”的模型。

5. 实测记录:跑通这个系统需要躲开的五个大坑

5.1 数据增强把情感标签洗掉了

第一次做数据集的时候,我们图省事,对原始语料做了回译增强——把中文翻译成英文再翻译回中文,想增加语言多样性。结果质检的时候发现一个大问题:回译之后,原句里“带着讽刺的夸奖”全部变成了“字面意义的夸奖”。

“你可真厉害了,这种方案也敢提”回译一遍变成“你真厉害,这种方案都能提出来”,情感从讽刺直接翻成真诚夸奖,三元组的“情感”字段就废了。

这个坑告诉我们:情感是高度依赖措辞细节的现象,任何基于词面变换的数据增强都可能把它破坏掉。后来我们放弃回译,改为从不同场景源收集原始语料来增加多样性。

5.2 情感分离变成情感打架

做表征方向编辑的时候,第一次实验很顺利,单个情感方向平移效果很好。但当我们同时压制“愤怒”和“焦虑”两个方向时,生成的文本变得很奇怪——一种既不像愤怒又不像焦虑的混合腔调,评测员都看不下去。

原因后来排查清楚了:不同情感方向在表征空间里不是正交的,相关性高了之后,同时编辑会互相干扰。解决办法是先对方向做正交化,把“愤怒方向”中与“焦虑方向”重叠的分量先剥掉,再进行多方向编辑。

正交化之后,同时控制两个或三个情感方向的效果明显改善,生成文本的情绪指向也清晰了。

5.3 评测指标失灵

第一次做效果评估时,我们满怀信心地用了情绪分类器来自动评测生成文本的情感强度。结果发现分类器判断“情绪缓和”的比例很高,但人工评测员给出的评价却不高。

仔细一看才发现原因:模型学了一种“伪缓和”策略——回应里大量使用“我理解你的感受”“确实不容易”这类万能安抚句,看起来情绪很温和,但根本没有提供任何实质性帮助。用户嘴上不说,实际上对这种空话式回应非常反感。

后来我们给评测加了一条硬规则:如果回应包含安抚性语句但没有任何信息增益,人工评测直接扣分。模型的策略才从“说好听的”转向“说有用的”。

5.4 “伪情感”问题:模型到底懂不懂

这里有一个绕不开的哲学问题,但我们用工程方式处理了。模型生成“我理解你”时的内部状态和真实的人类共情显然不是一回事。在测试中我们确实观测到,模型可以在表征层面做出“共情方向”的激活,但后续决策完全不受影响——说一套做一套。

所以“情感世界模型”这个叫法,强调的是“预测情感转移并据此调整决策”,而不是“模型真的感受到了情感”。我们评价模型的唯一标准是:它有没有利用情感信息做出更好的选择。这和人类有没有真的感同身受是两个问题。

工程上,我们通过在策略选择器里强制绑定情感预测结果来缓解“伪情感”现象:只有回应方式确实改变了情感转移预测分数,才会被选中。如果模型只是口头共情但预测显示用户情绪不变,策略选择器会自动否决该回应。

5.5 边界比想象中更模糊

做得越深越发现,情感机制的边界比想象中模糊。同一个表达方式在不同文化语境下情感含义差别很大;同一个人在不同对话历史下的情感状态也不是简单叠加。

更棘手的是安全问题。如果一个系统能精准识别用户的愤怒、焦虑甚至极端情绪,并且能预测哪些回应会缓解、哪些会激化,这个能力本身就需要非常谨慎的边界约束。我们在原型系统里专门加了一条规则:情感预测器只用于优化对话体验,不用于任何形式的情绪操纵。

这个方向刚起步,数据规模、评测方法、理论解释都还有很多空白。但我个人觉得方向是对的——如果世界模型只预测物理状态而不预测情感状态,那它在任何一个和人打交道的场景里都是残废的。后续我们的计划是把多模态线索(语音语气、表情)接进情感追踪器,再给模型加一个“长期情感记忆”模块,让它在长程对话里记得用户几轮之前为什么崩溃过。这些扩展都还在早期,等有阶段性结果了我再写一篇。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询