Reversing Chain-of-Thought
Reversing Chain-of-Thought (RCoT)(Xue et al., 2023)是什么
RCoT(反向思维链)是一种“先反推问题、再对比一致性、再据此修正答案”的自检框架,用来发现模型答案里潜在的漏条件、错条件、偷换概念、单位/约束不一致等问题。
它的核心流程通常是三段(可迭代):
-
Answer(正向生成答案)
模型先对原问题给出答案 A(可以含推理,也可以只给结论)。 -
Reverse(基于答案反推/重构问题)
让模型“假设这个答案是对的”,反过来写出一个“它实际上解决的题目/前提/约束”——记为重构问题 Q’。
直观理解:模型在“解释自己到底回答了什么问题”。 -
Compare → Feedback → Revise(对比→反馈→修正)
把原问题 Q 与重构问题 Q’ 做细粒度对比:- 哪些条件在 Q 里有、Q’ 里没有(遗漏)
- 哪些条件在 Q’ 里出现但 Q 没有(擅自添加)
- 数值、单位、范围、对象是否一致
- 输出要求(格式/步骤/边界)是否一致
将不一致转成可执行反馈,再让模型据此修订答案 A → A2。必要时可再循环一轮。
和 Self-Refine / Self-Calibration 的区别
- Self-Refine:先批评再改进(反馈不一定来自“问题重构对比”)
- Self-Calibration:更关注“对不对/有多确定”
- RCoT:反馈的来源更“结构化”——来自 Q 与 Q’ 的一致性检查,尤其擅长抓“我答的其实是另一个题”。
适合的应用场景
- 容易“漏条件/改题”的推理题
- 文字题、应用题、规则题、带多约束的规划题(时间、预算、范围、对象)
- 代码/算法题的规格一致性检查
- 题目要求 O(n) 你却写成 O(n²)
- 要求“忽略大小写/非字母数字/稳定排序”等细节被漏掉
- 生成任务中的硬性约束对齐
- “必须包含A/B/C、不得出现D、字数限制、输出JSON字段齐全”等
RCoT 能发现:你生成的内容实际满足的是“另一个更宽松/不同格式的题目”。
- 对安全/合规要求高的文本
- 规则很细时,模型常“自作主张加内容”,对比能把这种偏移抓出来。
不适合的应用场景(或收益较小)
- 纯开放式创意任务
- 例如写诗、脑暴:不存在明确“原题约束”,对比意义有限。
- 强事实题但缺少外部依据
- RCoT 主要抓一致性,不保证事实真伪;事实正确性仍建议配合检索/RAG。
- 极短简单问题
- “1+1=?”这类不需要额外链路,反而增加成本。
- 你不希望暴露推理过程时
- RCoT 常涉及让模型输出重构与对比细节;在需严格隐藏中间过程的产品里,要做字段化、缩短输出或仅内部运行。
提示词写法(推荐的最小可用链路)
你可以用“三段式”固定模板:
Prompt 1:生成答案(Answer)
- 只让它先产出 A(可要求简洁、含结论)
Prompt 2:反推重构问题(Reverse)
- 给:原问题Q + 模型答案A
- 要求输出:Q’(它实际上回答的题目/隐含条件)
Prompt 3:对比并产出反馈(Compare/Feedback)
- 给:Q 与 Q’
- 输出:不一致清单 + 可执行修正建议(不要直接重写答案)
Prompt 4:根据反馈修订答案(Revise)
- 给:Q + A + 反馈
- 输出:修订版答案 A2(最好要求“严格对齐原题所有约束”)
至少3个中文实战例子(可直接复制)
例子1:应用题/约束易漏(推理一致性)
场景:题目包含多个限制,模型容易忽略其一。
Prompt 1(Answer):
请解答下题并给出最终结论:
小李买苹果和香蕉共10个,其中苹果比香蕉多2个。苹果每个3元,香蕉每个2元,共花了多少元?
只输出:苹果个数、香蕉个数、总价。
Prompt 2(Reverse:重构问题Q’):
下面是原问题与一个答案。请“根据答案反推它实际上解决的题目”,写出一个尽可能明确的“重构问题Q’”,包含它隐含使用的条件(如数量关系、价格、总数等)。
原问题Q:小李买苹果和香蕉共10个,其中苹果比香蕉多2个。苹果每个3元,香蕉每个2元,共花了多少元?
答案A:{粘贴模型在Prompt1的输出}输出:只输出重构问题Q’(一段话即可)。
Prompt 3(Compare/Feedback):
请对比原问题Q与重构问题Q’的差异,找出所有不一致,并转成“可执行反馈”。
输出格式:
- 遗漏条件(Q有但Q’没有)
- 擅自添加条件(Q’有但Q没有)
- 数值/单位/对象不一致
- 输出格式是否符合要求
每条后面给出“如何修正答案”的具体建议。Q:{粘贴原问题}
Q’:{粘贴重构问题}
Prompt 4(Revise):
请根据反馈修正你的答案。
要求:严格满足原问题Q的所有条件,并按“苹果个数、香蕉个数、总价”输出,不要额外解释。Q:{原问题}
旧答案A:{旧答案}
反馈:{反馈}
例子2:代码题规格对齐(忽略/添加条件检查)
场景:题目规格很多:忽略大小写、忽略非字母数字、复杂度要求。
Prompt 1(Answer):
用Python实现函数 is_pal(s),判断字符串是否为回文:
- 忽略大小写
- 忽略所有非字母数字字符
返回 True/False。
请给出代码与2个示例。
Prompt 2(Reverse:反推规格Q’):
你将看到题目Q与代码答案A。请根据答案A反推:这段代码“实际满足的规格”是什么?写成一段“重构规格Q’”。
Q:判断字符串是否回文:忽略大小写;忽略所有非字母数字字符;返回True/False。
A:{粘贴代码}输出:重构规格Q’(用条目列出:输入处理规则、比较方式、返回、边界行为)。
Prompt 3(Compare/Feedback):
对比Q与Q’,输出不一致清单,并给出修正建议。重点检查:
- 是否真的忽略了非字母数字
- 是否忽略大小写
- 空字符串/全是符号时返回什么
- 时间复杂度是否合理
输出:
- 不一致点(逐条)
- 对应修正建议(逐条、可执行)
Prompt 4(Revise):
根据反馈,给出修订版代码。
额外要求:补充至少6个边界测试用例(输入→期望输出),用assert表示。
例子3:生成任务的硬约束(格式/字数/必须包含项)
场景:模型很容易生成“看起来不错但不满足约束”的内容。
Prompt 1(Answer):
写一段中文产品介绍,要求:
- 100到120字
- 必须包含并仅包含一次关键词:“端到端加密”“零信任”
- 语气面向企业客户
- 结尾必须是一个问句
请直接输出最终文案。
Prompt 2(Reverse:根据文案反推题目Q’):
下面给出原要求Q和你生成的文案A。请根据A反推出它实际遵循的写作要求(重构要求Q’)。
Q:100-120字;必须且仅一次包含“端到端加密”“零信任”;面向企业;结尾问句。
A:{粘贴文案}输出:重构要求Q’(条目化)。
Prompt 3(Compare/Feedback):
对比Q与Q’,列出所有不一致,并给出可执行修改建议。
必须逐项检查:字数范围、关键词出现次数、语气对象、结尾是否问句。
输出格式:检查项 | 是否满足 | 证据(引用A中的片段) | 修改建议
Prompt 4(Revise):
根据反馈重写文案,必须一次性满足所有约束。只输出文案,不要解释。
实用小技巧(让RCoT更稳定)
- 重构阶段要“描述它实际做了什么”:强调“按答案实际行为反推”,避免模型为了迎合原题而“假装一致”。
- 对比阶段用检查清单表格:字段化输出(是否满足/证据/建议)能显著减少漏检。
- 把反馈写成“可执行修改”:例如“把关键词‘零信任’只保留一次,删除第二处出现”。
- 结合停止条件:如果对比显示“全部满足”,就停止;否则最多迭代2-3轮,避免成本失控。
- 对事实正确性:配合检索:RCoT解决的是一致性,不是事实来源。
如果你告诉我你要落地的具体任务(例如:数学应用题批改、代码生成、营销文案合规、客服话术),我可以把RCoT链路改成更贴合的“字段化提示词+停止条件+自动化路由策略”。