AI Agent 入门:手把手实现 ReAct 模式(思考→行动→观察循环)
2026 年最热的技术方向就是 AI Agent。而所有 Agent 的基石,是一个叫 ReAct 的循环模式。这篇文章用最小 Python 代码,带你从零实现一个能"思考、调用工具、观察结果"的 Agent。
一、背景:Agent 为什么"聪明"
你有没有发现,直接问大模型"帮我查一下北京的天气并订机票",它做不到——因为大模型本身不能执行动作,只能生成文字。
ReAct(Reasoning + Acting,2022 年提出)解决的就是这个问题:让大模型在"思考"和"行动"之间交替,通过调用外部工具(API、数据库、代码)来真正完成任务。
二、核心原理:Thought→Action→Observation
ReAct 循环的三个阶段:
- Thought(思考):模型分析当前状态,决定下一步做什么
- Action(行动):模型输出一个工具调用(如 search(“北京天气”))
- Observation(观察):系统执行工具,把结果返回给模型
如此循环,直到模型认为任务完成,输出最终答案。
Thought: 用户想查北京天气,我需要调用天气查询工具
Action: search_weather("北京")
Observation: 北京今天 28°C,晴
Thought: 天气已获取,可以回答用户了
Answer: 北京今天 28°C,天气晴朗 ☀️
三、代码实战:最小 ReAct 引擎
class ReActAgent:
def __init__(self, tools):
self.tools = tools # 工具注册表
self.max_steps = 5 # 最大循环步数(防死循环)
def think(self, query, history):
# 真实场景这里调用 LLM;此处用规则模拟"思考"
for name, fn in self.tools.items():
if name in query:
return f"ACTION: {name}({query.split(name)[1].strip()})"
return "ANSWER: 我无法处理这个请求"
def run(self, query):
history = []
for _ in range(self.max_steps):
step = self.think(query, history)
print(f"Thought → {step}")
if step.startswith("ACTION:"):
action = step[7:].strip()
tool, arg = action.split("(", 1)
arg = arg.rstrip(")")
obs = self.tools[tool](arg) # 执行工具
print(f"Observation → {obs}")
history.append(obs)
elif step.startswith("ANSWER:"):
return step[7:].strip()
return "达到最大步数,任务未完成"
# 定义工具
tools = {"search_weather": lambda city: f"{city} 今天 28°C,晴"}
agent = ReActAgent(tools)
print("最终回答:", agent.run("帮我查一下 search_weather 北京"))
防死循环:max_steps 限制循环次数是工程必备——真实 Agent 中模型可能反复调用同一个工具,必须有兜底。
四、关键经验(避坑)
- 工具描述要清晰:模型靠描述决定调哪个工具,描述写得好调用才准
- 参数要校验:工具收到的参数必须做类型和范围校验,防注入
- 循环必须有上限:无限制的 Agent 会烧光你的 Token
- 观察结果要结构化:返回给模型的观察结果格式要统一,便于它理解
- 可观测性:记录每一步的 Thought/Action/Observation,出问题才能回溯
五、完整系列推荐
本文选自《AI Agent 工程实战:从 LLM API 到生产级智能体》100 期系统教程,覆盖 ReAct、工具调用、RAG、MCP、多智能体、生产部署,每期配可运行 Python 仿真。
该系列及 65+ 技术知识库已在 ima 知识号发布,搜索「Kruptos」即可订阅。
8 款 AI 技能(含 self-evolving-agent 自进化 Agent、humanize-writing 去 AI 味写作)已上线 ima 技能广场,搜索即装。
作者:Kruptos(西电毕业,13 年无线通信/DSP/嵌入式科研,现深耕 AI 与云原生)
原创内容,转载注明出处。
&spm=1001.2101.3001.5002&articleId=163995482&d=1&t=3&u=26466aaad9b247e18726604d6dc421c6)
447

被折叠的 条评论
为什么被折叠?



