现有方法不足
以往通过self-critique来增强LLM的方法往往表现不尽如人意,文章认为主要是因为缺少足够的自我评估的能力,所以导致结果高FP、漏掉几乎所有TN(例如,模型经常会对结果给出过于乐观的评估)。
所以之前的迭代计划优化工作往往利用外部反馈,例如借助oracle的验证或者依赖人类输入,但这种优化方法代价太大,实际应用中不现实。
本文contributions
本文提出了一种使用zero-shot或few-shot prompt来完成有效自我批判的方法,无需使用外部的验证器。
提高自我批判准确性的三个核心机制(降低 FP 并有效识别 TN):
- 模拟形式化验证器的提示词设计 (Prompt Design Simulating a Validator)
前人工作:直接问 LLM “这个计划对不对”,缺乏具体的验证依据❌
这篇文章:强迫 LLM 扮演一个“规则执行器”的角色,而非简单的“评论员”。
-
引入领域定义 (Domain Definition): 自我批判的 Prompt 中包含完整的 PDDL 定义(动作Actions、先决条件Preconditions和效果Effects),作为LLM 的验证标准
-
逐步状态验证 (Step-by-Step State Verification): 不让模型直接给出最终结论,要求模型对计划中的每一个步骤进行验证:
- 提取当前动作及其先决条件。
- 验证当前状态是否满足这些先决条件。
- 应用动作的效果,推导出新的状态(Resulting State)。
-
类似“思维链”(Chain-of-Thought)的强制推理过程,“睁眼说瞎话”❌。
如果一个计划是错误的(即真阴性 TN),在逐步推演中必然会在某一步不满足先决条件,从而迫使模型识别出错误,降低漏判率。
- 自洽性机制 (Self-Consistency)
- 多次采样投票: 自我批判阶段生成 N 个评估样本(例如 5 次)通过多数投票(Majority Voting)来决定最终的评估结果。
单次生成的批判可能存在幻觉或随机错误,但通过集体的投票,可以显著过滤掉偶然的判断失误。
实验数据显示,加上自洽性后,准确率进一步提升,非常接近使用外部验证器(Oracle)的效果。
- 迭代式的反馈闭环 (Iterative Feedback Loop)
文章不仅仅是一次性批判,而是将批判嵌入到一个迭代循环中。
- 利用错误历史: 如果自我批判判定计划是错误的,它不会直接放弃,而是将错误的计划和批判的具体内容(指出哪一步错了、为什么错)作为上下文(Context),再次输入给生成器。
这种机制让模型能够“吸取教训”。生成的 Critique 不仅仅是判断对错,还提供了具体的错误定位,帮助模型在下一轮生成中规避之前的错误,从而逐步逼近正确答案。
总结
前人的工作只是问 LLM:“这个计划好吗?”,导致 LLM 倾向于奉承或产生幻觉(高 FP)。
这篇文章通过 “给出规则书 -> 逐步推演状态 -> 多个人(多次采样)投票确认 -> 错了就把教训记在小本本上重来 ” 这一整套流程,让 LLM 的自我批判具备了类似程序化验证器的严谨性,从而实现了高精度的自我纠错。
这个算法的精髓在于:
- 闭环反馈:不需要外部的 Python 脚本或 PDDL 验证器,LLM 自己既是“执行者”也是“裁判”。
- 从错误中学习 (In-Context Learning) :通过不断累积 ,模型在同一个会话中通过上下文获得了“短期记忆”,逐步逼近正确答案。
- 稳健性 (Robustness) :在批判阶段引入 次采样(Self-Consistency),解决了 LLM 经常无法准确判断自己错误的问题。
感兴趣的可以看附录D中的示例,很详细。
附录E通过Mystery Blocksworld实验,证明模型不是在死记硬背。