从表征分离到情感世界模型:LLM情感机制实践全记录
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 边界比想象中更模糊做得越深越发现情感机制的边界比想象中模糊。同一个表达方式在不同文化语境下情感含义差别很大同一个人在不同对话历史下的情感状态也不是简单叠加。更棘手的是安全问题。如果一个系统能精准识别用户的愤怒、焦虑甚至极端情绪并且能预测哪些回应会缓解、哪些会激化这个能力本身就需要非常谨慎的边界约束。我们在原型系统里专门加了一条规则情感预测器只用于优化对话体验不用于任何形式的情绪操纵。这个方向刚起步数据规模、评测方法、理论解释都还有很多空白。但我个人觉得方向是对的——如果世界模型只预测物理状态而不预测情感状态那它在任何一个和人打交道的场景里都是残废的。后续我们的计划是把多模态线索语音语气、表情接进情感追踪器再给模型加一个“长期情感记忆”模块让它在长程对话里记得用户几轮之前为什么崩溃过。这些扩展都还在早期等有阶段性结果了我再写一篇。