【智能体】Agent的四种设计模式之:ReAct

Agent 四种工作模式

  • 1、引言
  • 2、四种设计模式之React
    • [2.1 四种工作模式的本质差异](#2.1 四种工作模式的本质差异)
    • [2.2 ReAct 工作流程图](#2.2 ReAct 工作流程图)
    • [2.3 什么时候用 ReAct](#2.3 什么时候用 ReAct)
    • [2.4 什么时候别用 ReAct](#2.4 什么时候别用 ReAct)
    • [2.5 核心代码示例](#2.5 核心代码示例)
  • 3、总结

1、引言

小屌丝 :鱼哥,我最近用 LangChain 搭了个 Agent,跑了半天,不是死循环就是答非所问。我看了那篇《一图带你看懂 Agent 四种设计模式》,图是记住了,但还是不知道怎么选、怎么用。
小鱼 :图是记住了,代码呢?
小屌丝 :代码在网上拼拼凑凑,跑起来了,但感觉像在摸黑走路。
小鱼 :那今天我就把那四种模式,每一种都给你写一段能跑的核心代码,再告诉你什么时候该选它,什么时候千万别选它。让你从"会用 API"进化到"能设计 Agent 架构"。
小屌丝:得嘞,我搬好小板凳了。

2、四种设计模式之React

2.1 四种工作模式的本质差异

在进代码之前,先把四种模式的底层逻辑对齐。我用一张表把核心差异拉出来:

工作模式 决策时机 执行节奏 核心隐喻 一句话总结
ReAct 每步都重新思考 思考→行动→观察→再思考 走迷宫 "走一步看一步,边走边想"
Plan-and-Execute 一次性规划,执行中不思考 规划(一次)→ 执行(批量) 查清单 "先想好全盘,再按清单打勾"
Reflection 执行完再审查 生成→评审→修正→再评审 校对员 "做完再检查,检查完再改"
Multi-Agent 多角色分工决策 并行或串行协作 项目团队 "一个搞不定,派一个团队上"

这四种模式不是互斥的,是层层叠加的:

  • ReAct 是基础原语
  • Plan-and-Execute 在 ReAct 上加了"规划分层"
  • Reflection 在 ReAct 上加了"质检反馈"
  • Multi-Agent 则是把前三种模式分配给不同的 Agent 并行跑

2.2 ReAct 工作流程图

图中的逻辑画得很清楚


用户:我要订一张机票
思考

分析当前情况

决定下一步做什么
行动

调用工具执行
观察

查看工具返回结果
任务是否完成?
输出最终结果

核心思想:Agent 在思考和行动之间不断交替。每一步都依赖上一步的观察结果来决定下一步,没有"全局计划"的概念。

2.3 什么时候用 ReAct

  • 任务路径不确定,"下一步是什么"依赖上一步结果

  • 工具调用后有大量中间信息需要"消化"

  • 你的任务本身就是探索性的(调研、排查问题、信息检索聚合)

2.4 什么时候别用 ReAct

  • 任务步骤可以提前确定(那是 Plan-and-Execute 的地盘,能省 80% Token)

  • 你对延迟敏感,每一步都调 LLM 太慢

  • 输出质量要求极高但 ReAct 没有内建质检(那是 Reflection 要补的)

2.5 核心代码示例

python 复制代码
# -*- coding:utf-8 -*-
# @Time   : 2026-05-01
# @Author : Carl_DJ

from openai import OpenAI
import json

client = OpenAI()

# ---------- 工具定义 ----------
def search_flights(origin: str, destination: str, date: str) -> str:
    """模拟查询航班"""
    return json.dumps({
        "flights": [
            {"flight_no": "CA1234", "departure": "08:00", "price": 1280},
            {"flight_no": "MU5678", "departure": "14:30", "price": 960}
        ]
    }, ensure_ascii=False)

def book_flight(flight_no: str, passenger: str) -> str:
    """模拟订票"""
    return json.dumps({"status": "confirmed", "booking_id": "BK20260502", "flight": flight_no, "passenger": passenger}, ensure_ascii=False)

TOOLS = {
    "search_flights": search_flights,
    "book_flight": book_flight
}

TOOLS_DESC = """
- search_flights(origin, destination, date): 查询航班
- book_flight(flight_no, passenger): 预订机票
"""

# ---------- ReAct Prompt ----------
SYSTEM_PROMPT = f"""你是一个订票助手。你可以使用以下工具:
{TOOLS_DESC}

严格按照以下格式输出,每次只输出一个 Thought/Action 对:

Thought: 你当前的思考
Action: 工具名称
Action Input: {{"key": "value"}}

当你确认任务完成时,输出:
Thought: 任务已完成
Final Answer: 最终的回答
"""

# ---------- ReAct 循环 ----------
def react_loop(user_input: str, max_steps=10):
    messages = [{"role": "system", "content": SYSTEM_PROMPT},
                {"role": "user", "content": user_input}]
    
    for step in range(max_steps):
        response = client.chat.completions.create(
            model="gpt-4o",
            messages=messages,
            temperature=0
        )
        reply = response.choices[0].message.content
        messages.append({"role": "assistant", "content": reply})
        
        # 检查是否完成
        if "Final Answer:" in reply:
            return reply.split("Final Answer:")[-1].strip()
        
        # 解析 Action
        if "Action:" in reply and "Action Input:" in reply:
            action_line = [l for l in reply.split("\n") if l.startswith("Action:")][0]
            input_line = [l for l in reply.split("\n") if l.startswith("Action Input:")][0]
            
            action_name = action_line.replace("Action:", "").strip()
            action_input = json.loads(input_line.replace("Action Input:", "").strip())
            
            # 执行工具
            if action_name in TOOLS:
                observation = TOOLS[action_name](**action_input)
            else:
                observation = f"错误:工具 {action_name} 不存在"
            
            # 把观察喂回去
            messages.append({"role": "user", "content": f"Observation: {observation}"})
        else:
            # 格式不对,提醒
            messages.append({"role": "user", "content": "Observation: 请严格按 Thought/Action/Action Input 格式输出"})
    
    return "达到最大步数,任务未完成"

# ---------- 运行 ----------
result = react_loop("帮我订一张5月3号从北京到上海的机票,选最便宜的")
print(result)

关键决策点

  • ReAct 的核心管控点不在 Prompt,而在 messages 的拼接方式。
  • 每一次工具的返回结果(Observation)必须原样塞回对话历史,否则 Agent 会失去"上下文记忆"。

3、总结

ReAct 是 Agent 的"元模式",灵活但费 Token。如果你能用其他模式预先确定步骤,就别用它。如果必须用,记得控制循环、校验格式、兜底截断。

看到这里, 《Agent设计模式之:React 》就聊的差不多了,

下一篇,我们聊《Agent设计模式之:Plan-and-Execute 》,不见不散。

我是小鱼

  • CSDN 博客专家
  • AIGC 技术MVP专家
  • 阿里云 专家博主
  • 51CTO博客专家
  • 企业认证金牌面试官
  • 多个名企认证&特邀讲师等
  • 名企签约职场面试培训、职场规划师
  • 多个国内主流技术社区的认证专家博主
  • 多款主流产品(阿里云等)评测一等奖获得者

关注小鱼,学习【人工智能与大模型】最新最全的领域知识。

相关推荐
沪漂阿龙4 小时前
Hermes Agent Sessions 架构详解:AI 如何跨平台延续任务、找回历史、持续推进工作
人工智能·架构
500844 小时前
昇腾 CANN 的五层架构,到底分了哪五层
java·人工智能·分布式·架构·ocr·wpf
阿里云大数据AI技术4 小时前
让 AI 帮你运维 Elasticsearch:阿里云 ES Agent Skill 正式发布
人工智能·agent
虫无涯4 小时前
从零搞懂大模型:定义、起源、计量单位与完整分类|入门必看干货
人工智能
天地沧海4 小时前
langchain 与 langgraph
人工智能
stsdddd5 小时前
YOLO系列目标检测数据集大全【第二期】
人工智能·yolo·目标检测
我爱cope5 小时前
【Agent智能体4 | 智能体AI的应用】
数据库·人工智能·职场和发展
song5015 小时前
Ascend C 算子开发:从入门到上手
c语言·开发语言·图像处理·人工智能·分布式·flutter·交互
yzx9910135 小时前
超越向量检索:用 Graph RAG 构建具备推理能力的企业知识问答系统
人工智能·自动化
sunneo5 小时前
02-大模型选型的产品视角(系列四-AI产品战略)
人工智能·产品运营·aigc·产品经理·ai-native