Prompt Engineering 进阶——CoT、ReAct、Reflexion 三种范式

简单 Prompt 只能让模型”回答问题”。要让模型”思考 + 行动 + 反思”——需要 Chain-of-Thought、ReAct、Reflexion 三种范式。

范式 1:Chain-of-Thought(CoT)

核心思想:让模型”一步步想”,而不是”直接答”。

朴素 CoT

1
2
3
4
问题:小明有 5 个苹果,给了小红 2 个,又买了 3 个,现在有几个?

直接答:6
CoT: 小明有 5 个,给小红的 2 个 - 5-2=3 个,又买 3 个 +3=6 个。

Few-shot CoT(更有效)

1
2
3
4
5
6
7
问题:小明有 5 个苹果,给了小红 2 个,又买了 3 个,现在有几个?

解答:小李有 8 个糖果,给了小王 3 个,又收到小赵的 5 个,现在有几个?
小李 8 - 3 + 5 = 10 个。

解答:小李有 8 个糖果,给了小王 3 个,又收到小赵的 5 个,现在有几个?
小李 8 - 3 + 5 = 10 个。

给几个”示范样例”,模型就能学会”一步步想”。

Zero-shot CoT(更简单)

只加一句”Let’s think step by step“——准确率能提升 10-30%。

适用场景:数学题、逻辑题、推理题。
不适用场景:简单事实问答。

范式 2:ReAct(Reasoning + Acting)

核心思想:思考 + 行动交替进行。

模板:

1
2
3
4
5
6
7
8
9
10
11
12
问题:上海今天适合出门吗?

思考 1:用户想知道今天上海天气,需要查天气。
行动 1: get_weather(city="上海")
观察 1: 上海今天 28 度,晴,无风。

思考 2:28 度无风,适合出门。我可以推荐一些户外活动。
行动 2: get_activities(city="上海", weather="sunny")
观察 2: 推荐 1.外滩 2.豫园 3.迪士尼

思考 3:信息够了,可以回答用户了。
行动 3: Finish(answer="今天上海天气晴朗,适合出门,推荐外滩、豫园、迪士尼。")

ReAct 让模型”边想边做”——而不是一次性把所有事想清楚再动手。

ReAct 的代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
REACT_PROMPT = """
回答用户问题,按以下格式:

思考:你需要做什么,下一步行动是什么
行动:你要调用哪个工具,传什么参数(JSON 格式)
观察:工具返回的结果
... (重复 思考/行动/观察 直到信息够了)
思考:我可以回答用户了
行动:Finish(answer="最终回答")

问题:{question}
"""

while iter < MAX_ITER:
response = llm(REACT_PROMPT.format(question=q) + history)
if "Finish(" in response:
return parse_finish(response)
thought, action = parse_thought_action(response)
result = execute_tool(action)
history += f"\n观察:{result}\n"

ReAct 是 LangChain Agent 的核心范式——你用的 AgentExecutor 底层就是它。

范式 3:Reflexion(反思)

核心思想:让模型”做完事后反思”,第二次尝试做得更好。

三步流程

1
2
3
轮 1: 模型尝试 → 失败
轮 2: 模型"反思"哪里错了 → 生成改进
轮 3: 模型用改进再尝试 → 可能成功

实际例子:代码生成

1
2
3
4
5
6
7
8
9
10
轮 1:
模型写 Python 排序函数 → 有 bug,排序错误
反思: "我在第二个 if 条件错了边界"

轮 2:
模型重新写 → 仍然错(反思不深)
反思: "我应该画图理清逻辑,而不是直接写"

轮 3:
模型再写 → 正确

Reflexion 实现关键

反思要”具体”,不要”抽象”:

  • ❌ “我做得不好” — 无效反思
  • ✅ “第 3 行 if 条件的边界判断错了,应该是 < 不是 <=” — 有效反思

需要把执行结果 + 错误信息作为上下文,让模型能”看证据反思”。

三种范式怎么选

任务类型 推荐范式 理由
数学题 CoT 一步一步推理就够了
信息查询 ReAct 需要查外部工具
复杂任务(代码生成/规划) Reflexion 需要多轮试错
简单问答 不用范式 直接答就行

我的项目实战经验

CoT 用得最多

我做的 AI 项目里,CoT 几乎所有场景都用——成本低、效果好。

特别有效的是结构化输出——让模型先”列出思考步骤”再”输出 JSON”,准确率提升 20%+。

ReAct 用于多步任务

凡是涉及”查多个数据源”的任务,用 ReAct。

但要注意:ReAct 的成本是普通调用的 3-5 倍(多轮 Token)。

Reflexion 用于代码类任务

代码生成、SQL 生成——适合 Reflexion。

但只用在”有明确对错”的场景——主观任务没法”反思”。

几个常见的误区

误区 1:CoT 适合所有任务

错。简单事实问答不需要 CoT——加了反而慢、还可能”想歪”。

误区 2:ReAct 永远比直接答好

错。如果工具只有 1-2 个,直接让模型生成 tool_call 更高效。

ReAct 的强项是多步骤决策——不是”工具调用”本身。

误区 3:Reflexion 能解决一切

错。Reflexion 依赖模型的”自我评估”能力——如果模型分不清对错,反思就是瞎反思。

实际项目里,Reflexion 通常要配合”外部评分”(测试用例、人工标注)。

写在最后

Prompt Engineering 进阶,不是学更多”魔法咒语”——是学”思考结构”。

CoT 让模型会”想”,ReAct 让模型会”做”,Reflexion 让模型会”改”。

把这三个范式理解了,你看任何 Agent 论文都不会迷路。

Prompt 工程的本质,是把”人类的思维方式”显式地写进 Prompt 里。