langchain上下文管理之对话历史管理
在对话历史管理中,核心目标是让大模型在多轮交互中“记住”关键信息,同时避免上下文过长导致的Token超限或冗余干扰。以下结合一个电商客服对话场景,详细讲解3种典型策略的具体应用和效果对比。
场景背景
假设用户正在与电商客服AI咨询订单问题,对话会涉及订单号、商品问题、退款需求等多轮交互。我们用具体对话轮次展示不同管理策略的差异。
策略1:全量存储(ConversationBufferMemory)
核心逻辑:
完整保存每一轮的用户提问和AI回答,生成新回答时将全部历史拼接为上下文传入LLM。
例子流程:
-
第1轮:
用户:“我昨天买的衣服还没发货,订单号是OD20230819001。”
AI:“您好,帮您查询到订单OD20230819001为‘夏季连衣裙’,当前状态为‘待发货’,预计24小时内发出。”
Memory保存:["Human: 我昨天买的衣服还没发货,订单号是OD20230819001。", "AI: 您好,帮您查询到订单OD20230819001为‘夏季连衣裙’,当前状态为‘待发货’,预计24小时内发出。"] -
第2轮:
用户:“我想换个颜色,换成蓝色的可以吗?”
AI:“可以更换颜色哦,请确认订单OD20230819001的新颜色为‘蓝色’,我将为您备注修改。”
Memory保存(新增第2轮):["Human: 我昨天买的衣服还没发货,订单号是OD20230819001。", "AI: 您好,帮您查询到订单OD20230819001为‘夏季连衣裙’,当前状态为‘待发货’,预计24小时内发出。", "Human: 我想换个颜色,换成蓝色的可以吗?", "AI: 可以更换颜色哦,请确认订单OD20230819001的新颜色为‘蓝色’,我将为您备注修改。"] -
第5轮(假设继续多轮咨询退款、发票等问题):
用户:“修改后什么时候能发货?另外发票抬头需要改成公司。”
Memory保存:包含前4轮完整对话(共8条记录),总长度已达500+字符。
传入LLM的上下文:直接拼接全部8条记录。
优点:完整保留所有细节,AI能回溯任意历史信息(如订单号、颜色修改记录)。
缺点:对话轮次增加后,上下文长度快速膨胀(如10轮对话可能超2000字符),易触发模型Token限制(如GPT-3.5的4k Token),且冗余信息可能降低回答效率。
策略2:窗口存储(ConversationBufferWindowMemory)
核心逻辑:
仅保留最近N轮对话(通过k参数设置窗口大小),自动截断早期历史,平衡上下文相关性和长度。
例子流程(延续上述场景,k=2,即保留最近2轮):
-
第1-2轮:同策略1,Memory保存完整前2轮。
-
第3轮:
用户:“我还想申请开发票,抬头是个人。”
AI:“已为订单OD20230819001备注‘发票抬头:个人’,发货后将同步寄出。”
Memory保存(保留最近2轮,即第2-3轮):["Human: 我想换个颜色,换成蓝色的可以吗?", "AI: 可以更换颜色哦,请确认订单OD20230819001的新颜色为‘蓝色’,我将为您备注修改。", "Human: 我还想申请开发票,抬头是个人。", "AI: 已为订单OD20230819001备注‘发票抬头:个人’,发货后将同步寄出。"] -
第5轮:
用户:“修改后什么时候能发货?另外发票抬头需要改成公司。”
Memory保存(保留最近2轮,即第3-4轮):["Human: 我还想申请开发票,抬头是个人。", "AI: 已为订单OD20230819001备注‘发票抬头:个人’,发货后将同步寄出。", "Human: 订单现在是什么状态?", "AI: 当前状态为‘待发货(已备注颜色修改)’,预计今天18点前发出。"]
传入LLM的上下文:仅拼接这4条记录(约300字符)。
优点:避免上下文过长,Token消耗可控,适合对早期历史依赖低的场景。
缺点:若用户提问涉及早期信息(如第1轮的订单号),而窗口已截断,则AI可能“失忆”(如无法回忆订单号)。
策略3:摘要压缩(ConversationSummaryMemory)
核心逻辑:
用LLM对早期对话生成摘要,替代原始长对话;每轮新增对话时,将摘要与最新对话拼接,再生成新摘要,大幅压缩长度同时保留核心信息。
例子流程(延续上述场景):
-
第1-2轮:同策略1,Memory先保存完整对话。
-
第3轮前:自动触发摘要生成,对前2轮对话总结:
早期对话摘要:用户咨询订单OD20230819001(夏季连衣裙)的发货状态,AI告知待发货;用户要求将颜色改为蓝色,AI已备注修改。
Memory保存:["摘要:早期对话摘要:用户咨询订单OD20230819001(夏季连衣裙)的发货状态,AI告知待发货;用户要求将颜色改为蓝色,AI已备注修改。"] -
第3轮:
用户:“我还想申请开发票,抬头是个人。”
AI:“已为订单OD20230819001备注‘发票抬头:个人’,发货后将同步寄出。”
Memory更新:将摘要与第3轮对话拼接,生成新摘要:早期对话摘要:用户咨询订单OD20230819001(夏季连衣裙)的发货状态(待发货),并要求将颜色改为蓝色(已备注);用户新增需求:申请发票,抬头为个人(已备注)。 -
第5轮:
用户:“修改后什么时候能发货?另外发票抬头需要改成公司。”
传入LLM的上下文:早期对话摘要:用户咨询订单OD20230819001(夏季连衣裙)的发货状态(待发货),并要求将颜色改为蓝色(已备注);用户新增需求:申请发票,抬头为个人(已备注)。 Human: 修改后什么时候能发货?另外发票抬头需要改成公司。
优点:大幅压缩上下文长度(5轮对话的摘要可能仅200字符),同时保留核心信息(订单号、颜色修改、发票需求),避免“失忆”和Token超限。
缺点:摘要依赖LLM的总结能力,可能丢失细节(如未明确记录“预计24小时内发货”的原始承诺)。
策略对比与选择建议
| 策略 | 核心逻辑 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|
| 全量存储 | 保存完整历史 | 细节无丢失 | 易超限,冗余多 | 短对话、需完整回溯的场景 |
窗口存储(k=2-5) |
保留最近N轮 | 长度可控,实现简单 | 可能丢失早期关键信息 | 中短对话、近期信息为主的场景 |
| 摘要压缩 | 生成早期对话摘要 | 长度压缩,保留核心信息 | 可能丢失细节,依赖摘要质量 | 长对话、核心信息明确的场景 |
在实际应用中,可根据对话长度和信息重要性组合策略(如:用窗口存储保留最近3轮原始对话,同时用摘要记录更早的核心信息),兼顾效率和准确性。
在实际应用中选择对话历史管理策略,核心是匹配场景的核心需求——比如对话长度、上下文依赖强度、Token成本、隐私要求、响应速度等。不同场景对历史信息的依赖程度和使用方式差异很大,以下从核心原则、典型场景举例和关键考量因素三个维度展开说明。
一、选择策略的核心原则
- 上下文依赖强度:对话是否需要“长期记忆”?比如多轮任务拆解(如代码调试、复杂问题咨询)需要强依赖历史;而单次问答(如天气查询)几乎不需要历史。
- 对话长度:短对话(3-5轮)可简单处理;长对话(10轮以上)必须考虑截断或提炼,避免Token溢出。
- 信息重要性:历史中是否有关键信息(如用户身份、任务目标、参数设定)?关键信息需优先保留,冗余内容可舍弃。
- 成本与效率:全量保留会增加Token消耗和响应延迟,需在“上下文完整性”和“性能成本”间平衡。
二、典型场景与对应策略举例
场景1:客服聊天机器人(如电商售后、故障报修)
核心需求:用户问题可能跨多轮(如“之前反馈的订单问题还没解决”),需完整追溯历史对话细节(如订单号、问题描述、处理进度),但冗余寒暄可简化。
适合策略:关键信息提取 + 全量历史按需加载
- 用工具(如LangChain的
ConversationSummaryMemory)实时提取历史中的关键信息(如订单号、问题类型、处理节点),单独存储。 - 生成回复时,优先载入关键信息,再按需补充最近1-2轮的完整对话(避免冗余)。
- 例:用户说“我昨天反馈的订单没发货”,系统需提取历史中的订单号+反馈时间,无需重复加载昨天的寒暄内容。
场景2:代码辅助工具(如IDE插件、代码问答)
核心需求:依赖最近的代码片段、用户问题和调试反馈,但早期无关代码或闲聊可丢弃;需精准匹配代码上下文(如变量名、函数定义)。
适合策略:滑动窗口 + 关键信息锚定
- 用滑动窗口保留最近5-10轮对话(含用户输入的代码、问题、工具返回的调试建议),超过窗口的历史自动截断。
- 额外锚定关键信息:从历史中提取用户当前任务的核心目标(如“调试Python爬虫报错”)、关键变量/函数名(如
requests.get、parse_html),确保这些信息不被截断。 - 例:用户先问“如何用requests爬网页”,再问“报错403怎么办”,最后问“如何解析返回的HTML”,滑动窗口保留后三个问题+相关代码,锚定“requests”“爬虫”“HTML解析”等关键词。
场景3:医疗/法律咨询(高敏感、强严谨性)
核心需求:历史对话需完整追溯(如患者症状描述、既往病史;法律咨询中的案件细节),不允许遗漏关键信息,且需符合隐私合规。
适合策略:全量保留 + 加密存储 + 结构化提炼
- 全量存储完整对话历史(文本+时间戳),但需加密处理(如敏感信息脱敏:用“[患者姓名]”替代真实姓名)。
- 同时用结构化方式提炼关键信息(如医疗场景:症状、用药史、检查结果;法律场景:案件类型、时间线、诉求),存储为结构化数据(JSON/数据库),方便快速检索。
- 生成回复时,先载入结构化关键信息,再结合全量历史中的细节补充,确保严谨性。
场景4:闲聊机器人(如社交APP陪聊)
核心需求:对话无强任务目标,依赖“当下氛围”,过长历史会导致冗余,且用户对“记忆准确性”要求低(甚至允许“健忘”)。
适合策略:短滑动窗口 + 主题分割
- 用短滑动窗口保留最近3-5轮对话(避免记忆负担),超过则截断。
- 当对话切换主题(如从“聊电影”转到“聊美食”),自动触发主题分割,清空上一主题的历史,仅保留当前主题的初始对话。
- 例:用户先聊“《奥本海默》好看吗”,3轮后转问“你喜欢吃火锅吗”,系统自动分割主题,只保留“火锅”相关的最新对话。
场景5:任务型对话(如预订机票、智能家居控制)
核心需求:聚焦当前任务的关键参数(如航班日期、目的地;设备控制指令),无关历史可丢弃,任务完成后历史可重置。
适合策略:按任务阶段分割 + 关键参数提取
- 按任务阶段划分历史(如机票预订分“查询-选座-确认”阶段),每个阶段只保留当前阶段的关键参数(如日期、人数、舱位)。
- 任务完成后(如订单提交成功),自动清空历史或标记为“已完成”,避免干扰下一个任务。
- 例:用户预订机票时,系统仅保留“出发地、目的地、日期”等参数,完成后切换到新任务(如“预订酒店”)时,历史自动重置。
三、关键考量因素补充
- Token限制:若使用大模型有Token上限(如GPT-3.5的4k Token),长对话必须通过滑动窗口、摘要压缩等策略控制输入长度,避免溢出。
- 用户体验:历史保留不足会导致“失忆”(如重复问用户已说过的信息);保留过多会导致回复冗余(如重复解释已知内容),需通过用户反馈调整窗口大小。
- 技术实现成本:全量保留+结构化提炼需要更多存储和计算资源;滑动窗口或简单截断实现更轻量,适合资源有限的场景。
总结
选择对话历史管理策略的本质是**“按需保留”**:先明确场景中“哪些历史信息对当前对话必不可少”,再选择对应的策略(全量/滑动/提炼/分割),同时平衡Token成本、响应速度和用户体验。
在销售场景中,客户对话常夹杂寒暄、需求描述、细节确认等内容,EntityMemory 能精准提取核心实体(如客户关注的产品、需求属性、预算等),忽略无关闲聊,确保销售AI始终聚焦关键信息。以下是具体例子:
场景:家具销售对话(客户咨询沙发购买)
假设对话过程如下,我们对比原始对话和 EntityMemory 提取的实体信息:
原始对话轮次
- 客户:“你好!我想看看沙发,家里客厅刚装修完,需要一个合适的沙发。”
- 销售AI:“您好!很高兴为您服务~ 请问您客厅的空间大小大概是多少?喜欢什么风格的沙发呢?”
- 客户:“客厅大概25平米,风格是现代简约的,不要太笨重的款式。对了,我家有小孩,所以希望沙发材质耐脏、好打理,最好是科技布的吧?”
- 销售AI:“明白!科技布确实耐磨耐脏,很适合有小孩的家庭~ 请问您预算大概在什么范围呢?有没有偏好的颜色?”
- 客户:“预算大概5000-8000元吧,颜色的话,灰色或者米白色比较百搭,和我家墙面颜色协调。哦对了,我下周就要搬家,最好能尽快送货安装~”
- 销售AI:“收到!我会优先为您推荐符合预算、现代简约风格的科技布沙发,颜色可选灰色/米白色,确保下周内送货~”
EntityMemory 提取的核心实体及属性
EntityMemory 会自动识别对话中的核心实体(如“客户”“沙发”),并记录实体的关键属性,忽略“你好”“很高兴为您服务”等寒暄内容。提取结果如下:
{
"entities": {
# 核心实体1:客户
"客户": {
"需求场景": "客厅装修后购买沙发",
"时间要求": "下周搬家,需尽快送货安装" # 客户的关键时间约束
},
# 核心实体2:沙发(客户目标产品)
"沙发": {
"适用空间": "25平米客厅",
"风格偏好": "现代简约",
"款式要求": "不笨重",
"材质偏好": "科技布(耐脏、好打理,适合有小孩家庭)", # 核心需求属性
"预算范围": "5000-8000元", # 关键决策因素
"颜色偏好": "灰色或米白色(与墙面协调)"
}
},
"entity_relations": {
# 实体间关系:客户需求与沙发属性的关联
"客户需求 → 沙发属性": "现代简约风格 + 科技布材质 + 5000-8000元预算 + 灰色/米白色"
}
}
后续对话中 EntityMemory 的作用
当对话进入推荐或细节确认阶段时,EntityMemory 存储的实体信息会直接支撑AI的精准回应,无需客户重复说明:
- 客户:“你刚才说的科技布沙发,有没有带储物功能的?”
- 销售AI(调用
EntityMemory):“有的!为您推荐‘现代简约科技布储物沙发(灰色)’,符合您5000-8000元预算,材质耐脏好打理,储物功能可收纳小孩玩具,下周可送货安装,适配您25平米的客厅~”
这里AI直接复用了实体信息中的“预算、材质、空间、时间要求”,无需客户重复提及,且完全聚焦客户的核心需求。
为什么适合销售场景?
- 聚焦核心需求:忽略寒暄和无关细节,只保留影响成交的关键信息(预算、材质、时间等),避免AI“记混”或遗漏重点。
- 提升响应效率:后续对话中,AI可直接调用实体属性快速推荐,减少客户重复描述的负担(比如客户无需反复说“我有小孩,要耐脏材质”)。
- 支持个性化服务:实体关系记录(如“客户需求→沙发属性”)帮助AI精准匹配产品,避免推荐不符合预算或风格的选项。
总结
EntityMemory 在销售场景中像一个“智能笔记”,自动筛选并记录客户的核心需求实体及属性,让AI始终围绕关键信息展开对话,既提升效率又增强个性化体验,尤其适合需要精准记忆客户偏好的场景。
更多推荐



所有评论(0)