什么是 ReAct Agent?

核心思想:观察 - 思考 - 行动

ReAct = Reasoning(推理)+ Acting(行动)
说白了,就是让 AI 一边想一边做,而不是想完了再做。


🔄 ReAct Agent 的工作方式

ReAct Agent 的工作方式其实挺像人类解决问题的过程。它不是一次性把整个流程都规划好,而是在有一个整体目标的前提下,走一步看一步

观察 → 思考 → 行动 → 再观察 → 再思考 → 再行动 → ... → 任务完成

🚗 类比理解

传统方式 ReAct 方式
出门前查好完整路线,严格按路线走 出门后走一段、看环境、再决定下一步
提前规划所有步骤,执行时难以调整 边走边找,根据路牌动态决策
适合简单、确定性高的任务 适合复杂、有不确定性的任务

💡 比如去一家没去过的咖啡店:

  • 传统方式:提前查好所有转弯路口
  • ReAct 方式:走到路口看路牌,再决定左转还是右转

📋 实际例子:查天气 + 穿衣建议

任务帮我查"北京今天天气怎么样,适合穿什么衣服"

ReAct 执行流程

  1. 观察:看到用户的问题,历史上下文为空
  2. 思考"我需要知道北京今天的天气" (思考是可选输出,类似人的内化思考)
  3. 行动:调用天气查询工具,查询 "北京今天天气"
  4. 观察:获取到天气数据:温度 25°C,晴天,湿度 60%,风速 3m/s
  5. 思考"现在我知道天气了,需要查询穿衣建议知识库"
  6. 行动:调用穿衣建议知识库工具,查询 "25度晴天适合穿什么衣服"
  7. 观察:获取建议:短袖 T 恤/薄长袖 + 薄外套 + 帽子 + 防晒霜
  8. 思考"我已获取完整信息,应该写入文件保存"
  9. 行动:调用 writeToFile 工具,将完整建议写入文件
  10. 观察:建议已写入到文件 weather_suggestion.md

✨ 整个过程是 观察 - 思考 - 行动 - 再观察 的循环,每一步都根据当前上下文动态决策。


❓ 为什么需要 ReAct?

问题 ReAct 的优势
现实任务复杂多变 ✅ 能根据中间结果灵活调整策略
API 可能返回错误/异常 ✅ 遇到意外可尝试备选方案
数据格式不确定 ✅ 动态解析并适配处理
需要多工具协同 ✅ 按需调用,避免冗余操作

⚠️ 代价:行为可预测性略低,偶尔可能"犯傻"
收益:处理复杂、不确定任务时,灵活性和鲁棒性显著提升


⚙️ ReAct 是怎么实现的?

关键要素

要素 说明 作用
📜 历史上下文(History) 记录之前所有的思考、行动和观察 避免重复操作,支撑连贯推理
🌍 当前环境信息 用户输入、系统状态、外部数据等 作为 LLM 推理的实时输入
🧠 语言模型(LLM Thinking) 负责推理和决策的"大脑" 根据上下文生成下一步行动计划
🛠️ 工具/动作(toolcall) 搜索、API 查询、文件读写等"手脚" 执行具体操作,完成实际工作
👁️ 观察结果 工具执行后的返回数据/错误信息 反馈给 LLM,驱动下一轮决策

💡 注:实际输出中 think 过程通常是隐藏的,最终表现形式为 toolcall


📊 执行流程示例(表格版)

任务帮我查一下北京今天天气怎么样,适合穿什么衣服

轮次 历史上下文 当前环境信息 提示词核心内容 行动 (toolcall) 观察结果
Round 1 已知:{历史上下文} {当前环境信息} 用户目标:"..." 做出下一步决策,必须最少使用一个工具 天气查询:"北京今天天气" 25°C,晴天,湿度 60%,风速 3m/s
Round 2 已获取北京天气数据 天气工具:无额外信息 同上(提示词模板不变) 穿衣建议查询:"25度晴天适合穿什么衣服" 短袖 T 恤/薄长袖 + 薄外套 + 帽子 + 防晒霜
Round 3 天气数据 + 穿衣建议 两工具均无额外信息 同上 writeToFile:写入完整建议 建议已写入 weather_suggestion.md

🎯 核心提示词模板

已知:
当前历史上下文:{history}
当前环境信息:{env_info}
用户目标:"{user_goal}"

做出下一步的决策:
你必须最少使用一个工具来实现该决策。

🔁 从这个例子可以看出:ReAct 不是一开始就知道所有步骤,而是根据每轮观察结果动态决策。如果 Round 1 搜索失败,它可能尝试其他关键词或换策略——这种灵活性正是 ReAct 的核心优势。


💻 伪代码:ReAct 执行逻辑

单轮执行函数

def 执行一个轮次(用户目标, 历史上下文):
    # 1. 获取当前环境信息
    当前环境信息 = 获取当前环境信息()
    
    # 2. 构建提示词(替换占位符)
    提示词模板 = """
    已知:
    当前历史上下文:{history}
    当前环境信息:{env_info}
    用户目标:"{user_goal}"
    
    做出下一步的决策:
    你必须最少使用一个工具来实现该决策
    """
    完整提示词 = 提示词模板.format(
        history=历史上下文,
        env_info=当前环境信息,
        user_goal=用户目标
    )
    
    # 3. 调用 LLM 进行推理(思考过程隐藏,直接输出 toolcall)
    下一步工具调用决策 = 调用语言模型(完整提示词, 历史上下文)
    
    # 4. 解析工具调用
    工具名称 = 解析工具名称(下一步工具调用决策)
    工具参数 = 解析工具参数(下一步工具调用决策)
    
    # 5. 执行工具调用
    观察结果 = 执行工具(工具名称, 工具参数)
    
    # 6. 更新历史上下文
    新历史上下文 = 追加到历史上下文(历史上下文, {
        "行动": 工具调用结果,
        "观察结果": 观察结果
    })
    
    # 7. 返回结果
    return {
        "观察结果": 观察结果,
        "新历史上下文": 新历史上下文
    }

主循环流程

def 执行 ReAct 流程(用户目标, 最大轮次=10):
    历史上下文 = ""
    当前轮次 = 1
    
    while 当前轮次 <= 最大轮次:
        结果 = 执行一个轮次(用户目标, 历史上下文)
        历史上下文 = 结果["新历史上下文"]
        
        # 判断任务是否完成(可由 LLM 或规则判断)
        if 判断任务已完成(结果["观察结果"]):
            break
            
        当前轮次 += 1
    
    return 历史上下文

总结:ReAct 的本质是让 Agent 具备 "边推理、边行动、边调整" 的能力,通过 观察→思考→行动 的闭环循环,在复杂、动态、不确定的真实场景中实现更鲁棒、更智能的任务执行。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容