prontoqa
用一阶逻辑形式化验证 LLM 思维链推理能力的系统性诊断工具
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
用一阶逻辑形式化验证 LLM 思维链推理能力的系统性诊断工具
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
想象一个有趣的场景:你在考场上遇到一道选择题,选项表面看起来很有逻辑,但正确答案藏在陷阱里——这就是 PrOntoQA 诞生的灵感起点。
2022 年 10 月,纽约大学的研究者 Abulhair Saparov 和 He He 发布了一个看似「小儿科」的合成问答数据集:所有问题的背景知识都由程序自动生成,语法简单到近乎机械。然而,当他们把这个数据集喂给当时最强大的 GPT-3、Chinchilla 等大语言模型时,一个令人不安的现象出现了——模型们展现出了惊人的「贪婪」倾向,会绕过正确的推理步骤直接猜答案。
这项研究以「Language Models Are Greedy Reasoners」为题,被 ICLR 2023 接收,成为 LLM 推理能力系统性评估的开创性工作之一。
传统的 NLP 基准测试(如 GSM8K、MATH)依赖人工标注,存在两个根本性缺陷:一是数据可能被污染(contamination),模型可能在训练时见过类似题目;二是标注质量参差不齐,推理链的正确性难以保证。
PrOntoQA 另辟蹊径:从零开始用程序构建一个完整的知识本体(ontology)——包含概念层级(如「Wumpus 是 Rompus 的一种」)、属性(如「Wumpus 是蓝色的」)和否定属性(如「Wumpus 不是善良的」),然后基于一阶逻辑(First-Order Logic, FOL)的七条演绎规则自动生成问答对。
这个知识本体是虚构的(fictional ontology),模型不可能在预训练中「作弊」,因为这些词(如 wumpus、yumpus、zumpus)根本不存在于真实世界。更妙的是,研究者还引入了**分布外(Out-of-Distribution, OOD)**测试集,通过改变上下文句子的顺序、跳步推理等手段,专门测试模型的泛化能力。
该研究后来扩展为 NeurIPS 2023 的第二篇论文《Testing the General Deductive Reasoning Capacity of Large Language Models Using OOD Examples》,进一步揭示了即使 GPT-4 在高跳步(7-hop)推理上正确率也会骤降至接近随机的水平。
整个项目由五个核心 Python 模块构成,分工明确:
theory.py — 本体构建引擎。OntologyNode 类定义了知识树结构,通过随机游走生成概念层级(最多 6 层),并为每个节点分配属性和否定属性。最终生成一个完整的、可供采样的知识图谱。
fol.py — 一阶逻辑公式库。实现了 FOLAnd、FOLOr、FOLNot、FOLIfThen 等逻辑运算符,以及全称量词和存在量词的公式结构。这是整个推理生成的形式化基础。
syntax.py — 自然语言生成器。将一阶逻辑公式翻译成英文句子。例如 FOLIfThen(F, G) 可能被翻译为「If F then G」或「All F are G」,并处理复数、形容词顺序等语法细节。
proof.py — 推理路径生成器。实现了七条演绎规则:Modus Ponens(肯定前件)、AndIntro(合取引入)、AndElim(合取消去)、OrIntro(析取引入)、OrElim(消去)、Proof By Contradiction(反证法)、Composed(组合规则)。每道题目的标准答案推理链就来自这里。
run_experiment.py — 实验调度器。整合以上所有模块,支持指定跳步数(hops)、few-shot 示例数量、模型类型(GPT-3/OPT/UnifiedQA)、本体类型(fictional/true/false)和多种采样策略,输出标准化的实验结果。
此外,prompt.py 负责构建 chain-of-thought 提示模板,opt.py 和 gpt3.py 封装了不同模型的 API 调用,unifiedqa.py 则对接 T5-based 的 UnifiedQA 模型。
使用 PrOntoQA 评估模型非常直接。克隆仓库、安装依赖后,只需一行命令即可启动实验:
python run_experiment.py --model-name gpt3 --model-size text-davinci-003 --ontology fictional --min-hops 2 --max-hops 7 --num-trials 100
这行命令告诉程序:用 text-davinci-003 模型,在虚构本体上,从 2 跳到 7 跳各跑 100 道题,记录正确率。输出包括每种跳步数下的准确率、chain-of-thought 解析结果,以及可绘制的性能曲线。
项目还提供了两个预生成的数据包:
model_outputs_v1.zip — 原始 PrOntoQA 论文中 GPT-3、OPT 等模型的完整输出model_outputs_ood.zip — OOD 测试集上的模型输出(2024 年 10 月更新了 bug 修复版)研究人员可以用 analyze_results.py 对这些输出做后验分析——比如统计模型最容易犯错的推理规则类型,或绘制「跳步数 vs 准确率」的衰减曲线。
值得注意的是,项目依赖 numpy、scipy 等标准科学计算库,无需 GPU 即可运行(调用 GPT-3 时需要网络),资源门槛极低。
PrOntoQA 最惊人的发现并非哪个模型表现最好,而是所有模型都展现出了「贪婪策略」(greedy strategy):当面临多步推理时,模型倾向于直接跳到看似合理的结论,而不是严格按演绎规则一步步推导。
具体表现为:
这些发现直接影响了后续研究对 LLM 推理能力的评估范式——人们开始意识到,仅在训练分布内测试是不够的,必须在 OOD 场景下检验模型的真实逻辑理解力。
PrOntoQA 是大语言模型推理能力评估领域的一个里程碑式工作。它用最小化的合成数据揭示了一个深刻的真相:模型可以表现得很聪明,但并不等于真正理解了逻辑。这个发现对 AI 爱好者理解 LLM 的局限性、对开发者设计更鲁棒的推理系统,都有重要启发意义。
项目本身也是一个高质量的学术开源范例:代码结构清晰、模块化良好、文档详尽(附完整论文引用)、数据可复现。尽管没有 Docker 部署支持,但对于 NLP 研究者和 LLM 评估工程师来说,安装和使用门槛都非常友好。