本文聚焦 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 TD
A[用户输入] --> B["LLM 推理出 Action(选择工具 + 输入)"] --> C["执行 Tool 获取 Observation(反馈结果)"] --> D["拼接进 scratchpad(中间记忆)"] --> E["再次送入 LLM,循环直到返回 Final Answer"]
每一轮中间步骤会拼接到 Prompt 中,驱动模型完成下一轮推理。
示例思维链 Prompt 样式(ReAct):
makefile
Question(用户输入): 12 * 7 是多少?
Thought(推理): 我需要进行计算
Action(行动): Calculator[input=12*7]
Observation(观察): 84
Thought(再推理): 我已经知道答案了
Final Answer: 84
四、实战:基于 ReAct 构建一个 AgentExecutor
✅ 步骤 1:定义 Tool
python
from langchain_core.tools import Tool
def 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
python
import os
from langchain_core.prompts import PromptTemplate
from langchain.agents import AgentExecutor, create_react_agent
from 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 类型的 Agent
agent = 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 执行任务
python
response = executor.invoke({"input": "帮我计算 19 乘以 21 是多少?"})
print("最终输出结果:", response["output"])
示例输出(含中间推理):

五、scratchpad:中间记忆的核心
/ˈskrætʃpæd/ (音似"斯克软奇-帕德")
scratchpad
是 AgentExecutor 拼接的中间思维链:
text
"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 系统、接入外部插件、实现复杂状态的维护与控制,从而构建功能更丰富、行为更可控的智能体系统。