大模型速通学习笔记(60)
本集聚焦 Agent 三大核心组件(记忆 / 工具 / 决策)的深度协同,核心解决 “记忆与工具调用脱节”“多场景下组件适配混乱”“复杂任务中状态丢失” 三大痛点。通过构建 “记忆保留关键信息→决策调用匹配工具→工具结果反哺记忆” 的闭环,让 Agent 在多轮复杂任务(如客户订单全流程管理、医疗随访)中既保持交互连贯性,又具备高效执行能力,适配企业级高要求业务场景。
·
LangChain AI Agent 记忆 - 工具 - 决策协同实战:全链路优化与落地
一、核心主题定位
本集聚焦 Agent 三大核心组件(记忆 / 工具 / 决策)的深度协同,核心解决 “记忆与工具调用脱节”“多场景下组件适配混乱”“复杂任务中状态丢失” 三大痛点。通过构建 “记忆保留关键信息→决策调用匹配工具→工具结果反哺记忆” 的闭环,让 Agent 在多轮复杂任务(如客户订单全流程管理、医疗随访)中既保持交互连贯性,又具备高效执行能力,适配企业级高要求业务场景。
二、协同核心逻辑与价值
1. 协同底层逻辑(三步闭环)
- 记忆锚定关键信息:记忆模块(如向量 + 窗口混合记忆)优先存储工具调用所需参数(如订单号、客户 ID)与用户偏好,为决策提供依据;
- 决策匹配工具与记忆:决策框架(ReAct+TOT)基于当前需求与记忆信息,判断是否调用工具(如 “记忆中有订单号→直接调用物流查询工具”);
- 工具结果更新记忆:工具执行结果(如物流状态 “已签收”)实时回写记忆,为后续交互(如 “确认收货反馈”)提供状态支撑。
2. 协同核心价值
- 无感知交互:用户无需重复提供关键信息(如多次咨询同一订单,无需反复说订单号);
- 工具调用精准:决策层基于记忆自动补全工具参数,避免 “参数缺失→追问用户” 的低效循环;
- 复杂任务闭环:跨步骤任务(如 “下单→付款提醒→物流跟踪→售后反馈”)中,记忆持续保留状态,决策与工具协同推进流程。
三、核心实操:记忆 - 工具 - 决策协同落地
以 “企业客户订单管理 Agent” 为例,整合 “窗口 + 向量混合记忆”“多订单工具”“ReAct 决策框架”,实现 “订单查询→物流跟踪→售后申请” 全流程协同。
1. 环境准备
bash
运行
# 核心依赖(延续前序环境,补充工具扩展依赖)
pip install langchain==0.1.10 langchain-community==0.0.30 zhipuai chromadb sentence-transformers
2. 完整代码实现
(1)组件初始化(记忆 / 工具 / LLM)
python
运行
from langchain_community.llms import ZhipuAI
from langchain.memory import ConversationBufferWindowMemory, VectorStoreRetrieverMemory
from langchain.vectorstores import Chroma
from langchain.embeddings import HuggingFaceEmbeddings
from langchain_core.tools import Tool
from langchain.agents import initialize_agent, AgentType
# 1. 初始化混合记忆(窗口记忆+向量记忆)
# 窗口记忆:保留最近3轮实时交互
window_memory = ConversationBufferWindowMemory(
return_messages=True,
memory_key="chat_history",
k=3,
input_key="input"
)
# 向量记忆:存储历史关键信息(订单号、客户偏好)
embedding = HuggingFaceEmbeddings(model_name="BAAI/bge-small-zh-v1.5")
vector_db = Chroma(embedding_function=embedding, persist_directory="./order_agent_memory")
vector_retriever = vector_db.as_retriever(search_kwargs={"k": 2})
vector_memory = VectorStoreRetrieverMemory(
retriever=vector_retriever,
memory_key="chat_history",
input_key="input"
)
# 混合记忆:合并窗口与向量记忆(通过Agent Prompt关联)
def get_hybrid_memory(input_text):
# 向量记忆检索历史关键信息
vector_context = vector_memory.load_memory_variables({"input": input_text})["chat_history"]
# 窗口记忆获取近期交互
window_context = window_memory.load_memory_variables({"input": input_text})["chat_history"]
return {"chat_history": window_context + vector_context}
# 2. 定义订单管理工具(3个核心工具)
# 工具1:订单状态查询
def order_status_tool(order_id: str) -> str:
mock_data = {"OD-20240501": "已付款", "OD-20240502": "已发货", "OD-20240503": "已签收"}
return f"订单{order_id}状态:{mock_data.get(order_id, '订单号不存在')}"
# 工具2:物流跟踪
def logistics_tool(order_id: str) -> str:
mock_data = {
"OD-20240501": "待发货(预计24小时内发出)",
"OD-20240502": "运输中(当前位置:北京朝阳区→上海浦东新区)",
"OD-20240503": "已签收(签收时间:2024-05-04 15:30)"
}
return f"订单{order_id}物流:{mock_data.get(order_id, '无此订单物流信息')}"
# 工具3:售后申请(仅支持已签收订单)
def after_sales_tool(order_id: str, reason: str) -> str:
status = order_status_tool(order_id)
if "已签收" in status:
return f"订单{order_id}售后申请提交成功,原因:{reason},预计1-3个工作日处理"
return f"订单{order_id}当前状态({status})不支持售后申请,仅已签收订单可申请"
# 工具列表(明确参数要求)
tools = [
Tool(
name="order_status",
func=order_status_tool,
description="查询订单状态,必须传入订单号(如OD-20240501)"
),
Tool(
name="logistics_track",
func=logistics_tool,
description="跟踪订单物流,必须传入订单号(如OD-20240501)"
),
Tool(
name="after_sales_apply",
func=after_sales_tool,
description="提交售后申请,必须传入订单号和申请原因(如“质量问题”)"
)
]
# 3. 初始化核心LLM(决策驱动)
llm = ZhipuAI(
model="glm-4",
api_key="你的API_KEY",
temperature=0.2,
timeout=30
)
(2)Agent 构建与协同测试
python
运行
# 1. 构建协同Agent(融合记忆/工具/决策)
agent = initialize_agent(
tools=tools,
llm=llm,
agent=AgentType.CHAT_CONVERSATIONAL_REACT_DESCRIPTION,
memory=window_memory, # 主记忆用窗口,向量记忆通过Prompt关联
verbose=True,
agent_kwargs={
"system_message": """
你是企业客户订单管理Agent,需按以下规则协同工作:
1. 记忆协同:先通过历史对话(含向量记忆中的订单号)获取关键参数,无参数再追问用户;
2. 工具决策:
- 查状态→调用order_status;
- 查物流→调用logistics_track;
- 售后申请→先查订单状态(调用order_status),已签收再调用after_sales_apply;
3. 结果回写:工具执行结果需同步到记忆,供后续交互使用。
""",
"human_message_template": "{input}\n(历史关键信息参考:{chat_history})"
}
)
# 2. 多轮协同测试(验证记忆-工具-决策闭环)
print("=== 第一轮:首次查询订单 ===")
agent.run("帮我查下OD-20240502的状态") # 调用order_status,结果回写记忆
# 向量记忆存储“订单号OD-20240502”
print("\n=== 第二轮:跟踪同一订单物流 ===")
agent.run("那它的物流到哪了?") # 记忆自动关联“OD-20240502”,直接调用logistics_track
print("\n=== 第三轮:申请售后(隔天后,记忆保留订单号) ===")
agent.run("我想申请售后,原因是包装破损") # 向量记忆检索到“OD-20240502”,先查状态再提交售后
四、核心场景适配与组件组合方案
1. 场景 - 组件组合表
| 业务场景 | 记忆组合 | 工具类型 | 决策框架 | 核心优势 |
|---|---|---|---|---|
| 电商客户订单管理 | 窗口记忆(近期交互)+ 向量记忆(订单号) | 订单查询 / 物流 / 售后 | ReAct | 无需重复输入订单号,流程连贯 |
| 医疗患者随访 | 总结记忆(病情总结)+ 向量记忆(病史) | 预约挂号 / 用药提醒 / 报告查询 | ReAct+TOT | 保留关键病史,避免重复问诊 |
| 企业项目管理 | 窗口记忆(任务进度)+ 总结记忆(会议纪要) | 任务分配 / 进度跟踪 / 文件共享 | TOT | 跨部门协作中状态不丢失 |
2. 关键适配原则
- 参数驱动场景(如订单 / 医疗):优先用 “向量记忆存储关键参数 + 窗口记忆保留近期交互”,确保参数不丢失;
- 流程驱动场景(如项目管理):优先用 “总结记忆压缩流程节点 + 窗口记忆保留实时进度”,平衡效率与细节;
- 高风险场景(如金融 / 医疗):决策层需增加 “记忆信息校验” 步骤(如 “确认记忆中的订单号是否为当前查询订单”),避免误操作。
五、协同落地避坑与优化指南
1. 常见问题与解决方案
| 问题现象 | 根本原因 | 解决方案 |
|---|---|---|
| 记忆与工具参数不匹配 | 记忆存储的参数名与工具要求不一致 | 统一参数名(如记忆与工具均用 “order_id”),在 Prompt 中明确 “从记忆提取 order_id 作为工具参数” |
| 多记忆协同冲突 | 窗口记忆与向量记忆信息重复 / 矛盾 | 在 Agent Prompt 中定义优先级(如 “窗口记忆信息优先于向量记忆,矛盾时询问用户”) |
| 工具结果未回写记忆 | 未明确记忆更新逻辑 | 工具执行后,通过memory.save_context手动回写结果(如 “将物流状态‘已签收’存入记忆”) |
| 决策层忽略记忆信息 | Prompt 未强调 “优先使用记忆信息” | 在 system_message 中添加 “必须先检查记忆中的关键信息,无相关信息再追问” 的强制约束 |
2. 核心优化技巧
- 参数自动提取:在 Prompt 中添加 “从记忆文本中提取工具所需参数(如 order_id:XXX)”,减少决策层理解成本;
- 记忆更新触发:设置 “工具调用成功→自动回写记忆” 的钩子函数,无需手动干预;
- 协同日志监控:记录 “记忆读取→决策判断→工具调用→记忆更新” 全链路日志,便于定位协同断点。
更多推荐



所有评论(0)