大模型速通学习笔记(59)
适用场景:10-20 轮深度交互(如 “技术故障排查→远程指导→后续跟进”),需大幅压缩记忆体积。python运行# 1. 初始化总结记忆(用glm-3-turbo总结对话)llm=llm, # 传入总结用的大模型# 2. 初始化Agentllm=llm,agent_kwargs={"system_message": "你是电商客服,自动总结长对话,保留核心信息"}# 测试(6轮对话,记忆以总结形
LangChain AI Agent 记忆模块深度优化:选型策略与场景落地
一、核心主题定位
本集聚焦 Agent 记忆模块的进阶优化,核心解决 “基础记忆无法平衡‘交互连贯性’与‘性能效率’” 的核心痛点 —— 既避免短对话中关键信息丢失,又防止长对话因记忆过载导致响应延迟,同时适配海量历史查询场景。通过拆解 4 类核心记忆模块的特性、实操配置与场景匹配逻辑,让 Agent 的记忆能力精准贴合不同业务需求,从简单客服咨询到复杂医疗问诊均能稳定支撑。
二、记忆模块核心价值与分类
1. 记忆模块的不可替代价值
- 多轮交互无断层:保存对话上下文(如用户前序提到的 “订单号 OD-12345”),避免重复提问,提升用户体验。
- 复杂任务保状态:支撑跨步骤任务(如 “预约会议→确认参会人→发送提醒”),确保流程不中断、信息不遗漏。
- 个性化服务有依据:存储用户偏好(如 “回答需分点、优先用通俗语言”),实现定制化交互,而非 “千人一面”。
2. 4 类核心记忆模块对比
| 记忆类型 | 核心原理 | 优势 | 劣势 | 适配场景 |
|---|---|---|---|---|
| 对话缓冲记忆(ConversationBufferMemory) | 完整保存所有对话消息,无压缩 | 信息 100% 完整,适配短对话 | 长对话易触发 Token 溢出 | 5 轮内简单交互(如快递查询) |
| 窗口对话记忆(ConversationBufferWindowMemory) | 仅保留最近 k 轮对话,截断早期历史 | 精准控制 Token 量,响应快 | 可能丢失早期关键信息 | 5-10 轮常规交互(如产品咨询) |
| 对话总结记忆(ConversationSummaryMemory) | 用大模型自动总结长对话,替代原始历史 | 大幅压缩 Token 占用,适配长对话 | 总结可能遗漏细节 | 10-20 轮深度交互(如技术支持) |
| 向量检索记忆(VectorStoreRetrieverMemory) | 对话历史向量化存储,按需检索相关片段 | 支持海量历史(无长度限制) | 检索有轻微延迟,需向量库支撑 | 20 轮以上 / 多用户历史(如医疗问诊) |
三、各类型记忆模块实操落地(中文场景适配)
以 “智能客服 Agent” 为统一场景,演示不同记忆模块的代码配置与效果,所有示例均适配中文交互与智普大模型。
1. 环境准备
bash
运行
# 核心依赖(LangChain+智普模型)
pip install langchain==0.1.10 langchain-community==0.0.30 zhipuai
# 向量记忆依赖(向量库+中文Embedding)
pip install chromadb sentence-transformers
2. 实操示例 1:对话缓冲记忆(短对话场景)
适用场景:5 轮内简单咨询(如 “查订单状态”“问物流进度”),需完整保留对话细节。
python
运行
from langchain_community.llms import ZhipuAI
from langchain.agents import initialize_agent, AgentType
from langchain.memory import ConversationBufferMemory
from langchain_core.tools import Tool
# 1. 定义客服工具(查询订单)
def order_query(order_id: str) -> str:
mock_data = {"OD-12345": "已发货(快递单号SF123456)", "OD-67890": "待付款"}
return f"订单{order_id}状态:{mock_data.get(order_id, '订单号不存在')}"
tools = [Tool(
name="order_query",
func=order_query,
description="查询订单状态,需传入订单号(如OD-12345)"
)]
# 2. 初始化缓冲记忆(完整保存对话)
buffer_memory = ConversationBufferMemory(
return_messages=True, # 返回Message对象,适配Agent交互
memory_key="chat_history" # 与Agent Prompt变量名一致
)
# 3. 初始化Agent
llm = ZhipuAI(model="glm-3-turbo", api_key="你的API_KEY", temperature=0.1)
buffer_agent = initialize_agent(
tools=tools,
llm=llm,
agent=AgentType.CHAT_CONVERSATIONAL_REACT_DESCRIPTION,
memory=buffer_memory,
verbose=True,
agent_kwargs={"system_message": "你是电商客服,仅处理订单查询,需先问清订单号"}
)
# 测试(2轮对话,记忆完整保留)
buffer_agent.run("帮我查下订单") # Agent问:“请提供你的订单号(如OD-12345)”
buffer_agent.run("OD-12345") # Agent调用工具,返回订单状态(记忆关联上一轮需求)
3. 实操示例 2:窗口对话记忆(常规多轮场景)
适用场景:5-10 轮交互(如 “查订单→问物流→改收货地址”),需控制 Token 消耗。
python
运行
from langchain.memory import ConversationBufferWindowMemory
# 1. 初始化窗口记忆(仅保留最近3轮对话)
window_memory = ConversationBufferWindowMemory(
return_messages=True,
memory_key="chat_history",
k=3 # 核心参数:仅保留最近3轮
)
# 2. 初始化Agent(工具复用上方order_query)
window_agent = initialize_agent(
tools=tools,
llm=llm,
agent=AgentType.CHAT_CONVERSATIONAL_REACT_DESCRIPTION,
memory=window_memory,
verbose=True,
agent_kwargs={"system_message": "你是电商客服,保留最近3轮对话记忆"}
)
# 测试(4轮对话,第1轮被截断)
window_agent.run("查订单") # 轮1:问订单号
window_agent.run("OD-12345") # 轮2:查状态
window_agent.run("物流到哪了?") # 轮3:问物流(记忆保留轮1-3)
window_agent.run("能改收货地址吗?") # 轮4:问改地址(记忆保留轮2-4,轮1被截断)
4. 实操示例 3:对话总结记忆(长对话场景)
适用场景:10-20 轮深度交互(如 “技术故障排查→远程指导→后续跟进”),需大幅压缩记忆体积。
python
运行
from langchain.memory import ConversationSummaryMemory
# 1. 初始化总结记忆(用glm-3-turbo总结对话)
summary_memory = ConversationSummaryMemory(
llm=llm, # 传入总结用的大模型
return_messages=True,
memory_key="chat_history"
)
# 2. 初始化Agent
summary_agent = initialize_agent(
tools=tools,
llm=llm,
agent=AgentType.CHAT_CONVERSATIONAL_REACT_DESCRIPTION,
memory=summary_memory,
verbose=True,
agent_kwargs={"system_message": "你是电商客服,自动总结长对话,保留核心信息"}
)
# 测试(6轮对话,记忆以总结形式保存)
summary_agent.run("查订单") # 轮1:问订单号
summary_agent.run("OD-12345") # 轮2:查状态
summary_agent.run("物流到哪了?") # 轮3:问物流
summary_agent.run("能改收货地址吗?") # 轮4:问改地址
summary_agent.run("改到北京市朝阳区") # 轮5:提供新地址
summary_agent.run("之前的订单号是多少?") # 轮6:问历史订单号(记忆总结含“订单号OD-12345”,可直接回答)
5. 实操示例 4:向量检索记忆(海量历史场景)
适用场景:20 轮以上 / 多用户历史查询(如 “医疗问诊记录查询”“企业客户历史需求回顾”),需存储海量对话。
python
运行
from langchain.memory import VectorStoreRetrieverMemory
from langchain.vectorstores import Chroma
from langchain.embeddings import HuggingFaceEmbeddings
# 1. 初始化中文向量库与检索器
embedding = HuggingFaceEmbeddings(model_name="BAAI/bge-small-zh-v1.5") # 中文Embedding
vector_db = Chroma(embedding_function=embedding, persist_directory="./agent_memory_db")
retriever = vector_db.as_retriever(search_kwargs={"k": 2}) # 检索2条最相关历史
# 2. 初始化向量检索记忆
vector_memory = VectorStoreRetrieverMemory(
retriever=retriever,
memory_key="chat_history"
)
# 3. 初始化Agent(工具复用上方order_query)
vector_agent = initialize_agent(
tools=tools,
llm=llm,
agent=AgentType.CHAT_CONVERSATIONAL_REACT_DESCRIPTION,
memory=vector_memory,
verbose=True,
agent_kwargs={"system_message": "你是电商客服,可检索历史对话,回答用户历史订单问题"}
)
# 测试(模拟查询1周前的订单)
vector_agent.run("我上周查过的订单,现在状态变了吗?") # Agent检索历史,找到“订单号OD-12345”,调用工具查询最新状态
四、记忆模块场景适配指南
1. 业务场景 - 记忆类型匹配表
| 业务场景 | 对话轮数 | 核心需求 | 推荐记忆类型 | 关键配置参数 |
|---|---|---|---|---|
| 快递查询 / 简单订单咨询 | ≤5 轮 | 信息完整,响应快 | 对话缓冲记忆 | return_messages=True |
| 产品功能咨询 / 售后问题 | 5-10 轮 | 平衡记忆与性能 | 窗口对话记忆 | k=5(保留 5 轮) |
| 技术故障排查 / 项目沟通 | 10-20 轮 | 压缩 Token,保留核心信息 | 对话总结记忆 | 用 glm-4 提升总结精度 |
| 医疗问诊 / 企业客户跟进 | >20 轮 / 海量历史 | 无长度限制,精准检索 | 向量检索记忆 | search_kwargs={"k": 3} |
2. 混合记忆策略(复杂场景适配)
对 “长对话 + 关键信息必须保留” 的场景(如 “企业大客户专属客服”),可组合多种记忆:
- 窗口记忆:保留最近 5 轮对话,确保实时交互流畅;
- 向量检索记忆:存储用户历史订单、偏好等关键信息,支持随时检索;
- 总结记忆:压缩 5 轮前的冗余对话,控制整体 Token 消耗。
五、记忆模块优化与避坑指南
1. 常见问题与解决方案
| 问题现象 | 根本原因 | 解决方案 |
|---|---|---|
| Agent 响应越来越慢 | 记忆未压缩,Token 占用过高 | 切换为总结记忆 / 窗口记忆,设置k=3-5 |
| 关键信息(如订单号)丢失 | 窗口记忆k值过小 / 总结遗漏细节 |
1. 增大k值至 5;2. 优化总结 Prompt:“必须保留订单号、地址等关键信息” |
| 向量记忆检索结果不相关 | Embedding 模型不适配中文 / 检索参数不当 | 1. 换用 BAAI/bge-small-zh-v1.5;2. 调整k=2-3 |
| 记忆与工具调用脱节 | 未明确 “记忆关联工具参数” | 在 system prompt 添加:“记忆中有关键参数(如订单号)时,自动调用对应工具” |
2. 核心优化技巧
- 关键信息标记:在对话中对 “订单号、用户 ID” 等核心信息加标记(如
【关键】订单号OD-12345),提升检索优先级; - 定期记忆清理:对向量记忆库,定期删除 30 天以上的过期对话,减少存储与检索压力;
- 性能监控:统计不同记忆类型的 Token 消耗(如总结记忆比缓冲记忆少 70% Token),按场景动态切换。
更多推荐


所有评论(0)