在这里插入图片描述

为什么你的AI Agent像个"复读机"?揭秘ReAct框架:让大模型从"只会说"进化到"会思考更会动手"的终极密码——推理与行动协同,才是Agent真正的灵魂所在!

ReAct框架
推理与行动协同

什么是ReAct?
不只是Prompt模板

推理(Reasoning)
让模型会'想'

行动(Acting)
让模型会'做'

协同(Synergy)
1+1>2的魔法

为什么必须协同?
分离的代价

纯推理的困境
想得多做得少

纯行动的盲区
做得多想得少

协同的化学反应
动态反馈闭环

ReAct的运作机制
一步一思考

Thought
当前状态分析

Action
工具调用决策

Observation
结果反馈吸收

循环迭代
直到目标达成

实战:自动定价Agent
ReAct落地

场景拆解
定价的复杂性

工具设计
查库存/查竞品/算成本

推理链构建
多因素权衡

新手踩坑实录
你中招了吗

坑1:Thought写成了总结

坑2:Action和Observation脱节

坑3:循环不会终止

进阶心法
让ReAct更聪明

工具描述的学问

Few-shot示例设计

错误恢复机制

总结与展望
Agent的未来

目录

  1. 什么是ReAct?——不只是Prompt模板
  2. 为什么必须协同?——分离的代价
  3. ReAct的运作机制——一步一思考
  4. 实战:自动定价Agent——ReAct落地
  5. 新手踩坑实录——你中招了吗
  6. 进阶心法——让ReAct更聪明
  7. 写在最后

嗨,大家好呀,我是你的老朋友精通代码大仙。接下来我们一起学习 《大模型应用开发_动手做AI_Agent》,震撼你的学习轨迹!


“脑子会了,手不会”——这句话是不是戳中你了?

学编程的时候,看视频觉得"这有啥难的",一动手就"这报错是啥意思"。搞AI Agent开发也一样,很多人看完ReAct论文,觉得"不就是让模型先想后做嘛",结果自己一写Prompt,Agent要么变成"话痨"光说不练,要么变成"莽夫"瞎操作一通。

更扎心的是,现在大模型岗位面试必考Agent设计,ReAct几乎是必问考点。你要是说不出个所以然,或者只会背"Thought-Action-Observation"六个字,面试官那眼神你懂的。

但别慌,今天咱们就把ReAct扒开揉碎了讲。不整那些虚的学术定义,就从"为什么推理和行动必须绑在一起"这个核心问题出发,带你真正理解这个框架的精髓。


什么是ReAct?——不只是Prompt模板

点题

ReAct,全称Reasoning + Acting,是普林斯顿大学和Google Research在2022年提出的一个框架。但很多人对它的理解停留在表面——以为就是在Prompt里加几个"Thought:"、"Action:"的标签就完事了。

大错特错。

ReAct的本质是一种认知架构,它模拟的是人类解决问题时的真实思维模式:我们不是先想完所有步骤再动手,而是边想边做,根据反馈调整

人类解决问题

分析当前情况

决定下一步行动

执行并观察结果

目标达成了吗?

结束

看这个图,这就是ReAct的核心循环。不是单向的,是螺旋上升的

痛点分析

新手最容易犯的错,就是把ReAct当成静态的填空模板

我见过太多这样的Prompt:

请按以下格式回答:
Thought: [你的思考]
Action: [你的行动]
Observation: [观察结果]

问题:查询北京明天天气

然后模型输出:

Thought: 我需要查询北京明天的天气
Action: 调用天气API查询北京明天天气
Observation: 我不知道天气API是什么,无法执行

发现问题了吗?这个"Thought"根本就是废话,只是把问题重复了一遍。真正的推理应该是分析"我现在有什么信息、缺什么信息、怎么获取"。

更离谱的是,有些同学直接把ReAct和Chain-of-Thought(CoT)混为一谈。CoT是"一口气想完",ReAct是"想一步做一步看一步"。用CoT的思路写ReAct,Agent就会陷入"纸上谈兵"——想了一堆,但从不验证想法对不对。

解决方案/正确做法

理解ReAct的三个核心组件,以及它们动态绑定的关系:

组件 作用 关键特征
Thought 推理 基于当前所有信息,决定下一步该做什么
Action 行动 调用外部工具,改变环境或获取新信息
Observation 观察 接收Action的反馈,更新认知状态

关键区别:Thought必须是可执行的推理,而不是泛泛而谈。

正确的Thought长这样:

Thought: 用户问北京明天天气。我当前没有任何天气信息。
我需要先获取地理位置(北京),然后查询对应日期的天气预报。
可用工具中有get_weather(city, date),我应该调用它。

看到没?包含现状分析信息缺口识别工具选择理由

代码层面的正确姿势:

# ReAct循环的核心结构(伪代码)
def react_loop(query, tools, max_steps=10):
    context = f"问题:{query}\n"
    
    for step in range(max_steps):
        # 1. 生成Thought + Action
        prompt = build_react_prompt(context, tools)
        llm_output = llm.generate(prompt)
        
        thought, action = parse_output(llm_output)
        context += f"Thought: {thought}\nAction: {action}\n"
        
        # 2. 执行Action,获得Observation
        observation = execute_action(action, tools)
        context += f"Observation: {observation}\n"
        
        # 3. 检查是否完成
        if is_complete(thought, observation):
            return extract_answer(context)
    
    return "达到最大步数,未能完成"

重点:每一步的Thought都基于最新的Observation,形成实时反馈闭环

小结

ReAct不是Prompt模板,是认知-行动-反馈的动态循环系统。Thought的质量决定了Action的有效性,Observation又反过来塑造下一步的Thought。


为什么必须协同?——分离的代价

点题

这一节咱们解决一个根本问题:推理和行动,为什么不能分开做?先想完再做,或者先做再总结,不行吗?

答案是:真实世界太复杂,计划永远赶不上变化

35% 25% 20% 15% 5% 复杂任务的不确定性来源 信息不完整 环境动态变化 工具可能失败 目标需要澄清 其他意外

看这个饼图,这是我在实际项目中统计的Agent失败原因。超过三分之一是因为一开始的信息就不够——你不可能在动手前就想清楚所有事情。

痛点分析

误区一:先想后做(纯推理模式)

典型代表是早期的"Plan-and-Execute"架构。让模型先输出一个完整计划,然后按部就班执行。

坑在哪?看这个案例:

【用户请求】
"帮我订一张明天北京到上海的机票,要便宜的,早上出发"

【模型制定的计划】
1. 查询明天北京到上海的航班
2. 筛选早上出发的航班
3. 按价格排序选择最便宜的
4. 完成预订

【执行时遇到的问题】
- 步骤1返回:明天北京大雨,多个航班取消
- 步骤2发现:剩下的"早上出发"航班只剩商务舱,价格5000+
- 原计划完全失效,需要重新规划

计划是静态的,世界是动态的。没有实时反馈的推理,就像闭着眼睛开车

误区二:先做后想(纯行动模式)

有些同学走向了另一个极端:让模型直接输出Action,不给思考空间。

结果?Agent变成"工具调用狂魔":

Action: search("北京到上海机票")
Observation: 找到15个结果...

Action: search("北京到上海机票 便宜")
Observation: 找到12个结果...

Action: search("北京到上海机票 便宜 早上")
Observation: 找到8个结果...

...(无限循环,永远在搜索,从不做决定)

没有推理的约束,模型不知道"什么时候该停"、“什么信息够了”、“下一步该做什么”。

误区三:推理和行动脱节

最隐蔽的坑:形式上写了Thought和Action,但两者没有逻辑关联

Thought: 我应该比较不同航班的价格和时间
Action: search("北京到上海高铁")

Thought说要比较航班,Action去查高铁?这就是典型的脱节。模型在"应付格式",没有真正思考。

解决方案/正确做法

ReAct的协同机制,核心在于三个绑定

绑定一:Thought必须驱动Action

每个Action都必须能从Thought中找到明确的决策依据

Thought: 用户要"便宜"且"早上出发"的机票。
当前搜索结果中,CA1234(6:30出发,¥800)和MU5678(7:15出发,¥750)
符合时间要求。需要进一步比较总成本(是否含行李、机场距离等)。
我决定先查询CA1234的详细信息。

Action: get_flight_details("CA1234", "2024-01-15")

看到逻辑链条了吗?需求 → 筛选 → 比较维度 → 具体行动。

绑定二:Observation必须反馈给Thought

Observation不是终点,是下一轮推理的输入

工具/环境 大模型 工具/环境 大模型 Thought: 需要查询库存 Action: query_inventory("iPhone15") Observation: 库存100台,但Pro版本仅剩5台 Thought: 库存充足,但Pro版本紧张, 定价策略需考虑稀缺性溢价 Action: query_competitor_price("iPhone15 Pro") Observation: 竞品售价¥8999 Thought: 竞品¥8999,我们成本¥7500, Pro版本稀缺,建议定价¥9299

绑定三:循环必须可终止

协同不是无限循环,需要明确的终止条件

  • 目标达成(找到答案/完成任务)
  • 无法继续(工具失败/信息不足)
  • 达到安全限制(最大步数/成本上限)

代码实现:

class ReActController:
    def should_continue(self, thought, observation, step):
        # 终止条件1:模型认为已完成
        if "最终答案" in thought or "任务完成" in thought:
            return False
            
        # 终止条件2:工具返回错误且无法恢复
        if "error" in observation and "无法" in thought:
            return False
            
        # 终止条件3:步数限制
        if step >= self.max_steps:
            return False
            
        return True

小结

推理和行动分离,要么"想太多做太少"(计划失效),要么"做太多想太少"(盲目试错)。ReAct的协同,本质是用最小的行动成本获取最大的信息增益,让每一步都有的放矢。


ReAct的运作机制——一步一思考

点题

这一节咱们深入ReAct的"发动机",看看一个完整的推理-行动循环是怎么转起来的。

继续

结束

开始

初始化上下文

生成Thought:
分析现状+规划下一步

生成Action:
调用具体工具

执行工具

获得Observation

检查终止条件

输出最终答案

这个流程图就是ReAct的"心跳"。每一步都有明确的输入输出,形成确定性的状态机

痛点分析

新手在实现ReAct循环时,最常踩的坑是状态管理混乱

坑点一:上下文窗口爆炸

每一步都把Thought-Action-Observation塞进Prompt,几步之后就超长了。模型开始"失忆",重复之前的行动。

Step 1: 查询库存 → 结果A
Step 2: 查询竞品 → 结果B  
Step 3: 查询成本 → 结果C
Step 4: 又查询库存 → 结果A(重复了!模型忘了已经查过)

坑点二:Observation解析失败

工具返回的结果格式不统一,模型有时候理解错了,导致下一步Thought基于错误信息。

Observation: {"code": 200, "data": {"price": null, "msg": "商品下架"}}

模型可能只看到了"code": 200,以为成功,没注意到price: null

坑点三:Action格式不合法

模型输出的Action不是标准的JSON或预定格式,解析失败,循环中断。

Action: 我要调用查询价格的工具,参数是iPhone15
# 期望格式:{"tool": "query_price", "params": {"product": "iPhone15"}}

解决方案/正确做法

解决方案一:智能上下文压缩

不是所有历史都需要保留。可以采用摘要机制

def compress_context(history, current_step):
    if current_step <= 3:
        return history  # 前几步保留完整
    
    # 早期步骤摘要化
    early_summary = summarize(history[:-2])  # 用模型总结前面的大意
    recent_full = history[-2:]  # 最近两步保留完整
    
    return [early_summary] + recent_full

或者关键信息提取:只保留对当前决策有用的Observation。

解决方案二:Observation结构化

强制工具返回统一格式,并加一层验证和转换

class ToolResult:
    def __init__(self, raw_output):
        self.success = self._check_success(raw_output)
        self.data = self._extract_data(raw_output) if self.success else None
        self.error = self._extract_error(raw_output) if not self.success else None
    
    def to_observation(self):
        if self.success:
            return f"执行成功。结果:{json.dumps(self.data, ensure_ascii=False)}"
        else:
            return f"执行失败。原因:{self.error}。请调整策略重试。"

这样模型看到的Observation永远是语义清晰、结构统一的。

解决方案三:Action强制格式

Few-shot示例约束输出格式,加上解析容错

REACT_PROMPT_TEMPLATE = """
按以下格式思考并行动(严格遵循格式):

Thought: [分析当前情况,说明下一步要做什么]
Action: {{"tool": "工具名", "params": {{"参数名": "值"}}}}

可用工具:
{tools_description}

示例:
问题:查询北京天气
Thought: 我需要获取北京当前天气信息,应该使用天气查询工具。
Action: {{"tool": "get_weather", "params": {{"city": "北京"}}}}

Observation: {{"temperature": 25, "condition": "晴"}}
Thought: 已获取天气信息,可以直接回答用户。
Action: {{"tool": "finish", "params": {{"answer": "北京今天晴天,25度"}}}}

现在开始:
{context}
"""

def parse_action(text):
    # 容错解析:处理各种格式偏差
    patterns = [
        r'Action:\s*(\{.*?\})',  # 标准格式
        r'Action\s*=\s*(\{.*?\})',  # 等号变体
        r'```json\s*(\{.*?\})\s*```',  # 代码块
    ]
    for pattern in patterns:
        match = re.search(pattern, text, re.DOTALL)
        if match:
            try:
                return json.loads(match.group(1))
            except:
                continue
    return None  # 解析失败,触发重试或错误处理

小结

ReAct的可靠运行,依赖严格的格式约束智能的状态管理。把每一步的输入输出都管好了,循环才能稳定转起来。


实战:自动定价Agent——ReAct落地

点题

理论讲再多,不如一个实战案例。这一节咱们用电商自动定价这个场景,完整走一遍ReAct的设计和实现。

定价为什么适合ReAct?因为它信息分散、决策复杂、需要实时数据

  • 要知道成本(内部系统)
  • 要看竞品价格(外部抓取)
  • 要考虑库存(实时变化)
  • 要权衡利润和销量(策略选择)

库存紧张

库存充足

用户请求
给iPhone15定价

查成本
¥7000

查竞品
¥7999-8999

查库存
紧张/充足

决策

溢价策略
¥9299

渗透策略
¥8499

输出定价方案

痛点分析

没有ReAct的定价系统长什么样?

版本一:规则引擎

if 竞品价格 < 成本 * 1.1:
    定价 = 成本 * 1.05  # 亏本清货
elif 库存 < 安全库存:
    定价 = 竞品价格 * 1.1  # 溢价
else:
    定价 = 竞品价格 * 0.95  # 低价抢市场

问题是规则写不完。遇到"新品首发没有竞品"、“竞品数据异常”、"成本结构复杂"等情况就傻眼。

版本二:纯模型决策

直接把所有信息塞给大模型:“成本7000,竞品8000,库存100,定多少?”

模型输出:“建议定价8500”。

但你问它"为什么",它可能编理由。更危险的是,如果信息不全,模型会瞎猜而不是主动获取

解决方案/正确做法

Step 1:设计工具集

TOOLS = {
    "get_cost": {
        "description": "查询商品成本,包括采购价、物流费、平台佣金等",
        "params": {"sku_id": "商品SKU编号"}
    },
    "get_competitor_price": {
        "description": "查询主流平台竞品价格,返回价格区间和主要竞品",
        "params": {"product_name": "商品名称", "platforms": ["京东", "天猫", "拼多多"]}
    },
    "get_inventory": {
        "description": "查询当前库存和近期销售趋势",
        "params": {"sku_id": "商品SKU编号", "days": "统计天数"}
    },
    "calculate_profit": {
        "description": "根据定价计算预期利润和利润率",
        "params": {"price": "拟定价", "cost_data": "成本数据"}
    },
    "finish": {
        "description": "完成定价,输出最终方案",
        "params": {"price": "最终定价", "reasoning": "定价理由", "confidence": "置信度"}
    }
}

Step 2:构建ReAct Prompt

PRICING_REACT_PROMPT = """你是一个专业的电商定价策略师。请通过推理和工具调用,为商品制定最优价格。

定价原则(按优先级):
1. 必须覆盖成本,保证基本利润
2. 考虑库存压力:库存紧张时可适当溢价,库存充足时优先走量
3. 参考竞品,但不必盲目跟随
4. 新品或特殊商品可灵活调整

当前任务:为商品制定价格
商品:{product_name}
SKU:{sku_id}

可用工具:
{tools_desc}

请严格按以下格式工作:

Thought: [分析当前已知信息,识别信息缺口,决定下一步行动]
Action: {{"tool": "工具名", "params": {{"参数": "值"}}}}

历史记录:
{history}

注意:
- 每次只调用一个工具
- 必须基于Observation更新推理,不能重复调用同一工具
- 信息充足后,使用finish工具输出最终定价
"""

Step 3:完整执行流程

=== 第1轮 ===
Thought: 刚开始,我没有任何关于这个商品的信息。需要系统性地收集数据。
首先应该查询成本,这是定价的底线。
Action: {"tool": "get_cost", "params": {"sku_id": "IPHONE15-128-BLUE"}}

Observation: {"purchase": 6800, "logistics": 50, "commission_rate": 0.05, "total_cost": 7200}

=== 第2轮 ===
Thought: 成本已明确为7200元(含5%平台佣金)。接下来需要了解市场竞争情况,
看看竞品定价区间,避免定价过高或过低。
Action: {"tool": "get_competitor_price", "params": {"product_name": "iPhone 15 128GB 蓝色", "platforms": ["京东", "天猫", "拼多多"]}}

Observation: {"jd": 7999, "tmall": 8099, "pdd": 7699, "avg": 7932, "trend": "稳定"}

=== 第3轮 ===
Thought: 竞品均价7932,最低7699(拼多多)。成本7200,如果按竞品均价卖,
毛利约732元,利润率10%,偏低。需要看库存情况决定策略:
如果库存紧张,可以靠近天猫价;如果充足,需要 competitive pricing。
Action: {"tool": "get_inventory", "params": {"sku_id": "IPHONE15-128-BLUE", "days": 7}}

Observation: {"current": 15, "weekly_sales": 8, "status": "紧张", "restock_date": "2024-02-01"}

=== 第4轮 ===
Thought: 关键信息:库存仅15台,周销8台,不到2周卖完,补货要2周后。
库存紧张+竞品价格稳定=溢价机会。但也要注意不能超竞品太多。
策略:定价略高于天猫(8099),测试市场接受度,同时保留降价空间。
计算一下:定价8299,毛利1099,利润率15.3%,合理。
Action: {"tool": "calculate_profit", "params": {"price": 8299, "cost_data": {"total_cost": 7200}}}

Observation: {"gross_profit": 1099, "margin": 15.26, "break_even": 8}

=== 第5轮 ===
Thought: 定价8299,利润率15.26%,盈亏平衡点8台(当前库存15台),风险可控。
库存紧张支持溢价,定价高于主要竞品京东(7999)和天猫(8099),
但iPhone品牌力强,且蓝色款可能缺货,有溢价空间。信息充足,可以输出方案。
Action: {"tool": "finish", "params": {"price": 8299, "reasoning": "基于成本7200元,竞品均价7932元,当前库存紧张(15台/周销8台),采用溢价策略。定价8299元,毛利率15.26%,高于竞品但符合稀缺性溢价逻辑。若2周内销售不及预期,可调价至7999对标京东。", "confidence": "high"}}

=== 最终结果 ===
定价:¥8299
理由:基于成本7200元,竞品均价7932元...

小结

自动定价展示了ReAct的核心价值:复杂决策需要多源信息,而信息获取的顺序和策略本身也需要动态决策。不是一次性收集所有信息,而是根据已有信息判断还需要什么


新手踩坑实录——你中招了吗

点题

这一节咱们盘点ReAct实践中最常见的坑,都是血泪教训。

ReAct常见错误

Thought问题

Action问题

循环问题

工具问题

写成总结而非推理

与Action脱节

包含结论而非过程

格式错误

参数错误

调用不存在工具

无限循环

过早终止

不收敛

描述不清

返回混乱

执行太慢

痛点分析

坑1:Thought写成了"事后总结"

错误示例:

Thought: 我已经查询了成本和竞品价格,现在需要查询库存。
Action: get_inventory(...)

这描述的是已经做过的事,不是正在进行的推理。模型应该基于当前Observation做决策,而不是流水账。

更隐蔽的错误:

Thought: 根据成本7200和竞品8000,合理定价应该在7500-8500之间。
Action: get_inventory(...)

Thought已经"预判"了结论,但还没查库存——万一库存紧张呢?这个"合理定价"可能完全错误。

坑2:Action和Observation"各说各话"

Thought: 需要查询京东和天猫的价格
Action: {"tool": "get_competitor_price", "params": {"platforms": ["拼多多"]}}

Thought说要查京东天猫,Action去查拼多多?这种不一致会让模型后续推理混乱。

坑3:循环不会终止

常见症状:

  • 反复查询同一个工具(模型"失忆")
  • 永远在"再确认一下"
  • 遇到错误就重试,无限循环
Step 5: Thought: 查询库存失败,再试一次 → Action: get_inventory → Error
Step 6: Thought: 还是失败,再试一次 → Action: get_inventory → Error
Step 7: Thought: 可能网络问题,再试一次 → Action: get_inventory → Error
...

解决方案/正确做法

针对坑1:Thought的"现在进行时"原则

正确的Thought应该包含:

  • 现在我知道什么(基于历史Observation)
  • 我还需要什么(信息缺口)
  • 因此我要做什么(下一步Action)
Thought: [当前状态] 已获取成本7200元,竞品均价7932元。
[信息缺口] 尚不清楚库存压力,无法判断溢价空间还是走量策略。
[决策] 需要查询库存水平和销售趋势,决定定价策略。
[行动] 调用库存查询工具。

针对坑2:一致性检查机制

在解析Action后,加一层语义验证

def validate_consistency(thought, action):
    # 简单版本:检查Thought提到的工具名和Action是否一致
    mentioned_tools = extract_tool_mentions(thought)
    actual_tool = action.get("tool")
    
    if mentioned_tools and actual_tool not in mentioned_tools:
        # 不一致,提示模型或重试
        return False, f"Thought提到使用{mentioned_tools},但Action调用{actual_tool}"
    
    # 检查参数合理性
    if action["tool"] == "get_competitor_price":
        if "platforms" in action["params"]:
            if len(action["params"]["platforms"]) > 3:
                return False, "一次查询平台过多,建议分批"
    
    return True, "ok"

针对坑3:智能终止策略

class LoopController:
    def __init__(self):
        self.action_history = []
        self.error_count = {}
    
    def check_loop(self, action):
        action_key = f"{action['tool']}:{json.dumps(action['params'], sort_keys=True)}"
        
        # 检测完全重复
        if action_key in self.action_history[-3:]:
            return "检测到重复Action,建议更换策略或终止"
        
        self.action_history.append(action_key)
        
        # 检测错误重试过多
        tool_name = action["tool"]
        if tool_name in self.error_count and self.error_count[tool_name] >= 2:
            return f"{tool_name}已连续失败2次,建议放弃或人工介入"
        
        return "ok"
    
    def record_error(self, tool_name):
        self.error_count[tool_name] = self.error_count.get(tool_name, 0) + 1

小结

ReAct的坑大多源于格式与语义的不一致。严格约束Thought的"进行时"特征、Action与Thought的一致性、循环的智能终止,才能让Agent稳定可靠。


进阶心法——让ReAct更聪明

点题

基础ReAct跑通了,怎么让它更强?这一节分享三个进阶技巧。

ReAct进阶

工具描述优化

Few-shot设计

自我修正机制

场景化描述

错误示例提示

组合工具说明

正例示范

反例警示

边界案例

错误识别

策略调整

回滚机制

痛点分析

基础ReAct的问题:

  • 工具描述太抽象,模型不知道怎么用
  • 遇到没见过的情况,模型容易懵
  • 一步走错,后面全错,没有纠错能力

解决方案/正确做法

技巧一:工具描述的场景化

不要只写"这个工具是干嘛的",要写"什么时候用、怎么用、注意什么"。

对比:

【基础版】
get_inventory: 查询商品库存

【进阶版】
get_inventory: 
  用途: 获取当前可售库存和近期销售速度,用于判断供需关系
  何时使用: 
    - 定价前评估库存压力
    - 促销前确认库存充足
    - 发现销售异常时排查原因
  关键输出: 
    - current: 当前库存(判断稀缺性)
    - weekly_sales: 周销量(判断周转速度)
    - status: 库存状态标签(紧张/充足/积压)
  注意: 库存紧张时(status="紧张"),定价策略可偏向溢价而非走量

技巧二:精心设计的Few-shot

提供正例+反例+边界案例

【正例】
问题:iPhone 15刚发布,如何定价?
Thought: 这是新品首发,没有直接竞品。需要查询:1)官方指导价作为锚点;
2)上一代产品当前价格作为参考;3)首批到货库存量。
Action: {"tool": "get_official_price", "params": {"model": "iPhone 15"}}

【反例】❌ 错误示范
Thought: iPhone 15定价应该在6000-10000之间(❌过早下结论,未查数据)
Action: {"tool": "finish", "params": {"price": 7999}}(❌信息不足就终止)

【边界案例】
问题:查询某商品,但系统返回"商品不存在"
Thought: 商品不存在可能是SKU错误 or 已下架。先尝试用名称搜索确认,
若确实无此商品,向用户澄清而非强行定价。
Action: {"tool": "search_by_name", "params": {"keyword": "iPhone 15 蓝色"}}

技巧三:自我修正机制

让模型能识别自己的错误并调整:

SELF_CORRECTION_PROMPT = """
如果Observation显示执行失败或结果异常,请:
1. 分析失败原因(参数错误?工具故障?数据问题?)
2. 决定修正策略(重试?换工具?调整参数?终止并报告?)
3. 在Thought中明确说明修正思路

修正策略优先级:
- 参数错误 → 修正参数重试(最多2次)
- 工具故障 → 换替代工具或终止
- 数据缺失 → 基于已有信息做合理假设(需明确标注)
"""

# 代码层面:给模型"反悔"的机会
def react_with_correction(query, tools):
    context = init_context(query)
    
    for step in range(max_steps):
        output = llm.generate(build_prompt(context, tools))
        thought, action = parse(output)
        
        # 执行前:检查是否有自我修正指示
        if "修正" in thought or "重试" in thought:
            context += f"[系统提示] 模型识别到需要修正,上一步Action未执行\n"
            continue
        
        observation = execute(action)
        
        # 执行后:如果是错误,给模型明确的修正提示
        if is_error(observation):
            context += f"Observation: {observation}\n"
            context += "[系统提示] 上一步执行失败。请在下一步Thought中分析原因并决定修正策略。\n"
        else:
            context += f"Observation: {observation}\n"
        
        if is_complete(thought, observation):
            return extract_answer(context)

小结

进阶ReAct的核心是让模型更懂工具、更会学习、更能纠错。好的工具描述降低使用门槛,精心设计的示例拓展能力边界,自我修正机制提升鲁棒性。


写在最后

聊到这儿,ReAct框架的核心你应该有感觉了。它不是简单的"先想后做",而是想与做的动态共舞——每一步思考都扎根于当下的信息,每一个行动都服务于明确的目标,每一次观察都开启新的认知。

做AI Agent开发这几年,我最大的体会是:框架是死的,协同是活的。ReAct给的只是结构,真正让Agent聪明的,是你对业务的理解、对工具的打磨、对边界情况的处理。

很多新手容易陷入两个极端:要么觉得ReAct太简单,不就是加几个标签嘛;要么觉得太复杂,不敢动手。其实啊,最好的学习就是边踩坑边修。先跑起来一个基础版本,再慢慢加工具、优化Prompt、处理异常,Agent就在这个过程中长成了。

编程之路不易,但每一步成长都算数。ReAct只是Agent技术的起点,后面还有Plan-and-Solve、Reflexion、LATS等更复杂的架构等着你去探索。保持好奇,持续动手,你也能做出让人眼前一亮的AI Agent。

记住,好的Agent不是一次写成的,是迭代出来的。就像咱们写代码一样,先能跑,再跑好,最后跑得漂亮。加油!


关注私信备注:“资料代找获取”,全网计算机学习资料代找:例如:
《课程:2026 年多模态大模型实战训练营》
《课程:AI 大模型工程师系统课程 (22 章完整版 持续更新)》
《课程:AI 大模型系统实战课第四期 (2026 年开课 持续更新)》
《课程:2026 年 AGI 大模型系统课 23 期》
《课程:2026 年 AGI 大模型系统课 21 期》
《课程:AI 大模型实战课 8 期 (2026 年 2 月最新完结版)》
《课程:AI 大模型系统实战课三期》
《课程:AI 大模型系统课程 (2026 年 2 月开课 持续更新)》
《课程:AI 大模型全阶课程 (2025 年 12 月开课 2026 年 6 月结课)》
《课程:AI 大模型工程师全阶课程 (2025 年 10 月开课 2026 年 4 月结课)》
《课程:2026 年最新大模型 Agent 开发系统课 (持续更新)》
《课程:LLM 多模态视觉大模型系统课》
《课程:大模型 AI 应用开发企业级项目实战课 (2026 年 1 月开课)》
《课程:大模型智能体线上速成班 V2.0》
《课程:Java+AI 大模型智能应用开发全阶课》
《课程:Python+AI 大模型实战视频教程》
《书籍:软件工程 3.0: 大模型驱动的研发新范式.pdf》
《课程:人工智能大模型系统课 (2026 年 1 月底完结版)》
《课程:AI 大模型零基础到商业实战全栈课第五期》
《课程:Vue3.5+Electron + 大模型跨平台 AI 桌面聊天应用实战 (2025)》
《课程:AI 大模型实战训练营 从入门到实战轻松上手》
《课程:2026 年 AI 大模型 RAG 与 Agent 智能体项目实战开发课》
《课程:大模型训练营配套补充资料》

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐