本文聚焦 LangChain 中 Agent 架构的核心执行逻辑,深入解析
AgentExecutor
如何驱动 LLM 推理、工具调用与中间态反馈循环,结合 ReAct 思维链模式与 scratchpad 记忆机制,构建具备决策能力的智能体系统。
一、什么是 Agent?
Agent 是 LangChain 的高阶抽象,代表一种 具备工具调用能力、拥有上下文记忆、能进行决策思考的智能体结构。
它的基本职责包括:
- 接收用户输入使用语言模型进行思考(Reasoning)选择工具并调用(Acting)接收工具反馈继续推理(Observation)判断是否可以输出最终答案(Decision)
LangChain 中默认采用 ReAct(推理与行动的协同)思维链作为 Agent 的策略模式,强调 语言模型推理驱动工具调用 的循环执行。
二、Agent 架构核心组件
组件名称 | 描述 |
---|---|
AgentExecutor | 整个 Agent 系统的运行控制器(核心入口) |
ReActAgent | 基于“思考-行动-观察”模式构建的默认 Agent |
Tool | 可被 Agent 调用的外部函数模块 |
AgentAction | 模型当前决定使用的工具及输入 |
AgentFinish | 模型决定终止,输出最终结果 |
scratchpad | Agent 记录思考过程与工具反馈的中间文本 |
三、执行机制:AgentExecutor 决策循环
AgentExecutor
是 Agent 的运行引擎,它内部执行的循环大致如下:
graph TDA[用户输入] --> B["LLM 推理出 Action(选择工具 + 输入)"] --> C["执行 Tool 获取 Observation(反馈结果)"] --> D["拼接进 scratchpad(中间记忆)"] --> E["再次送入 LLM,循环直到返回 Final Answer"]
每一轮中间步骤会拼接到 Prompt 中,驱动模型完成下一轮推理。
示例思维链 Prompt 样式(ReAct):
Question(用户输入): 12 * 7 是多少?Thought(推理): 我需要进行计算Action(行动): Calculator[input=12*7]Observation(观察): 84Thought(再推理): 我已经知道答案了Final Answer: 84
四、实战:基于 ReAct 构建一个 AgentExecutor
✅ 步骤 1:定义 Tool
from langchain_core.tools import Tooldef multiply_tool(expr: str) -> str: """接收乘法表达式如 '8*6' 并返回结果""" try: expr = expr.strip().replace("'", '').replace('"', '') return str(eval(expr)) except Exception as e: print(f"输入的表达式:{expr.__repr__()} | 异常:{e}") return "表达式格式错误,请输入如 '3*7'"tool = Tool( name="乘法计算工具", # 工具名,必须是唯一的字符串 func=multiply_tool, # 工具执行函数 description="输入形如 '3*5' 的字符串,返回乘积" # 描述要清晰准确)
LangChain 工具需要带有类型注解和 docstring,用于 Agent 生成正确的调用参数。
✅ 步骤 2:初始化 Chat 模型和 AgentExecutor
import osfrom langchain_core.prompts import PromptTemplatefrom langchain.agents import AgentExecutor, create_react_agentfrom langchain_openai import ChatOpenAI# 初始化模型llm = ChatOpenAI( temperature=0.1, model='deepseek-chat', openai_api_key=os.getenv('DEEPSEEK_API_KEY'), openai_api_base='https://api.deepseek.com', max_tokens=1024)template = """你是一个可以通过工具来完成任务的智能 AI 助手,擅长推理、规划和执行。你的目标是尽可能准确地解决用户的问题。你可以访问以下工具:{tools}严格地使用以下格式进行思考与行动:Question: 用户的输入内容Thought: 你对当前问题的理解与推理Action: 选择调用的工具名称,应为 [{tool_names}] 之一Action Input: 务必准确的工具所需的输入Observation: 调用工具返回的结果...(Thought/Action/Action Input/Observation 可以重复多次)Thought: 根据观察得出的最终结论Final Answer: 给用户的直接答复开始!Question: {input}Thought: {agent_scratchpad}"""prompt = PromptTemplate.from_template(template)# 构造 ReAct 类型的 Agentagent = create_react_agent( llm=llm, tools=[tool], prompt=prompt)# 构造 AgentExecutor,控制执行过程executor = AgentExecutor.from_agent_and_tools( agent=agent, tools=[tool], verbose=True, # 打印推理过程 handle_parsing_errors=True)
✅ 步骤 3:调用 AgentExecutor 执行任务
response = executor.invoke({"input": "帮我计算 19 乘以 21 是多少?"})print("最终输出结果:", response["output"])
示例输出(含中间推理):
五、scratchpad:中间记忆的核心
/ˈskrætʃpæd/ (音似“斯克软奇-帕德”)
scratchpad
是 AgentExecutor 拼接的中间思维链:
"Thought: 用户需要计算19乘以21的结果,我可以使用乘法计算工具来完成这个任务。\nAction: 乘法计算工具\nAction Input: '19*21'\nObservation: 399"
其作用是:
- 让 LLM 看到自己曾经做了什么帮助 LLM 规划下一步行为让思维链自然递进(思考 → 执行 → 反馈 → 思考)
LangChain 中 Agent 的 prompt 会动态地将 intermediate_steps(AgentAction + Observation 的步骤)格式化并注入。
六、相关类的执行调用栈梳理
类名 | 关键方法 | 描述 |
---|---|---|
AgentExecutor | .invoke() | 执行整个 Agent 流程 |
BaseAgent (抽象) | .plan() | 根据 prompt 决定下一步行为 |
ReActAgent | 重写 .plan() | 返回 AgentAction 或 AgentFinish |
Tool | .invoke(input) | 实际执行函数逻辑 |
七、提示设计建议(可调节 Agent 效果)
- 使用描述性 Tool docstring,有助于 LLM 选择正确工具控制 prompt 中 scratchpad 长度,避免上下文过长开启
verbose=True
便于观察 Agent 行为路径若需更细粒度控制,可重写 Agent、Tool 或增加 Memory🔚 小结
- LangChain Agent 采用 ReAct 思维模式,支持 LLM+工具 协作式推理AgentExecutor 执行决策循环,驱动工具调用和上下文反馈scratchpad 是核心中间结构,构建模型的“短期记忆”实现智能体行为链只需组合模型、工具、AgentExecutor,即可实现可观察、可插拔、可调节的智能链路
接下来,我们将探索如何构建你自己的 Tool 系统、接入外部插件、实现复杂状态的维护与控制,从而构建功能更丰富、行为更可控的智能体系统。