Each language version is independently generated for its own context, not a direct translation.
这篇文章介绍了一个名为 FM-Agent 的新工具,它的任务是给那些由人工智能(AI)自动编写的庞大软件系统“做体检”,找出其中的漏洞。
为了让你更容易理解,我们可以把编写软件想象成建造一座巨大的摩天大楼,而 FM-Agent 就是这位超级智能的建筑监理。
1. 背景:AI 造楼,但容易“偷工减料”
现在,AI(比如 Claude Code、GitHub Copilot)已经能像熟练的工人一样,自动写出几十万行代码,甚至能造出编译器、操作系统这样的大楼。
- 问题:AI 有时候会“幻觉”,写出的代码虽然看起来像那么回事,但里面藏着很多隐蔽的 Bug(就像大楼里藏着没焊好的钢筋或没封好的窗户)。
- 难点:以前,要检查大楼是否安全,需要人类专家写一份份详细的“施工规范”(形式化规范),告诉检查员每一根柱子应该多粗、每一层楼应该多高。但这太累了,尤其是当大楼是 AI 自己盖的,人类甚至不知道 AI 原本想盖成什么样,根本写不出准确的规范。
2. 核心创新:FM-Agent 的“逆向思维”
传统的检查方法是“自下而上”:先看砖块(代码实现),再猜它应该是什么样子。如果砖块本身是歪的,猜出来的规范也是歪的。
FM-Agent 换了一种**“自上而下”**的聪明做法,它有三个绝招:
绝招一:看“客户”的需求,而不是看“砖块”的瑕疵
- 比喻:想象你在检查一个房间的门。
- 传统方法:直接看门做得怎么样。如果门是歪的,你就以为“这扇门本来就是歪的”,从而忽略了它其实应该装直。
- FM-Agent 方法:它不看门本身,而是看谁在推这扇门(调用者)。如果推门的人(上层代码)以为门是直的,并且按照“门是直的”这个预期去推,但门却卡住了,那就说明门(被调用的函数)有问题。
- 原理:FM-Agent 利用 AI 分析“调用者”是如何使用某个函数的。通过调用者的意图,它能推断出这个函数应该做什么,而不是它实际做了什么。这样,即使函数本身有 Bug,FM-Agent 也能发现它“辜负了调用者的期望”。
绝招二:用“人话”写规范,而不是“天书”
- 比喻:以前的检查员只懂一种极其复杂的“数学语言”(形式化逻辑),人类很难写,AI 也很难理解。
- FM-Agent 方法:它直接让 AI 用自然语言(人话)来写规范。比如:“如果输入是空字符串,就返回错误”。
- 原理:现在的 AI 既懂代码逻辑,又懂人话。FM-Agent 把霍逻辑(一种经典的程序验证理论)升级了,让 AI 直接用自然语言去推理:“如果 A 发生,B 应该变成什么样”。如果最后的结果和“人话”规范对不上,就报警。
绝招三:不仅报警,还“现场演示”
- 比喻:以前的检查员发现 Bug 后,只说“这里可能有问题”,但说不清怎么复现。
- FM-Agent 方法:它发现 Bug 后,会立刻现场造一个“事故现场”(生成测试用例)。
- 原理:它会生成一个具体的输入程序,跑一遍,如果大楼真的塌了(程序崩溃或结果错误),它就确认这是一个真 Bug,并告诉人类:“看,只要输入这个,大楼就会塌。”这大大减少了误报。
3. 它的威力有多大?
研究人员用 FM-Agent 检查了几个由 AI 自动生成的巨型系统(有的高达 14 万行代码,相当于一个小型操作系统或编译器):
- 速度:它能在 2 天内完成检查。
- 战果:这些系统原本已经经过人类和 AI 的多轮测试,但 FM-Agent 还是挖出了 522 个新 Bug!
- 后果:这些 Bug 有的会导致系统崩溃,有的会导致计算结果错误,非常危险。
4. 总结
FM-Agent 就像是一个拥有“读心术”的超级监理。
它不纠结于代码写得有多烂,而是通过观察“谁在用这段代码”以及“用户想要什么”,来推断代码应该是什么样。一旦发现实际表现和预期不符,它就立刻现场演示故障。
这项技术解决了 AI 时代软件开发的痛点:当代码是 AI 写的,人类看不懂时,我们如何保证它不出错? FM-Agent 给出了一种自动化的、可扩展的解决方案,让大型 AI 生成系统变得更安全、更可靠。
Each language version is independently generated for its own context, not a direct translation.
FM-Agent 技术总结:基于大语言模型的霍风格推理实现大规模系统形式化验证
1. 研究背景与问题 (Problem)
随着大语言模型(LLM)辅助软件开发(如生成编译器、操作系统等)的普及,自动生成的大规模系统(通常超过 10 万行代码)中可能包含由 LLM 幻觉导致的严重 Bug。传统的自动化推理技术(如符号执行)在面对大规模系统时,受限于路径爆炸和无法处理无界循环,难以扩展。
虽然**霍逻辑(Hoare Logic)**提供了一种通过组合推理(Compositional Reasoning)将大系统分解为小组件进行验证的理论基础,但现有方法在大规模系统中面临三大核心瓶颈:
- 规范生成困难:霍逻辑要求为每个函数编写形式化规范(前置/后置条件)。现有方法多基于代码实现生成规范,若实现本身有 Bug,生成的规范也会错误,无法反映开发者的真实意图。
- 自然语言与形式化语言的鸿沟:开发者的意图通常表达为自然语言(文档、Prompt),而现有验证器仅支持形式化公式,导致意图无法直接转化为验证输入。
- 缺陷定位与确认缺失:传统验证器在验证失败时无法提供具体的 Bug 原因,且无法确认 Bug 是否真实存在(由于程序验证的不可判定性,验证失败可能是规范过强或代码有错)。
2. 方法论 (Methodology)
论文提出了 FM-Agent,这是首个实现大规模系统自动化组合推理的框架。其核心思想是利用 LLM 的能力,采用**自顶向下(Top-Down)**的范式生成规范,并将霍逻辑推理泛化到自然语言层面。
2.1 核心洞察与策略
- 洞察 I:基于调用者生成规范(自顶向下)
- 策略:不基于可能包含 Bug 的实现生成规范,而是分析**调用者(Caller)**的代码和意图。调用者对函数行为的期望(通过传入参数和后续处理逻辑体现)更能反映真实需求。
- 机制:FM-Agent 从入口函数开始,利用 LLM 分析调用者代码,推导出被调用函数的预期前置/后置条件。若函数被多个调用者调用,则合并所有调用者的预期行为生成综合规范。
- 洞察 II:LLM 理解代码语义与自然语言
- 策略:利用 LLM 准确预测小代码块执行结果的能力,将霍逻辑推理规则泛化到自然语言规范。
- 机制:推理过程不再依赖形式化公式,而是让 LLM 根据自然语言前置条件,逐块推断代码执行后的后置条件。如果某条执行路径的最终后置条件无法蕴含规范中的后置条件,则报告潜在 Bug。
- 洞察 III:系统级测试用例生成
- 策略:利用 LLM 捕捉系统入口输入与内部函数行为之间的关联。
- 机制:当推理发现潜在 Bug 时,FM-Agent 自动生成系统级测试用例(而非仅针对单个函数的单元测试),以触发并确认 Bug。这有助于开发者直接理解 Bug 的根因。
2.2 框架工作流
FM-Agent 包含三个主要组件,支持高度并发:
- 规范生成器 (Specification Generator)
- 任务:为每个函数生成自然语言规范(前置/后置条件)及预期规范。
- 流程:
- 构建函数调用图,识别强连通分量(SCC)。
- 将系统分解为多个自包含的“阶段(Phases)”,并基于调用图进行分层(Layering)。
- 按层处理:先处理入口层,利用 LLM 结合领域知识(如 C 标准)和调用者行为生成规范。
- 并发优化:同一层内的函数规范生成可并行执行;不同阶段也可并行。
- 代码推理器 (Code Reasoner)
- 任务:验证函数实现是否符合其规范。
- 流程:
- 假设被调用函数的预期规范已满足(组合推理原则)。
- 利用 LLM 对代码块进行霍风格推理:从前置条件出发,逐块推断后置条件。
- 检查最终路径的后置条件是否蕴含规范中的后置条件。若蕴含失败,标记为潜在 Bug。
- 支持将部分精确的自然语言条件转换为形式化公式,结合 SMT 求解器提高精度。
- Bug 验证器 (Bug Validator)
- 任务:确认潜在 Bug 并生成复现用例。
- 流程:
- 根据推理出的 Bug 原因,利用 LLM 生成系统级测试用例(如 C 程序、SQL 查询)。
- 在测试环境中运行用例,对比预期结果(或与参考实现对比)。
- 设置重试阈值(如 10 次),仅当测试成功触发 Bug 时才报告,以减少 LLM 幻觉导致的误报。
3. 关键贡献 (Key Contributions)
- 首个大规模自动化组合推理框架:FM-Agent 是首个能够处理 10 万行以上代码系统并实现自动化组合推理的框架。
- 自顶向下的规范生成范式:提出了一种基于调用者意图生成规范的新方法,有效避免了“基于有 Bug 的实现生成有 Bug 的规范”这一循环问题,确保规范反映开发者真实意图。
- 自然语言霍逻辑推理:突破了传统验证器仅支持形式化公式的限制,将霍逻辑推理规则泛化至自然语言规范,使得 LLM 生成的代码和文档能直接参与验证。
- 系统级 Bug 定位与确认:不仅发现 Bug,还能自动生成系统级测试用例来复现 Bug,解决了传统验证器“只报错不解释”且难以确认 Bug 真实性的问题。
4. 实验结果 (Results)
FM-Agent 在四个由不同 LLM 智能体自动生成的超大规模系统中进行了评估:
- 评估对象:
- CCC (Claude's C Compiler): 14.3 万行代码,4957 个函数。
- VibeTensor (NVIDIA 深度学习框架): 10.8 万行代码。
- VibeOS (操作系统内核): 1.5 万行代码。
- Bespoke OLAP (SQL 查询引擎): 1.1 万行代码。
- 发现 Bug 数量:尽管这些系统已经经过开发者使用单元测试、集成测试、差分检查等多种手段测试,FM-Agent 仍发现了 522 个新 Bug。
- CCC: 339 个(包括代码生成错误、运行时输出错误、编译崩溃等)。
- VibeTensor: 141 个(包括张量值错误、内存泄漏等)。
- VibeOS: 23 个(包括内存损坏、死循环等)。
- Bespoke OLAP: 19 个(包括查询结果截断、静默接受无效输入等)。
- 性能与扩展性:
- 在 2 天内完成了所有系统的推理。
- 总消耗 Token 数约 34 亿。
- 通过分层和分阶段并发处理,实现了极高的扩展性。
- 消融实验:若不使用自顶向下范式(仅基于实现生成规范)且不使用霍风格推理,Bug 发现率从 339 个降至 57 个,证明了核心方法的有效性。
5. 意义与展望 (Significance)
- 填补了大规模 LLM 生成代码验证的空白:在 LLM 生成代码日益普及的背景下,FM-Agent 提供了一种无需人工编写繁琐形式化规范即可验证大规模系统正确性的可行方案。
- 实用性与互补性:虽然 FM-Agent 不保证形式化验证的“完备性”和“绝对正确性”(Soundness),但它极大地扩展了验证的规模(Scalability),能够发现传统工具因无法扩展而遗漏的深层逻辑错误。它是现有形式化验证工具的重要补充。
- 推动自然语言与形式化方法的融合:证明了利用 LLM 在自然语言和代码语义之间进行推理的潜力,为未来构建更智能的软件开发辅助工具(如自动修复、测试生成)奠定了基础。
- 未来方向:包括支持并发程序推理(引入依赖 - 保证逻辑等)、将生成的规范用于指导测试用例生成、以及扩展至 LLM 应用本身的推理。
总结:FM-Agent 通过创新的自顶向下规范生成和自然语言推理机制,成功将形式化方法扩展到了传统工具无法触及的大规模自动代码系统,显著提升了软件系统的可靠性,是 LLM 时代软件工程领域的一项重要突破。