LangChain AI Agent 记忆 - 工具 - 决策协同实战:全链路优化与落地

一、核心主题定位

本集聚焦 Agent 三大核心组件(记忆 / 工具 / 决策)的深度协同,核心解决 “记忆与工具调用脱节”“多场景下组件适配混乱”“复杂任务中状态丢失” 三大痛点。通过构建 “记忆保留关键信息→决策调用匹配工具→工具结果反哺记忆” 的闭环,让 Agent 在多轮复杂任务(如客户订单全流程管理、医疗随访)中既保持交互连贯性,又具备高效执行能力,适配企业级高要求业务场景。


二、协同核心逻辑与价值

1. 协同底层逻辑(三步闭环)

  1. 记忆锚定关键信息:记忆模块(如向量 + 窗口混合记忆)优先存储工具调用所需参数(如订单号、客户 ID)与用户偏好,为决策提供依据;
  2. 决策匹配工具与记忆:决策框架(ReAct+TOT)基于当前需求与记忆信息,判断是否调用工具(如 “记忆中有订单号→直接调用物流查询工具”);
  3. 工具结果更新记忆:工具执行结果(如物流状态 “已签收”)实时回写记忆,为后续交互(如 “确认收货反馈”)提供状态支撑。

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)”,减少决策层理解成本;
  • 记忆更新触发:设置 “工具调用成功→自动回写记忆” 的钩子函数,无需手动干预;
  • 协同日志监控:记录 “记忆读取→决策判断→工具调用→记忆更新” 全链路日志,便于定位协同断点。
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐