【Deep Emotional Memory】情绪增强编码在RAG Agent记忆系统中的应用研
.引言
检索增强生成系统——RAG系统已成为构建长期对话Agent的主流架构。然而,现有RAG系统的记忆编码遵循“统一化”原则——所有对话片段经由同一个嵌入模型映射为等长向量,无论其情绪强度如何。这种“扁平编码”忽视了认知科学中的一个基本事实:情绪唤醒事件在人类记忆系统中享有编码优先级。情绪增强记忆效应(EEM)表明,高唤醒事件触发杏仁核-海马体协同信号,实现更深度的记忆编码与更持久的巩固(Cahill & McGaugh, 1995; McGaugh, 2004)。近年来,Emotional RAG(Huang et al., 2024)将情绪引入检索阶段,LUFY(2025)将情绪唤醒度作为记忆重要性的指标之一,但情绪对编码阶段的影响尚未被系统性探索——高情绪记忆是否应在编码时就获得更深度的表示,仍然是一个开放问题。
本文将EEM理论应用于RAG系统的编码阶段,提出情绪驱动的深度编码机制:当用户输入的情绪唤醒度超过阈值时,系统执行多维信息提取——除事实外,同步捕获用户的深层动机、语境线索及Agent的回应策略,将单维的“原话记录”转化为四维的“事件描述”。我们在EmpatheticDialogues多轮对话数据集上评估该机制,结果表明:深度编码使Agent的共情力提升4.0%,生动度呈现一致提升趋势。本实验将EEM效应可计算化地引入RAG编码阶段,尝试研究“情绪影响编码”这一设想。
R-C
回到顶部
二.基本原理
本实验整体框架分为三个核心步骤:情绪分类、编码决策、向量存储与检索。
本系统的核心任务是替换 RAG 的编码模块,其余部分保持不变,以隔离深度编码的独立贡献。
deepseek_mermaid_20260715_00c48f
2.2情绪分类
2.2.1分类维度
我们使用 deepseek-v4-flash对每条用户输入进行情绪分类。分类器输出三个维度:
维度 符号 范围 含义
效价 valence -1~1 情绪的积极或消极程度。1=极度积极,-1=极度消极,0=中性
唤醒度 arousal 0~1 情绪的生理激活强度。0=极度平静,1=极度兴奋、紧张和愤怒等情绪
情绪标签 label 枚举 joy, sadness, anger, fear, surprise, love, neutral 之一
EEM效应由唤醒度驱动。杏仁核对唤醒度敏感,而非效价——无论是狂喜还是暴怒,只要是高唤醒状态,都会触发杏仁核-海马体的增强编码信号。因此我们以 arousal 作为编码决策的依据,valence仅作为情绪的积极或消极程度的参考依据。
2.2.2分类提示词
情绪分类使用以下 Prompt:
python
系统提示:
你是情绪分析专家,只输出JSON。
用户提示:
分析以下用户消息的情绪,只输出JSON格式:
{
“valence”: 浮点数,范围-1到1(-1极度消极,0中性,1极度积极),
“arousal”: 浮点数,范围0到1(0极度平静,1极度兴奋/紧张/愤怒),
“label”: 字符串,从 joy|sadness|anger|fear|surprise|love|neutral 中选择
}
用户消息: {text}
2.2.3实现代码
查看代码
python
import re
def classify_emotion(text: str) -> Dict[str, Any]:
prompt = f"““分析以下用户消息的情绪,只输出JSON:
{{“valence”: -1~1, “arousal”: 0~1, “label”: “joy|sadness|anger|fear|surprise|love|neutral”}}
消息: {text}””"
try:
resp = deepseek_client.chat.completions.create(
model=“deepseek-chat”,
messages=[{“role”: “user”, “content”: prompt}],
temperature=0.1
)
content = resp.choices[0].message.content.strip()
if "```json" in content: content = content.split("```json")[1].split("```")[0] elif "```" in content: content = content.split("```")[1].split("```")[0] json_match = re.search(r'\{.*\}', content, re.DOTALL) if json_match: content = json_match.group(0) content = re.sub(r',\s*}', '}', content) content = re.sub(r',\s*]', ']', content) return json.loads(content) except Exception as e: print(f"情绪分类失败: {e}") return {"valence": 0.0, "arousal": 0.0, "label": "neutral"}异常处理:当 API 调用失败或返回格式异常时,默认返回中性情绪(valence=0, arousal=0, label=neutral),确保系统稳定性。
2.3编码方式
2.3.1标准编码Baseline
标准编码是现有 RAG 系统的默认方式:直接将用户原话作为记忆文本存入。
python
def standard_encode(text: str, emotion: Dict) -> str:
return f"用户说:{text}"
2.3.2深度编码组
深度编码在满足arousal值条件时触发,除了原话外,额外调用 LLM 提取四个维度的信息:
查看代码
python
def deep_encode(text: str, emotion: Dict) -> str:
arousal = emotion.get(“arousal”, 0)
# 低情绪 → 标准编码 if arousal <= AROUSAL_THRESHOLD: return standard_encode(text, emotion) # 高情绪 → 深度编码 prompt = f"""用户说:"{text}"情绪标签:{emotion.get(‘label’, ‘unknown’)}
情绪唤醒度:{emotion.get(‘arousal’, 0):.2f}
请提取深度记忆,输出JSON格式(只输出JSON):
{{
“fact”: “用户说了什么(概括,一句话)”,
“underlying_motive”: “用户的深层需求或动机(推测)”,
“contextual_cues”: “语境线索(语气、标点、用词特点)”,
“agent_strategy”: “Agent应该如何回应(策略建议)”
}}
“”"
try:
resp = deepseek_client.chat.completions.create(
model=“deepseek-chat”,
messages=[
{“role”: “system”, “content”: “你是记忆提取专家,只输出JSON。”},
{“role”: “user”, “content”: prompt}
],
temperature=0.3
)
content = resp.choices[0].message.content.strip()
if “json" in content: content = content.split("json”)[1].split(“")[0] elif "” in content:
content = content.split(“")[1].split("”)[0]
deep_data = json.loads(content)
return f"[深度记忆] {json.dumps(deep_data, ensure_ascii=False)}"
except Exception as e:
print(f"深度编码失败,回退标准编码: {e}")
return standard_encode(text, emotion)
2.3.3两种编码存入内容对比
Baseline组:
json
用户说:我拿到offer了!太开心了!
深度编码组:
json
[深度记忆] {
“fact”: “用户拿到了梦寐以求的工作offer”,
“underlying_motive”: “希望被认可、分享喜悦”,
“contextual_cues”: “语气激动,用了感叹号”,
“agent_strategy”: “给予真诚祝贺,强化成就感”
}
两者的区别在于,标准编码只是单纯将信息照搬存入知识库,而深度编码会先通过LLM对信息进行分析,然后将信息分析出来的四个维度进行系统性存储。
2.4四维信息
维度 定义 检索时的作用
fact 概括用户说了什么 提供基础语义匹配
underlying_motive 用户的深层需求或动机 匹配用户意图,而非仅字面匹配
contextual_cues 语境线索(语气、标点、用词) 提供情感色彩,区分"愤怒"和"委屈"
agent_strategy Agent 应如何回应 指导回复风格,提升共情质量
其中,underlying_motive最为重要,用户的深层需求是最有价值的检索特征。
2.5对唤醒度arousal做阈值选择
2.5.1做阈值选择的原因
深度编码的触发条件是——“arousal>AROUSAL_THRESHOLD”。如果说阈值过高导致触发样本太少,无法验证深度编码的有效性;但是阈值过低则可能对中性情绪也进行深度编码,稀释高情绪样本的区分度。因此需要基于数据分布选择合理的阈值。
2.5.2数据分析求arousal分布
本文用以下代码对arousal分布进行分析:
python
from datasets import load_dataset
import random
dataset = load_dataset(“empathetic_dialogues”, split=“test”, trust_remote_code=True)
sample_data = random.sample(list(dataset), 100)
arousals = []
for sample in sample_data:
text = sample[“utterance”]
emotion = classify_emotion(text)
arousals.append(emotion[“arousal”])
得到分析结果:
json
Arousal 分布统计
样本数: 100
最大值: 0.90
最小值: 0.00
平均值: 0.50
不同阈值触发率:
阈值 0.1: 触发 94/100 条 (94%)
阈值 0.2: 触发 91/100 条 (91%)
阈值 0.3: 触发 73/100 条 (73%)
阈值 0.4: 触发 53/100 条 (53%)
阈值 0.5: 触发 53/100 条 (53%)
2.5.3本实验阈值选择
本实验选择 τ = 0.1,原因如下:
1.样本充足:94%的触发率确保绝大多数样本进入深度编码组,使实验具有统计意义。
2.避免零触发:在前期实验中,阈值设为0.35时触发率仅8%,深度编码组几乎等同于Baseline,无法验证深度编码的有效性。τ = 0.1解决了这一问题。
3.宽松验证策略:阈值低相当于“宽口径”验证——如果深度编码在几乎全部样本都触发的条件下仍然有效,说明机制本身是鲁棒的,而非仅对极端情绪有效。
回到顶部
三.实验设计
3.1实验设置
3.1.1数据集
本实验使用 EmpatheticDialogues(Rashkin et al., 2019),这是共情对话领域最广泛使用的基准数据集。
属性 说明
规模 25,000段对话,约100,000轮
情绪标签 32种情绪(如joy、sadness、anger、fear等)
结构 每段对话4-8轮,由“倾诉者”和“倾听者”两名众包工人完成
我们使用测试集(test split)进行实验,共10,943条样本。
数据格式:
json
{
“conv_id”: “hit:0_conv:1”,
“utterance_idx”: 1,
“utterance”: “I remember going to see the fireworks with my best friend…”,
“context”: “sentimental”,
“speaker_idx”: 1
}
3.1.2对话分组
EmpatheticDialogues的每条样本包含 conv_id(对话ID)和 utterance_idx(轮次索引)。我们按conv_id分组,将同一段对话的所有轮次按utterance_idx排序,形成完整的多轮对话序列。
3.2评估指标
本实验由 StepFun的模型step-3.7-flash对每条回复进行严格评分(1-5分),评估两个维度:
指标 定义 评估标准
共情力(Empathy) Agent是否准确识别并回应用户情绪 5分:像资深心理咨询师,100条中不超过5条;3分:合格;1分:完全失败
生动度(Vividness) Agent回复是否有温度、有细节 5分:有感官细节或情感画面,100条中不超过5条;3分:合格;1分:完全失败
评估严谨性:本实验生成模型用deepseek-v4-flash,评估模型用step-3.7-flash,二者来自不同厂商,避免“自我打分”的偏差。评估为盲评,评估模型不知道回复所属组别。
评估Prompt模板:
json
系统提示:你是严格的对话质量评估专家。5分极其罕见,平均分应在2.5-3.5之间。只输出JSON。
用户消息:{user_text}
用户情绪:{emotion_label}
Agent回复:{agent_reply}
输出:{“empathy”: 整数, “vividness”: 整数}
3.3对照实验设计
组别 编码方式 用途
Baseline组 标准编码(只存原话) 对照组
深度编码组 深度编码(arousal > 0.1触发) 实验组
控制变量:两组在情绪分类、向量存储、检索方式(纯语义检索,Top-3)、生成模型、评估模型上完全相同。唯一变量是编码方式。
下图是Baseline组结果的数据:
image
下图是深度编码组结果的数据:
image
完整实验参数:
参数 值
数据集 EmpatheticDialogues(test split,10,943条)
对话数 50段完整对话(每段4-8轮)
评估轮数 220轮(只评估第2轮及以后)
阈值τ 0.1
生成模型 deepseek-v4-flash
嵌入模型 all-MiniLM-L6-v2
向量数据库 ChromaDB
评估模型 step-3.7-flash
检索方式 纯语义检索或Top-3
3.4实验结果
指标 Baseline 深度编码 提升
共情力(1~5) 3.52 3.66 +4.0%
生动度(1~5) 3.20 3.21 +0.5%
评估轮数 220 220 -
下图是实验结果:
image