别再只会调 LLM 了:从 ReAct 到 AI Agent 的完整实践
ReAct 并不是某种框架或组件,而是一种 推理-行动循环模式。思考 Thought分析当前问题,判断下一步该做什么行动 Action 调用某个工具或执行某个操作观察 Observation 获取工具返回的结果答案 Final Answer 当信息足够时,输出最终结论这种模式的核心价值在于:将语言模型的推理能力与外部工具的执行能力结合起来。ReAct 并不是一个固定的模块划分,而是一种让 LLM
本文通过一个完整的 LangChain 实例,讲解 AI Agent 的核心工作机制,并从 ReAct 推理范式出发,展示 Agent 如何进行思考、工具调用与记忆管理。

在上一篇博客中,我们已经介绍了 AI Agent 所依赖的前置知识,包括大模型、工具调用和基础推理能力。本篇将进一步通过一个完整可运行的示例,来说明:一个 AI Agent 到底是如何被构建出来的,它在执行过程中究竟在做什么。
一 )ReAct 模式
在构建 Agent 之前,首先需要理解一个非常重要的推理范式:ReAct(Reasoning and Acting)。
1.1 什么是 ReAct?
ReAct 并不是某种框架或组件,而是一种 推理-行动循环模式。在这种模式下,大模型不再一次性生成答案,而是按照如下流程不断循环:
- 思考 Thought 分析当前问题,判断下一步该做什么
- 行动 Action 调用某个工具或执行某个操作
- 观察 Observation 获取工具返回的结果
- 答案 Final Answer 当信息足够时,输出最终结论
这种模式的核心价值在于:将语言模型的推理能力与外部工具的执行能力结合起来。

ReAct 并不是一个固定的模块划分,而是一种让 LLM 在 思考(Thought)—行动(Action)—观察(Observation) 之间循环的推理模式,直到模型认为可以给出最终答案(Final Answer)。
二 )什么是 Agent ?
2.1 Agent 的本质
一个 AI Agent 并不等同于一次 LLM 调用,它通常具备以下特征:
- 能够根据目标进行 多步推理
- 能够 自主选择并调用工具
- 能够在多轮交互中 维护状态(记忆)
基本可以这么认为,ReAct 负责怎么想,Agent 负责怎么做,ReAct 规定好的解决用户问题的流程,一个问题被解决必须经过 ReAct 规定好步骤;至于 ReAct 规定好的每一步怎么完成,需要通过 LLM 来实现。
2.2 使用 LangChain 构建第一个 Agent
Agent 是一种通用的系统设计思想,而 LangChain 只是其中一个实现框架,本文这里使用 LangChain 框架进行构建 Agent,对于 LangChain 相关技术的详细探讨之后会出有详细的博客进行讲解。
① 定义一个 LLM
首先定义一个用于推理和决策的大模型,这里使用 Azure OpenAI 提供的 Chat 模型,该 LLM 将作为 Agent 的“大脑”,负责分析问题并决定是否调用工具。
from langchain.agents import initialize_agent
from langchain.agents import AgentType
from langchain_openai import AzureChatOpenAI
from langchain_community.agent_toolkits.load_tools import load_tools
from dotenv import load_dotenv
import os
load_dotenv("peizhi.env")
endpoint = os.getenv("ENDPOINT")
deployment = os.getenv("DEPLOYMENT")
api_key = os.getenv("SUBSCRIPTION_KEY")
api_version = os.getenv("API_VERSION", "2025-01-01-preview")
if not all([endpoint, deployment, api_key]):
raise RuntimeError("ENDPOINT/DEPLOYMENT/SUBSCRIPTION_KEY 未配置,检查 peizhi.env")
# 定义 llm
llm = AzureChatOpenAI(
azure_endpoint=endpoint,
api_key=api_key,
api_version=api_version,
azure_deployment=deployment,
temperature=0.2,
)
② 为 Agent 配置可调用工具
serpapi_api_key = os.getenv("SERPAPI_API_KEY")
tool_names = ["llm-math"]
if serpapi_api_key:
tool_names.insert(0, "serpapi")
tools = load_tools(tool_names, llm=llm, serpapi_api_key=serpapi_api_key)
else:
tools = load_tools(tool_names, llm=llm)
print("提示:未配置 SERPAPI_API_KEY,已跳过 serpapi 工具;如果需要联网搜索,把 SERPAPI_API_KEY=... 写到 peizhi.env")
这里举例使用了 "llm-math" 能力和 "serpapi" 实时上网的能力,Agent 的关键能力之一,是能够调用外部工具。这里配置两个工具:
-
serpapi:用于实时搜索 -
llm-math:用于数学计算
这些工具本质上是 LLM 可调用的函数接口,Agent 会在推理过程中自行决定是否使用它们。
③ 实例化一个 Agent
agent = initialize_agent(
tools,
llm,
agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, # 这里有不同的类型
verbose=True, # 是否打印日志
handle_parsing_errors=True,
)
print(agent.invoke({"input": "Iphone 15 价格的平方是多少?"}))
ZERO_SHOT_REACT_DESCRIPTION 表示使用 ReAct 推理范式,并通过工具描述让模型零样本理解如何使用工具。
2.3 执行过程分析
当输入问题:
Iphone 15 价格的平方是多少?
Agent 的执行流程如下:
-
Thought:判断需要先获取年龄信息
-
Action:调用搜索工具
-
Observation:得到售价为 5999
-
Thought:需要进行数学计算
-
Action:调用计算工具
-
Observation:得到结果 35999001
-
Final Answer:输出最终答案

LangChain 框架首先使用LLM分析问题,然后采取行动 Action ,搜索年龄,通过观察 Obsservation 得到售价为 5999 元;然后 Thought,Action 调用计算工具 Calculate ,观察计算结果为 35988001 ;然后 Thought ,发现不需要 采取行动 Action ,即直接得到 Final Answer。
三) 给 Agent 添加记忆 Memery
如果说前面的 Agent 只能完成一次任务,那么 Memory 让 Agent 具备了持续交互能力。主要的实现方式就是通过 Langchain 中的 memory 组件来实现
from langchain.memory import ConversationBufferMemory
# 记忆组件
memory = ConversationBufferMemory(memory_key="chat_history", return_messages=True)
# 修改:初始化 Agent 时传入 memory 参数
agent = initialize_agent(
tools,
llm,
agent=AgentType.CONVERSATIONAL_REACT_DESCRIPTION,
verbose=True,
handle_parsing_errors=True,
memory=memory, # 新增:传入记忆组件
)
# 测试1:初始问题
print("===== 第一次提问 =====")
result1 = agent.invoke({"input": "Iphone 15 价格的平方是多少?"})
print(result1)
# 测试2:基于上下文的提问(验证记忆是否生效)
print("\n===== 第二次提问(依赖上下文) =====")
result2 = agent.invoke({"input": "刚才我问了什么问题?"})
print(result2)
将该 memory 注入 Agent 后,模型就可以在后续问题中引用之前的上下文。测试结果表明,第二次提问可以正确基于第一次的计算结果进行推理,说明记忆机制已经生效。
测试结果:

AI Agent 的核心不在于对话本身,而在于通过 ReAct 推理范式,将大模型的思考能力与工具执行和记忆机制结合,构建一个真正可持续决策与行动的智能体。
更多推荐


所有评论(0)