引言

在通往通用人工智能 (AGI) 的竞赛中,推理能力被视为圣杯。我们需要的大型语言模型 (LLM) 不能仅仅是机械地复述事实,而是能够进行规划、演绎、通过逻辑解决复杂的谜题,并解决从未见过的问题。

目前,我们在训练这些模型时面临着一个悖论。对于像解数学题或编写代码这样的特定任务,我们要么拥有海量的数据,要么数据非常稀缺。因此,模型在这些狭窄的技能上变得相当出色。然而,涵盖逻辑演绎、科学推断和符号操作的通用推理能力,却受限于高质量、多样化训练数据的匮乏。你可以训练一个模型做数学,但这并不一定能帮助它解开一个逻辑谜题或理解一个科学假设。

那么,我们在哪里可以找到一本关于推理的通用“教科书”呢?

来自 DeepSeek-AI、上海交通大学和香港科技大学的一组研究人员在他们的论文 CODEI/O 中提出了一个优雅的解决方案。他们的假设非常迷人: 计算机代码本质上是推理能力的结晶。 每一个函数、循环和条件语句都代表了一个逻辑流、一个决策树或是一个状态空间搜索。

但仅仅向模型展示原始代码是不够的。研究人员开发了一种名为 代码输入输出预测 (Code Input-Output Prediction) 的新方法。他们不只是要求模型编写代码,而是要求模型扮演计算机的角色——在给定输入的情况下预测函数的输出,或者在给定输出的情况下逆向推导输入。

在这篇文章中,我们将深入探讨 CODEI/O。我们将探索如何将代码转化为推理任务,从而教导 LLM 用自然语言“思考”,进而在从数学到常识的各种基准测试中获得性能提升。

动机: 为什么要用代码?

在理解“如何做”之前,我们必须理解“为什么”。如果我们想提高通用推理能力,为什么要关注代码?

传统的原始代码 (如 GitHub 仓库) 预训练已经显示出对推理能力的一些益处。然而,它是充满噪声的。原始代码文件包含许可头、注释、导入错误和混乱的语法,这些都会分散对核心逻辑的注意力。此外,标准的“文本到代码”生成任务限制了模型,使其过分关注语法的正确性 (缩进、冒号、变量定义) ,而不是底层的解决问题过程。

CODEI/O 的作者认为,具有上下文背景的代码包含了通用的推理原语 :

  • 逻辑流规划 (Logic Flow Planning) : 构建操作序列。
  • 状态空间搜索 (State-Space Search) : 探索不同的可能性以找到解决方案。
  • 模块化分解 (Modular Decomposition) : 将大问题分解为小函数。
  • 决策树遍历 (Decision Tree Traversal) : 处理 if-else 条件。

如果我们能剥离繁重的语法负担,并强迫模型口头解释代码的执行过程,我们就能将这些推理技能迁移到自然语言任务中。

方法: 构建 CODEI/O

这篇论文的核心贡献是一个严谨的流程,将混乱的原始代码转化为专为推理设计的结构化训练数据集。

第一步: 从原始代码到统一格式

该过程始于从各种来源收集超过 800,000 个原始代码文件,其中包括“CodeMix” (一个内部语料库) 和“PyEdu-R” (教育推理代码) 。

这些原始文件无法直接使用。它们需要被清洗和标准化。研究人员使用 DeepSeek-V2.5 将这些代码重构为统一格式 (Unified Format) 。 该格式包括:

  1. 清洗后的参考代码 (Cleaned Reference Code) : 去除了打印语句、绘图或文件 I/O 的核心逻辑。
  2. 主入口点 (Main Entrypoint) : 一个封装了逻辑的单一函数。
  3. 输入生成器 (Input Generator) : 一个独立的 Python 函数,旨在为代码创建有效的、非平凡的测试用例。
  4. 查询 (Query) : 对问题解决内容的自然语言描述。

为了直观地展示这种转换,请看下面的例子。注意处理物理计算的混乱代码是如何被结构化为一个带有特定输入生成器的清晰函数的。

表 10: 一个完整的例子展示了我们如何将原始代码文件转换为我们设计的统一格式。

第二步: 预测任务

一旦代码变得干净且可执行,研究人员就开始生成训练数据。这就是 CODEI/O 中“I/O”的由来。

他们使用输入生成器执行代码,以创建有效的输入-输出对 (Input-Output Pairs) 。 有了代码、查询和这些配对,他们构建了两个截然不同的训练任务:

  1. 输出预测 (Output Prediction) : 给定代码和输入,模型必须预测结果。这迫使模型逐步模拟代码的执行。
  2. 输入预测 (Input Prediction) : 给定代码和输出,模型必须推导出会产生该结果的输入。这通常更难,需要逆向工程或约束满足推理。

至关重要的是,模型不仅仅被要求给出最终答案。它被训练为用自然语言生成思维链 (Chain-of-Thought, CoT) 理由。

图 1: 我们的训练数据构建概述: 从各种来源收集原始代码文件并将其转换为统一格式。然后通过执行代码生成输入-输出对,同时从 DeepSeek-V2.5 收集用于预测的自然语言思维链 (CoT) 。经过验证的 CoT 可以进行可选的修订,以进一步增强推理链。

如图 1 所示,该流程是循环的。原始代码产生输入/输出,这提示 AI 生成推理 (CoT) 。因为我们要拥有实际的代码,我们可以通过运行它来验证 AI 的预测是否正确。这种基于地面真值 (ground-truth) 的验证相对于标准的文本数据集是一个巨大的优势,因为在文本数据集中验证推理是很困难的。

第三步: 模型实际看到了什么

让我们看看这些训练样本是什么样子的。在下方的图 2 中,你可以看到两个任务之间的区别。

  • 左侧 (输出预测) : 模型追踪“硬币找零 (Coin Change) ”算法。在给出 JSON 输出之前,它用自然语言分解了贪心方法与最佳组合的对比。
  • 右侧 (输入预测) : 模型得到结果“4”,必须找到一个需要恰好 4 枚硬币的输入 (金额和硬币列表) 。它测试假设 (“假设我们有硬币 [1, 2, 5]…”) 直到找到匹配项。

图 2: 分别为输入和输出预测收集的响应的两个示例。

这种“语言化执行”将推理与语法解耦。模型不再担心漏掉分号;它担心的是算法的逻辑。

第四步: CODEI/O++ 与多轮修订

研究人员并没有止步于初始预测。因为代码是可执行的,他们可以自动检查生成的训练数据是否正确。

如果教师模型 (DeepSeek-V2.5) 在数据创建过程中生成了错误的预测,系统会捕获错误 (例如,“你的输入导致结果为 3,而不是 4”) 。然后,它会将此错误作为提示反馈给模型: “这错了,再试一次。”

这个过程创造了 CODEI/O++ , 这是一个通过多轮修订丰富了的数据集。它不仅教模型如何推理,还教模型如何根据反馈进行自我修正

图 7: 在多轮修订中,我们跟踪了每一轮修订后整个数据集中每种响应类型的百分比 (%)。

图 7 展示了这个修订过程。在第一轮 (Turn-0) 中,大约 50% 的预测是正确的。通过增加一个修订步骤 (Turn-1) ,很大一部分“错误 (Wrong) ”答案被转化为“正确 (Correct) ”。有趣的是,研究人员发现,进行一次以上的修订 (Turn-2) 产生的收益递减,因此 CODEI/O++ 主要关注第一次有影响力的修订。

实验与结果

这种方法真的有效吗?研究人员通过将 CODEI/O 用作几个流行基础模型 (Qwen 2.5 Coder, LLaMA 3.1, DeepSeek Coder V2, Gemma 2) 的“第一阶段”训练步骤来测试它。随后,他们进行了标准的指令微调。

他们在 14 个不同的基准测试上评估了模型,涵盖数学 (GSM8K, MATH) 、推理 (Big-Bench Hard) 、知识 (MMLU-STEM) 和代码 (CruxEval) 。

主要性能

结果令人印象深刻。CODEI/O 始终优于基准方法。

表 1: 所有基准测试的主要评估结果。

请看表 1。绿色单元格表示相对于基线 (标准指令微调) 的性能提升。

  • 一致性: 不同于其他数据集如 OpenMathInstruct2 (它在数学方面很棒,但有时会损害其他领域的性能,如红色单元格所示) ,CODEI/O 在几乎所有类别中都提供了均衡的提升
  • 符号推理: 看看 BBH (Big-Bench Hard) 的分数。CODEI/O 在这里提供了显著的收益,证明从代码中学到的逻辑可以迁移到通用的符号任务中。
  • 科学推理: GPQA (研究生水平科学) 和 MMLU-STEM 的提升表明,代码所需的结构化思维有助于严谨的科学领域。

与其他方法的比较

你可能会问: “这仅仅是因为 DeepSeek-V2.5 是一个聪明的模型,而我们正在蒸馏它的知识吗?”

为了测试这一点,研究人员将 CODEI/O 与 WebInstruct 进行了比较,后者是一个包含 1160 万样本的海量数据集 (远大于 CODEI/O 的 350 万) 。他们甚至创建了一个 WebInstruct 版本,其中他们使用 DeepSeek-V2.5 重新生成了答案 (WI-DS25) ,以确保比较的公平性。

图 3: 在 CODEI/O、3.5M WebInstruct 子集 (WI) 和从 DeepSeek-V2.5 直接蒸馏的增强版本 (WI-DS25) 上进行第一阶段训练的平均分数。

图 3 显示了结果。即使“教师”模型相同, CODEI/O (最左侧的紫色和蓝色条) 也优于 WebInstruct。 这证明了数据的来源——代码输入/输出预测——在学习推理方面本质上比标准的网络数据更有价值。

缩放定律

对于任何数据集,另一个关键问题是: “更多的数据是否等于更好的性能?”

对于 CODEI/O 来说,答案似乎是肯定的。

图 4: CODEI/O 在第一阶段训练中的缩放效应。

左侧的图 4(a) 显示了 Qwen 模型随着 CODEI/O 数据集规模增加的性能变化。随着数据集从 0.32M 增长到完整的 3.52M 样本,雷达图在几乎所有轴上 (数学、符号、逻辑) 都向外扩展。这表明代码中发现的推理模式的多样性是巨大的,随着模型看到更多的例子,它会继续学习。

讨论: 为什么这很重要

CODEI/O 论文强调了我们对训练数据思考方式的转变。长期以来,人们假设要擅长数学,你就得训练数学。要擅长生物学,你就得训练生物学。

CODEI/O 表明推理是一种可迁移的技能。 通过训练模型追踪计算轨迹或排序列表的 Python 脚本的执行,我们正在教它以下思维原语:

  1. 变量跟踪。
  2. 条件逻辑。
  3. 迭代处理。

当模型后来遇到关于安排婚礼座位的文字问题 (一个逻辑谜题) 时,它会重用相同的神经通路。它将文字问题视为一个待心理执行的“程序”。

数据泄露?

作者非常仔细地检查了“数据泄露”——即模型只是记住了测试集中出现的代码问题的可能性。他们进行了严格的 13-gram 重叠分析。

虽然他们在编码基准测试 (如 LeetCode) 中发现了一些重叠,但在通用推理基准测试 (MMLU, GSM8K, MATH) 中的重叠几乎为零 (0.1%) 。然而,在这些零重叠区域的性能提升是巨大的。这证实了模型正在学习模式,而不仅仅是记忆答案。

结论

CODEI/O 代表了训练大型语言模型向前迈出的重要一步。通过将代码沉默、结构化的逻辑转化为显式的、自然语言的输入-输出预测,研究人员解锁了一个巨大的、可扩展的训练数据源。

主要收获如下:

  1. 代码即推理: 代码不仅仅是为了计算机;它包含了逻辑思维的蓝图。
  2. 语言化执行: 强迫模型用自然语言解释代码执行 (CoT) ,弥合了语法与逻辑之间的鸿沟。
  3. 广泛迁移: 这种训练不仅提高了编码性能,还提高了数学、科学和常识方面的性能。
  4. 自我修正: 使用代码执行来验证和修订训练数据 (CODEI/O++) 进一步提高了可靠性。

当我们展望 AI 的未来时,像 CODEI/O 这样的方法表明,通往更智能模型的道路可能不在于阅读更多的书,而在于理解运行我们世界的逻辑——一次一个函数。