掘金 人工智能 前天 17:03
LangChain 设计原理分析⁷ | Agent 架构设计详解:决策循环与 ReAct
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

本文深入解析了LangChain Agent架构的核心执行逻辑,重点阐述了AgentExecutor如何驱动LLM进行推理、工具调用以及中间态反馈循环。通过结合ReAct(推理与行动)思维链模式和scratchpad记忆机制,LangChain构建了具备决策能力的智能体系统。文章详细介绍了Agent的职责,包括接收输入、思考、选择工具、接收反馈和输出答案,并提供了实际代码示例,展示了如何定义工具、初始化Chat模型和AgentExecutor,以及调用AgentExecutor执行计算任务。此外,文章还强调了scratchpad作为中间记忆在构建模型行为链中的关键作用,并提供了提示设计建议,以优化Agent效果。

📝 LangChain Agent的核心是AgentExecutor,它作为整个系统的运行控制器,驱动LLM推理、工具调用和中间态反馈循环,实现智能体的决策能力。Agent的基本职责涵盖接收用户输入、进行思考、选择并调用工具、接收工具反馈以及判断是否输出最终答案。

🧠 LangChain默认采用ReAct(推理与行动)思维链模式,这种模式强调语言模型推理驱动工具调用,通过“思考-行动-观察”的循环执行,使智能体能够逐步解决复杂问题。scratchpad则作为Agent记录思考过程与工具反馈的中间文本,是模型进行下一步推理的关键记忆。

🛠️ 在实战部分,文章详细展示了如何基于ReAct模式构建AgentExecutor。这包括定义具有清晰描述和类型注解的Tool(如乘法计算工具),初始化Chat模型,并使用`create_react_agent`和`AgentExecutor.from_agent_and_tools`来构造和执行Agent。`verbose=True`的设置有助于观察Agent的行为路径。

💡 scratchpad在Agent执行机制中扮演着至关重要的角色,它将Agent的中间步骤(AgentAction和Observation)格式化并注入到Prompt中,使得LLM能够“看到”自己之前的操作,从而帮助其规划下一步行为,实现思维链的自然递进,有效支撑了Agent的上下文理解和决策过程。

🚀 通过对AgentExecutor.invoke()、BaseAgent.plan()、ReActAgent的重写以及Tool.invoke()等关键方法的梳理,文章揭示了Agent的执行调用栈。同时,文章还提供了使用描述性Tool docstring、控制scratchpad长度和开启verbose等提示设计建议,以帮助用户更好地调节Agent的效果。

本文聚焦 LangChain 中 Agent 架构的核心执行逻辑,深入解析 AgentExecutor 如何驱动 LLM 推理、工具调用与中间态反馈循环,结合 ReAct 思维链模式与 scratchpad 记忆机制,构建具备决策能力的智能体系统。


一、什么是 Agent?

Agent 是 LangChain 的高阶抽象,代表一种 具备工具调用能力、拥有上下文记忆、能进行决策思考的智能体结构

它的基本职责包括:

LangChain 中默认采用 ReAct(推理与行动的协同)思维链作为 Agent 的策略模式,强调 语言模型推理驱动工具调用 的循环执行。


二、Agent 架构核心组件

组件名称描述
AgentExecutor整个 Agent 系统的运行控制器(核心入口)
ReActAgent基于“思考-行动-观察”模式构建的默认 Agent
Tool可被 Agent 调用的外部函数模块
AgentAction模型当前决定使用的工具及输入
AgentFinish模型决定终止,输出最终结果
scratchpadAgent 记录思考过程与工具反馈的中间文本

三、执行机制: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"

其作用是:

LangChain 中 Agent 的 prompt 会动态地将 intermediate_steps(AgentAction + Observation 的步骤)格式化并注入。


六、相关类的执行调用栈梳理

类名关键方法描述
AgentExecutor.invoke()执行整个 Agent 流程
BaseAgent(抽象).plan()根据 prompt 决定下一步行为
ReActAgent重写 .plan()返回 AgentAction 或 AgentFinish
Tool.invoke(input)实际执行函数逻辑

七、提示设计建议(可调节 Agent 效果)


🔚 小结


接下来,我们将探索如何构建你自己的 Tool 系统、接入外部插件、实现复杂状态的维护与控制,从而构建功能更丰富、行为更可控的智能体系统。

Fish AI Reader

Fish AI Reader

AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

FishAI

FishAI

鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

联系邮箱 441953276@qq.com

相关标签

LangChain Agent ReAct LLM 工具调用 scratchpad
相关文章