Contrastive CoT Prompting
Contrastive CoT Prompting(Chia et al., 2023)的核心是在 CoT few-shot 示例里同时提供“错误推理示例”和“正确推理示例”,用“对比学习”的方式让模型不仅学会怎么推,还学会哪些推理路径是陷阱、应当避免。直观上相当于:给模型看“反面教材 + 正面范例”,明确界定“好推理/坏推理”的差异。
1) 它具体怎么做
在一个 CoT prompt 的 exemplars(示例)部分,针对同类问题,你会放入类似结构:
- 示例 1(Incorrect rationale):给出一个看起来合理、但其实犯了典型错误的推理与错误答案
- 示例 2(Correct rationale):给出正确推理与正确答案
- 之后再给“待解问题”,要求模型按正确方式推理
关键点是:错误示例要“具有代表性”(常见错法),并且要在 prompt 中明确标注它是错误的(例如 Wrong: / Incorrect:),避免模型把错误模式学走。
2) 为什么会有效(机制直觉)
- 提供决策边界:仅给正确例子,模型未必知道哪些相似但错误的路径会失败;对比后边界更清楚。
- 抑制常见幻觉/捷径:比如算术题里“跳步心算”容易错;事实 QA 里容易把相近实体混淆。错误示例把这些错法显式化。
- 更像“纠错教学”:人类学习中“错题本”很有效,同理。
3) 适用场景
论文里提到的两类很典型:
- Arithmetic Reasoning:加减乘除、比例、单位换算、两步以上计算
常见错法:运算顺序错、漏一步、单位没统一、把“每…多少”理解反 - Factual QA / 多跳事实问答:实体相近、时间线复杂、别名多
常见错法:张冠李戴、把相关但非同一实体当作答案、把“出生地/国籍/居住地”混用
也适合:
- 逻辑题里常见谬误(必要/充分条件混淆)
- 代码推理里常见 bug 模式(off-by-one、作用域/可变对象引用等)
4) Prompt 模板(可复制)
下面是一个通用骨架(few-shot):
你将看到一些示例,包含错误推理与正确推理。错误推理仅用于展示应避免的思路。请你模仿正确推理方式回答最后的问题。
示例 A(错误示范):
Q: {q1}
Incorrect reasoning: {bad_rationale_1}
Incorrect answer: {bad_answer_1}示例 B(正确示范):
Q: {q1}
Correct reasoning: {good_rationale_1}
Correct answer: {good_answer_1}(可再加一组错误/正确示例,提高覆盖面)
现在请回答:
Q: {target_question}
Reasoning:
Answer:
工程上常见强化:
- 在错误示例后加一句“这里错在 X”(点名错误类型),进一步强调“为什么错”
- 要求输出前先列“避免哪些错误”(类似 checklist)
5) 实操注意事项(很重要)
- 必须强标注错误:
Incorrect/Wrong/Do not follow,否则模型可能学习到错误模式。 - 错误示例要“错得典型但不离谱”:太离谱会没教学价值;太隐蔽又可能误导。
- 错误不要太多:通常 1–2 个典型错法足够;过多会稀释正确模式。
- 尽量同分布:示例题型、数字规模、问法应与目标任务相近。
- 评测要分开做:对算术/事实 QA 的提升常见,但对开放式生成未必有帮助。
6) 和相近方法的区别
- vs Self-Consistency:后者是“采样多条推理投票”,Contrastive CoT 是“在提示里教你别怎么推”。可组合:先用 contrastive exemplar 约束,再做 self-consistency。
- vs Critique/Reflexion:Critique 是模型生成后再自我批判修正;Contrastive CoT 是“生成前”用示例塑形。
- vs Negative examples in finetuning:Contrastive CoT 是纯 prompt 层面的“负样本对比”,不需要训练。
如果你愿意贴一个你的目标任务样例(比如一道算术题或一类事实 QA),我可以帮你构造一对“错误示范 + 正确示范”的 contrastive exemplars,并给出一个可直接用于 few-shot 的完整 prompt。