ReAct:教小雅"想一步、做一步、看结果"
给它装上「侦探脑」——智能体真正的核心
上一节,小雅查天气靠"编"。这一节,我们给它换一套脑回路——侦探脑。
好侦探破案,从不张口就说凶手是谁。他想一条线索 → 去做一次验证 → 看结果 → 再想下一步……一步步逼近真相。
这套"边想边做"的功夫,就是智能体真正的核心,它有个名字:ReAct。装上它,你会第一次看见小雅真的去查、再回答。
ReAct = Reason(想)+ Act(做)
ReAct 是 2022 年由普林斯顿大学和 Google 的研究者提出的方法,现在几乎是所有智能体的"标配脑回路"。它的循环只有三步,转个不停:
想(Reason) → 做(Act) → 看(Observe) → 回到"想"……直到任务完成。
- 想:它先在心里盘算"我现在缺什么信息、下一步该干嘛"
- 做:根据盘算,选一个工具去执行(比如"查天气")
- 看:拿到工具返回的真实结果
- 然后带着新结果再想一轮,而不是凭空下结论
对比一下两种答题方式:
- 没有 ReAct(上一节的小雅):闭卷考试还硬答——凭记忆瞎写,容易编。
- 有了 ReAct:开卷考试——"这题我不确定 → 翻到相关那页 → 看到答案 → 再下笔"。
这正是 ReAct 最大的好处:它把"凭空想"和"真实信息"连了起来,显著减少幻觉——它不再需要编,因为它可以去查。
看一眼小雅的"侦探脑"在转(注意:它转了好几圈)
ReAct 的威力,要在需要好几步的任务上才看得出来。我们换个稍复杂的问题——"明天适不适合去爬香山",看小雅怎么一圈一圈逼近答案:
看清楚没?它没有一口气答,而是:查到天气好 → 但意识到还差一个信息 → 再去查开放时间 → 两件事都齐了才下结论。这种"看到结果、发现还差点、再去补"的循环,正是 ReAct 比"一次性联想"强的地方。 一个普通聊天机器人会直接说"应该可以吧"——因为它既不会查,也不会"想想还缺啥"。
🙌 动手:在扣子里打开小雅的"侦探脑"
不用写代码,低代码平台已经把 ReAct 这套循环内置好了,你只要给它"装上手"并允许它多步执行:
- 打开你在扣子里建的 小雅,进编排/编辑页。
- 给它添加「联网搜索」插件(这就是它"查"的那只手)。
- 允许它走多步:在编排里启用平台的智能体/规划能力,让它能"查完再想、想完再查",而不是答一句就停(扣子 2.0 提供了这类多步规划能力;具体入口名称以官网当前界面为准)。
- 问它一句需要现查、还得查不止一处的话,比如"明天适不适合去香山"或"今天有什么和 AI 相关的大新闻"。
- 观察执行步骤:它会先搜、看结果、再决定要不要补一刀,最后才回答。
✅ 你会亲眼看到:小雅不再张口就编,而是一步步查清楚再答。这就是 ReAct 在干活。
📸 低代码平台界面会更新,按"找到对应功能"的思路操作即可;上线版本会配当前截图。
🔧 手写一个迷你 ReAct(可运行)
撕开所有框架,ReAct 的内核朴素得惊人——就是一个循环:让模型反复"想 + 选工具",你来执行、把结果喂回去,直到它能回答。下面这段 Python 可以直接复制运行(用 DeepSeek 或任意 OpenAI 兼容接口,pip install openai,把 你的KEY 换掉):
# pip install "openai>=1.0"
import json
from openai import OpenAI
client = OpenAI(api_key="你的KEY", base_url="https://api.deepseek.com")
MODEL = "deepseek-chat"
# 给它一个工具:联网搜索(这里用假数据演示,真实项目换成搜索 API)
def web_search(query: str) -> str:
return f"(示例结果)关于「{query}」:明天北京晴,15–22℃;香山正常开放 8:00–17:00。"
SYSTEM = """你是一个按 ReAct 方式工作的智能体。每一步只回复一行 JSON:
- 需要查信息时:{"thought": "你的思考", "action": "web_search", "action_input": "查询词"}
- 已经能回答时:{"thought": "你的思考", "answer": "给用户的最终回答"}
可用工具:web_search(查询词) —— 联网搜索实时信息。"""
def react(question: str, max_steps: int = 5) -> str:
messages = [{"role": "system", "content": SYSTEM},
{"role": "user", "content": question}]
for _ in range(max_steps): # ← 步数上限,防止它绕圈子
reply = client.chat.completions.create(
model=MODEL, messages=messages,
response_format={"type": "json_object"},
).choices[0].message.content
try:
data = json.loads(reply) # JSON 模式偶尔会返回空/截断,兜一下底
except (json.JSONDecodeError, TypeError):
return f"(模型这步没给出规范 JSON,原文:{str(reply)[:80]}…)"
print("🤔 想:", data["thought"])
if data:
data[]
obs = web_search(data[])
(, data[], , obs)
messages.append({: , : reply})
messages.append({: , : })
__name__ == :
(, react())
运行后你会看到它一圈圈地想→做→看:
🤔 想: 我需要明天的天气和香山的开放情况,先查一下
✋ 做: web_search → 👀 看: (示例结果)…明天北京晴…香山 8:00–17:00…
🤔 想: 信息够了,可以回答了
💬 答: 适合去!明天北京晴、15–22℃,香山 8:00–17:00 正常开放,记得带件外套。
对照前面那张思考轨迹图——for 循环就是"反复想做看",max_steps 就是给它的"别绕圈子"刹车。所谓"智能体框架",很大程度就是把这个循环 + 工具管理包装得更顺手。看懂这 30 行,你就再也不会觉得智能体神秘了。
有时小雅会陷进死循环——反复查同一个东西、或越想越偏。所以工程上一定会设一个步数上限(比如最多想做 6 轮),到了就停下来给出当前最好的答案。放手让它想,但别让它无限转。
任务是『帮我决定周末去哪个城市玩更划算』。请你用 ReAct 的『想→做→看』格式,写出一个智能体大概会怎么一步步思考和调用工具(比如查天气、查票价、查景点),每一步标明是 想/做/看。
小雅终于学会了像侦探一样想一步、做一步、看结果——这是它从"联想机"进化成"智能体"的关键一跳,也是这门课最重要的一节之一。
但你可能注意到了:刚才它能查天气,靠的是我们给它装的那一个"联网搜索"。可这只"手"到底是怎么装上去的?
下一节,我们彻底搞懂"给智能体装手"的原理——还会给你一份能直接复制运行的代码,亲手让小雅学会调用工具(比如用计算器精确算账)。
