反思与推理:让 Agent 回头改一遍、也想得更深

一遍过会错而不自知,反思带批评定向改,推理把思考显式化想得更深。

Module D · 第 1 讲

立靶:一遍过的输出,错了也不自知

先看两个真实会翻车的场景。

第一个,让 Agent 写一段稍微复杂的代码。它一口气生成、直接交付,跑起来报错。你把报错贴回去,它改;再报错,再改。来回三四轮才对。问题出在哪?模型生成时是「线性向前」的,它没有在交付前回头看一眼自己刚写的东西。 它不是不会改,是根本没给它「改」的机会。

第二个,问一道需要几步推理的题:「一个房间有 3 个开关对应隔壁房间 3 盏灯,你只能进隔壁一次,怎么判断哪个开关控制哪盏灯?」如果模型直接蹦出答案,往往会漏掉「灯泡发热」这个关键中间量。因为它把本该展开的思考,压缩成了一次性的直觉跳跃。 答案错了,它自己也不知道哪一步错了——因为根本没有「步」。

这两个靶子,对应本讲的两个模式:第一个病——不回头看——靠 反思(Reflection) 治:把输出当草稿,自己挑错,再改一遍。第二个病——想得太浅——靠 推理技术(Reasoning) 治:把思考过程显式摊开,甚至并行试多条路、能回溯。它们是一对互补的「想得更对」和「想得更深」。

框架:Reflection 的 Generator-Critic + Reasoning 四技术

反思 Reflection——生成、批评、修订的循环

反思的核心结构叫 Generator-Critic(生成器-批评者)。一句话:让同一个(或另一个)模型,先当作者,再当审稿人。标准循环是三步,可以多轮:

反思的 Generator-Critic 循环:生成草稿 → 批评挑错 → 定向修订,不够好带批评再来一轮,够好则停
反思的 Generator-Critic 循环:生成草稿 → 批评挑错 → 定向修订,不够好带批评再来一轮,够好则停
  1. Generate(生成):产出第一版输出。这一版被明确定性为「草稿」,而不是终稿。
  2. Critique(批评):换一个视角审视草稿——哪里不对、哪里没覆盖、哪里能更好。批评要具体、可执行,不能只说「写得不好」。
  3. Refine(修订):带着批评意见,定向修改草稿,产出第二版。

然后判断是否再来一轮(够好了 / 到了轮数上限 / 不再变好就停)。这里要钉死一个最容易混的点:反思 ≠ 重试。

维度单纯重试(Retry)反思(Reflection)
第二次输入和第一次几乎一样的 prompt第一版输出 + 针对它的具体批评
变好的机制换随机种子,碰运气带着诊断意见定向修改
信息是否累积不累积,每次从零累积,后一版站在前一版肩上
适合场景输出本身有随机性、重抽即可输出有明确可挑剔的质量维度

重试是「再摇一次骰子」,反思是「拿着红笔批改作文」。反思的代价也必须摊开:多一轮批评 + 一轮修订,意味着 2-3 倍的 token 和延迟。 所以它不是默认开关,是按场景上的。

推理 Reasoning——把思考显式化的四种技术

推理技术解决「想得不够深」。核心思想统一:别让模型从问题直接跳到答案,让中间的思考过程显式地、可被消费地展开出来。 四种技术按复杂度递增:

技术一句话机制形状适合代价
CoT 思维链「一步步想」,把推理链写出来再给答案单条直线多步算术、逻辑、常识推理
Self-Consistency 自洽采样多条 CoT 路径,对答案投票取多数多条平行线 + 投票答案唯一、易聚合的题中(N 倍采样)
ToT 思维树把思考拆成节点,分支探索 + 评估 + 回溯树(可回溯)需要搜索 / 试错 / 规划的题
ReAct推理与行动交织:想一步 → 调工具 → 看结果 → 再想循环需要查外部信息 / 用工具的任务中高

四者的关系:CoT 是「把一条思路写清楚」;Self-Consistency 是「同一道题写好几遍取共识」;ToT 是「写到一半发现不对能掉头换条路」;ReAct 是「想不清就去查、去试,拿真实反馈回来接着想」。前三者在模型脑子里(纯文本推理),ReAct 是唯一把「行动 / 工具」拉进推理循环的——这也是它和 Agent 关系最紧的原因。

Case:同一个任务,开不开这两个模式差多少

任务:让 Agent 写一篇「给非技术读者解释什么是向量数据库」的科普短文。

裸跑(无反思、无显式推理):模型一遍过,写出一段塞满「嵌入空间」「余弦相似度」「近似最近邻」的文字。术语堆砌,非技术读者根本看不懂,但模型交付时一脸自信。错了不自知。

加反思:Generate 同上;Critique(让它换「完全不懂技术的读者」视角审)批评很具体——「第二段三个术语没解释;缺一个生活类比;开头没说清这东西解决什么问题」;Refine 带着这三条改,第二版开头加了「就像图书馆里按内容相近摆书」的类比,术语都先用大白话兜底。质量明显提升,代价是多跑了一轮。

加推理(ReAct):如果任务变成「解释并对比当前主流的三个产品」,纯靠模型记忆容易过时、编错。ReAct 会:想(「我需要查最新产品对比」)→ 行动(调检索工具)→ 观察(拿到真实资料)→ 再想(「资料里 X 产品定价变了」)→ 整合输出。推理决定「内容对不对、深不深」,反思决定「成品好不好、到不到位」。一个管过程,一个管收口。

可操作做法:什么时候上、上哪种

何时该上反思——信号:输出有明确可挑剔的质量维度(能描述才能批评);任务是开放式生成(代码、长文、方案);一次错的代价 > 多跑一两轮的成本。不值得:简单事实问答、格式转换、对延迟极敏感的实时场景。两个要点:① 批评和生成尽量用不同视角或不同 agent,别让作者自己夸自己;② 设停止条件(固定轮数 / 不再变好就停),否则无限打磨烧 token。

怎么选推理技术——按任务形状选,别一律上最重的:多步推理、答案唯一 → CoT(最省);CoT 偶尔错但能投票聚合 → Self-Consistency;需要搜索/试错/掉头 → ToT(最贵,最后用);依赖外部信息或工具 → ReAct。一句话决策:先问「这题要不要跟外部世界交互」——要,ReAct;不要,再在 CoT / SC / ToT 里按复杂度从轻到重选。

织进本课:这两个模式不是新东西

反思 ↔ Module C「端到端与交接」的「规划 / 生成 / 评估三 agent 分离」。 Module C 讲过成熟多 agent 系统会把规划、生成、评估拆给不同 agent——那个评估 agent,本质就是把反思「外部化」了。反思的朴素形态是同一个模型先写再自评,但自评容易给自己打高分;评估 agent 把「批评者」彻底独立成另一个不参与生成的 agent。所以两者是同一思想的两个浓度:让评判方独立于生成方。

推理 ↔ Module A「技术地基五层」L1 Loop + L3 Planning。 ReAct 就是 L1 Loop 的推理形态——L1 是「感知→决策→行动→观察」的循环,ReAct 把其中「决策」环节显式写成自然语言推理,ReAct = Loop + 显式思考。ToT 的「分支探索 + 回溯」则对应 L3 Planning 的搜索策略。所以 Module D 不是讲全新东西,是给前面的地基补上「它们在单个 agent 的思考层里长什么样」。

收口

一遍过的 Agent,错了不自知;想得浅的 Agent,难了就蒙。反思让它回头改,推理让它想得深——前者管「收口对不对」,后者管「过程深不深」。这两件事都不是默认开关,是你看着任务的形状、按代价亲手拧上去的旋钮。