在对话历史管理中,核心目标是让大模型在多轮交互中“记住”关键信息,同时避免上下文过长导致的Token超限或冗余干扰。以下结合一个电商客服对话场景,详细讲解3种典型策略的具体应用和效果对比。

场景背景

假设用户正在与电商客服AI咨询订单问题,对话会涉及订单号、商品问题、退款需求等多轮交互。我们用具体对话轮次展示不同管理策略的差异。

策略1:全量存储(ConversationBufferMemory

核心逻辑:

完整保存每一轮的用户提问和AI回答,生成新回答时将全部历史拼接为上下文传入LLM。

例子流程:
  1. 第1轮
    用户:“我昨天买的衣服还没发货,订单号是OD20230819001。”
    AI:“您好,帮您查询到订单OD20230819001为‘夏季连衣裙’,当前状态为‘待发货’,预计24小时内发出。”
    Memory保存
    ["Human: 我昨天买的衣服还没发货,订单号是OD20230819001。", "AI: 您好,帮您查询到订单OD20230819001为‘夏季连衣裙’,当前状态为‘待发货’,预计24小时内发出。"]

  2. 第2轮
    用户:“我想换个颜色,换成蓝色的可以吗?”
    AI:“可以更换颜色哦,请确认订单OD20230819001的新颜色为‘蓝色’,我将为您备注修改。”
    Memory保存(新增第2轮):
    ["Human: 我昨天买的衣服还没发货,订单号是OD20230819001。", "AI: 您好,帮您查询到订单OD20230819001为‘夏季连衣裙’,当前状态为‘待发货’,预计24小时内发出。", "Human: 我想换个颜色,换成蓝色的可以吗?", "AI: 可以更换颜色哦,请确认订单OD20230819001的新颜色为‘蓝色’,我将为您备注修改。"]

  3. 第5轮(假设继续多轮咨询退款、发票等问题):
    用户:“修改后什么时候能发货?另外发票抬头需要改成公司。”
    Memory保存:包含前4轮完整对话(共8条记录),总长度已达500+字符。
    传入LLM的上下文:直接拼接全部8条记录。

优点:完整保留所有细节,AI能回溯任意历史信息(如订单号、颜色修改记录)。
缺点:对话轮次增加后,上下文长度快速膨胀(如10轮对话可能超2000字符),易触发模型Token限制(如GPT-3.5的4k Token),且冗余信息可能降低回答效率。

策略2:窗口存储(ConversationBufferWindowMemory

核心逻辑:

仅保留最近N轮对话(通过k参数设置窗口大小),自动截断早期历史,平衡上下文相关性和长度。

例子流程(延续上述场景,k=2,即保留最近2轮):
  1. 第1-2轮:同策略1,Memory保存完整前2轮。

  2. 第3轮
    用户:“我还想申请开发票,抬头是个人。”
    AI:“已为订单OD20230819001备注‘发票抬头:个人’,发货后将同步寄出。”
    Memory保存(保留最近2轮,即第2-3轮):
    ["Human: 我想换个颜色,换成蓝色的可以吗?", "AI: 可以更换颜色哦,请确认订单OD20230819001的新颜色为‘蓝色’,我将为您备注修改。", "Human: 我还想申请开发票,抬头是个人。", "AI: 已为订单OD20230819001备注‘发票抬头:个人’,发货后将同步寄出。"]

  3. 第5轮
    用户:“修改后什么时候能发货?另外发票抬头需要改成公司。”
    Memory保存(保留最近2轮,即第3-4轮):
    ["Human: 我还想申请开发票,抬头是个人。", "AI: 已为订单OD20230819001备注‘发票抬头:个人’,发货后将同步寄出。", "Human: 订单现在是什么状态?", "AI: 当前状态为‘待发货(已备注颜色修改)’,预计今天18点前发出。"]
    传入LLM的上下文:仅拼接这4条记录(约300字符)。

优点:避免上下文过长,Token消耗可控,适合对早期历史依赖低的场景。
缺点:若用户提问涉及早期信息(如第1轮的订单号),而窗口已截断,则AI可能“失忆”(如无法回忆订单号)。

策略3:摘要压缩(ConversationSummaryMemory

核心逻辑:

用LLM对早期对话生成摘要,替代原始长对话;每轮新增对话时,将摘要与最新对话拼接,再生成新摘要,大幅压缩长度同时保留核心信息。

例子流程(延续上述场景):
  1. 第1-2轮:同策略1,Memory先保存完整对话。

  2. 第3轮前:自动触发摘要生成,对前2轮对话总结:
    早期对话摘要:用户咨询订单OD20230819001(夏季连衣裙)的发货状态,AI告知待发货;用户要求将颜色改为蓝色,AI已备注修改。
    Memory保存["摘要:早期对话摘要:用户咨询订单OD20230819001(夏季连衣裙)的发货状态,AI告知待发货;用户要求将颜色改为蓝色,AI已备注修改。"]

  3. 第3轮
    用户:“我还想申请开发票,抬头是个人。”
    AI:“已为订单OD20230819001备注‘发票抬头:个人’,发货后将同步寄出。”
    Memory更新:将摘要与第3轮对话拼接,生成新摘要:
    早期对话摘要:用户咨询订单OD20230819001(夏季连衣裙)的发货状态(待发货),并要求将颜色改为蓝色(已备注);用户新增需求:申请发票,抬头为个人(已备注)。

  4. 第5轮
    用户:“修改后什么时候能发货?另外发票抬头需要改成公司。”
    传入LLM的上下文
    早期对话摘要:用户咨询订单OD20230819001(夏季连衣裙)的发货状态(待发货),并要求将颜色改为蓝色(已备注);用户新增需求:申请发票,抬头为个人(已备注)。 Human: 修改后什么时候能发货?另外发票抬头需要改成公司。

优点:大幅压缩上下文长度(5轮对话的摘要可能仅200字符),同时保留核心信息(订单号、颜色修改、发票需求),避免“失忆”和Token超限。
缺点:摘要依赖LLM的总结能力,可能丢失细节(如未明确记录“预计24小时内发货”的原始承诺)。

策略对比与选择建议

策略 核心逻辑 优点 缺点 适用场景
全量存储 保存完整历史 细节无丢失 易超限,冗余多 短对话、需完整回溯的场景
窗口存储(k=2-5 保留最近N轮 长度可控,实现简单 可能丢失早期关键信息 中短对话、近期信息为主的场景
摘要压缩 生成早期对话摘要 长度压缩,保留核心信息 可能丢失细节,依赖摘要质量 长对话、核心信息明确的场景

在实际应用中,可根据对话长度和信息重要性组合策略(如:用窗口存储保留最近3轮原始对话,同时用摘要记录更早的核心信息),兼顾效率和准确性。

在实际应用中选择对话历史管理策略,核心是匹配场景的核心需求——比如对话长度、上下文依赖强度、Token成本、隐私要求、响应速度等。不同场景对历史信息的依赖程度和使用方式差异很大,以下从核心原则、典型场景举例和关键考量因素三个维度展开说明。

一、选择策略的核心原则

  1. 上下文依赖强度:对话是否需要“长期记忆”?比如多轮任务拆解(如代码调试、复杂问题咨询)需要强依赖历史;而单次问答(如天气查询)几乎不需要历史。
  2. 对话长度:短对话(3-5轮)可简单处理;长对话(10轮以上)必须考虑截断或提炼,避免Token溢出。
  3. 信息重要性:历史中是否有关键信息(如用户身份、任务目标、参数设定)?关键信息需优先保留,冗余内容可舍弃。
  4. 成本与效率:全量保留会增加Token消耗和响应延迟,需在“上下文完整性”和“性能成本”间平衡。

二、典型场景与对应策略举例

场景1:客服聊天机器人(如电商售后、故障报修)

核心需求:用户问题可能跨多轮(如“之前反馈的订单问题还没解决”),需完整追溯历史对话细节(如订单号、问题描述、处理进度),但冗余寒暄可简化。
适合策略关键信息提取 + 全量历史按需加载

  • 用工具(如LangChain的ConversationSummaryMemory)实时提取历史中的关键信息(如订单号、问题类型、处理节点),单独存储。
  • 生成回复时,优先载入关键信息,再按需补充最近1-2轮的完整对话(避免冗余)。
  • 例:用户说“我昨天反馈的订单没发货”,系统需提取历史中的订单号+反馈时间,无需重复加载昨天的寒暄内容。
场景2:代码辅助工具(如IDE插件、代码问答)

核心需求:依赖最近的代码片段、用户问题和调试反馈,但早期无关代码或闲聊可丢弃;需精准匹配代码上下文(如变量名、函数定义)。
适合策略滑动窗口 + 关键信息锚定

  • 用滑动窗口保留最近5-10轮对话(含用户输入的代码、问题、工具返回的调试建议),超过窗口的历史自动截断。
  • 额外锚定关键信息:从历史中提取用户当前任务的核心目标(如“调试Python爬虫报错”)、关键变量/函数名(如requests.getparse_html),确保这些信息不被截断。
  • 例:用户先问“如何用requests爬网页”,再问“报错403怎么办”,最后问“如何解析返回的HTML”,滑动窗口保留后三个问题+相关代码,锚定“requests”“爬虫”“HTML解析”等关键词。
场景3:医疗/法律咨询(高敏感、强严谨性)

核心需求:历史对话需完整追溯(如患者症状描述、既往病史;法律咨询中的案件细节),不允许遗漏关键信息,且需符合隐私合规。
适合策略全量保留 + 加密存储 + 结构化提炼

  • 全量存储完整对话历史(文本+时间戳),但需加密处理(如敏感信息脱敏:用“[患者姓名]”替代真实姓名)。
  • 同时用结构化方式提炼关键信息(如医疗场景:症状、用药史、检查结果;法律场景:案件类型、时间线、诉求),存储为结构化数据(JSON/数据库),方便快速检索。
  • 生成回复时,先载入结构化关键信息,再结合全量历史中的细节补充,确保严谨性。
场景4:闲聊机器人(如社交APP陪聊)

核心需求:对话无强任务目标,依赖“当下氛围”,过长历史会导致冗余,且用户对“记忆准确性”要求低(甚至允许“健忘”)。
适合策略短滑动窗口 + 主题分割

  • 用短滑动窗口保留最近3-5轮对话(避免记忆负担),超过则截断。
  • 当对话切换主题(如从“聊电影”转到“聊美食”),自动触发主题分割,清空上一主题的历史,仅保留当前主题的初始对话。
  • 例:用户先聊“《奥本海默》好看吗”,3轮后转问“你喜欢吃火锅吗”,系统自动分割主题,只保留“火锅”相关的最新对话。
场景5:任务型对话(如预订机票、智能家居控制)

核心需求:聚焦当前任务的关键参数(如航班日期、目的地;设备控制指令),无关历史可丢弃,任务完成后历史可重置。
适合策略按任务阶段分割 + 关键参数提取

  • 按任务阶段划分历史(如机票预订分“查询-选座-确认”阶段),每个阶段只保留当前阶段的关键参数(如日期、人数、舱位)。
  • 任务完成后(如订单提交成功),自动清空历史或标记为“已完成”,避免干扰下一个任务。
  • 例:用户预订机票时,系统仅保留“出发地、目的地、日期”等参数,完成后切换到新任务(如“预订酒店”)时,历史自动重置。

三、关键考量因素补充

  1. Token限制:若使用大模型有Token上限(如GPT-3.5的4k Token),长对话必须通过滑动窗口、摘要压缩等策略控制输入长度,避免溢出。
  2. 用户体验:历史保留不足会导致“失忆”(如重复问用户已说过的信息);保留过多会导致回复冗余(如重复解释已知内容),需通过用户反馈调整窗口大小。
  3. 技术实现成本:全量保留+结构化提炼需要更多存储和计算资源;滑动窗口或简单截断实现更轻量,适合资源有限的场景。

总结

选择对话历史管理策略的本质是**“按需保留”**:先明确场景中“哪些历史信息对当前对话必不可少”,再选择对应的策略(全量/滑动/提炼/分割),同时平衡Token成本、响应速度和用户体验。

在销售场景中,客户对话常夹杂寒暄、需求描述、细节确认等内容,EntityMemory 能精准提取核心实体(如客户关注的产品、需求属性、预算等),忽略无关闲聊,确保销售AI始终聚焦关键信息。以下是具体例子:

场景:家具销售对话(客户咨询沙发购买)

假设对话过程如下,我们对比原始对话和 EntityMemory 提取的实体信息:

原始对话轮次
  1. 客户:“你好!我想看看沙发,家里客厅刚装修完,需要一个合适的沙发。”
  2. 销售AI:“您好!很高兴为您服务~ 请问您客厅的空间大小大概是多少?喜欢什么风格的沙发呢?”
  3. 客户:“客厅大概25平米,风格是现代简约的,不要太笨重的款式。对了,我家有小孩,所以希望沙发材质耐脏、好打理,最好是科技布的吧?”
  4. 销售AI:“明白!科技布确实耐磨耐脏,很适合有小孩的家庭~ 请问您预算大概在什么范围呢?有没有偏好的颜色?”
  5. 客户:“预算大概5000-8000元吧,颜色的话,灰色或者米白色比较百搭,和我家墙面颜色协调。哦对了,我下周就要搬家,最好能尽快送货安装~”
  6. 销售AI:“收到!我会优先为您推荐符合预算、现代简约风格的科技布沙发,颜色可选灰色/米白色,确保下周内送货~”
EntityMemory 提取的核心实体及属性

EntityMemory 会自动识别对话中的核心实体(如“客户”“沙发”),并记录实体的关键属性,忽略“你好”“很高兴为您服务”等寒暄内容。提取结果如下:

{
  "entities": {
    # 核心实体1:客户
    "客户": {
      "需求场景": "客厅装修后购买沙发",
      "时间要求": "下周搬家,需尽快送货安装"  # 客户的关键时间约束
    },
    # 核心实体2:沙发(客户目标产品)
    "沙发": {
      "适用空间": "25平米客厅",
      "风格偏好": "现代简约",
      "款式要求": "不笨重",
      "材质偏好": "科技布(耐脏、好打理,适合有小孩家庭)",  # 核心需求属性
      "预算范围": "5000-8000元",  # 关键决策因素
      "颜色偏好": "灰色或米白色(与墙面协调)"
    }
  },
  "entity_relations": {
    # 实体间关系:客户需求与沙发属性的关联
    "客户需求 → 沙发属性": "现代简约风格 + 科技布材质 + 5000-8000元预算 + 灰色/米白色"
  }
}
后续对话中 EntityMemory 的作用

当对话进入推荐或细节确认阶段时,EntityMemory 存储的实体信息会直接支撑AI的精准回应,无需客户重复说明:

  • 客户:“你刚才说的科技布沙发,有没有带储物功能的?”
  • 销售AI(调用 EntityMemory):“有的!为您推荐‘现代简约科技布储物沙发(灰色)’,符合您5000-8000元预算,材质耐脏好打理,储物功能可收纳小孩玩具,下周可送货安装,适配您25平米的客厅~”

这里AI直接复用了实体信息中的“预算、材质、空间、时间要求”,无需客户重复提及,且完全聚焦客户的核心需求。

为什么适合销售场景?

  1. 聚焦核心需求:忽略寒暄和无关细节,只保留影响成交的关键信息(预算、材质、时间等),避免AI“记混”或遗漏重点。
  2. 提升响应效率:后续对话中,AI可直接调用实体属性快速推荐,减少客户重复描述的负担(比如客户无需反复说“我有小孩,要耐脏材质”)。
  3. 支持个性化服务:实体关系记录(如“客户需求→沙发属性”)帮助AI精准匹配产品,避免推荐不符合预算或风格的选项。

总结

EntityMemory 在销售场景中像一个“智能笔记”,自动筛选并记录客户的核心需求实体及属性,让AI始终围绕关键信息展开对话,既提升效率又增强个性化体验,尤其适合需要精准记忆客户偏好的场景。

Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐