CS336 · 第 18 课

Guest Lecture:Daniel Selsam

形式化验证、程序合成与 LLM:当语言模型遇到绝对正确性。Daniel Selsam 分享形式化方法如何为 AI 系统提供数学级别的保证。

嘉宾:Daniel Selsam(Stanford / Lean FRO) 预计用时:75 分钟 难度:中等 → 较高

来源状态:Spring 2026 官方日程确认本讲嘉宾为 Daniel Selsam,但当前官方仓库未提供可核对的 handout 或 trace。

以下内容仅作为主题背景导读,不视为官方客座讲义的逐段重建。

本讲问题:LLM 可以生成程序、证明和数学步骤,但语言流畅不等于正确;本讲关注怎样把 verifier 放进生成循环,让错误能够被机械检查并反馈。

30 秒知识地图

形式化规格 → verifier → 候选生成 → verification-guided search / synthesis → 数学与程序应用 → verifier 覆盖范围决定可靠性边界。

来源边界与 prerequisite refresher

Spring 2026 官方日程只确认 guest lecture 与讲者,本页没有可核对的本地 handout;以下内容是围绕讲者研究方向建立的学习框架,不应冒充逐页讲义。命题是待证明 statement,proof term 是可由 trusted kernel 检查的对象;测试只覆盖样例,形式化证明覆盖 specification 描述的全部情况。

可验证生成闭环

informal intent → formal specification
                         ↓
generator → candidate proof/program → verifier
     ↑                           pass / diagnostic
     └──────── search / repair ────────┘

verifier soundness + specification coverage
→ define what “verified” actually guarantees

测试通过与证明通过

程序声称对所有整数 \(x\) 返回 \(x^2≥0\)。测试 \(x=-1,0,2\) 只能说明三个点;证明需要由整数平方性质推出任意 \(x\) 都成立。反例:若 specification 错写成“对测试集合中的 x”,proof 可完全正确却没有覆盖原意。

为什么 verifier 不是事实机器

Lean kernel 能检查 proof 是否符合已声明 axioms/types,不负责判断 informal theorem 是否正确翻译、库中的假设是否符合现实。Verification-guided generation 降低非法输出率,但 generator 仍可能卡在搜索、利用过弱规格或只对可形式化部分成功。


关于讲者

Daniel Selsam 是形式化验证和程序合成领域的研究者。他参与创建了 Lean 定理证明器,并致力于将形式化方法应用于 AI 系统。他的工作横跨:

核心问题:LLM 可以生成看起来正确的代码和推理,但我们如何确信它是正确的?形式化验证提供了传统测试无法实现的数学级别的保证。


形式化验证基础

什么是形式化验证?

传统测试:运行程序,检查输出是否正确。只能证明存在 bug,不能证明没有 bug。

形式化验证:用数学方法证明程序满足规范。可以证明不存在特定类型的 bug。

# 例: 排序函数的规范

# 传统测试:
def test_sort():
    assert sort([3, 1, 2]) == [1, 2, 3]
    assert sort([]) == []
    assert sort([1]) == [1]
    # 测试通过 ≠ 所有输入都正确

# 形式化验证 (Lean 风格):
def sort (list : List Nat) : List Nat := ...

theorem sort_is_sorted (list : List Nat) :
  sorted (sort list) := by
  -- 证明: sort 的输出总是有序的
  ...

theorem sort_is_permutation (list : List Nat) :
  Permutation list (sort list) := by
  -- 证明: sort 的输出是输入的排列(没有丢元素)
  ...

Lean 定理证明器

Lean 是一个开源的编程语言和证明助手:

形式化验证 vs 测试

维度测试形式化验证
保证部分覆盖数学证明
适用范围所有程序需要可形式化的规范
成本低高(需要专业知识)
发现 bug可以可以(在证明过程中)
证明无 bug不能能(对特定属性)

程序合成

什么是程序合成?

从高层规范自动生成程序。LLM 是程序合成的一种实现方式。

传统程序合成:
输入: 规范(如类型签名 + 示例)
输出: 满足规范的程序

例: 合成一个 reverse 函数
规范:
- 类型: List A → List A
- 示例: reverse [1, 2, 3] = [3, 2, 1]
- 属性: reverse (reverse xs) = xs

LLM 程序合成:
输入: "写一个函数反转列表" (自然语言规范)
输出: 代码

关键区别:
传统: 规范是形式化的,可以验证
LLM: 规范是自然语言的,无法严格验证

LLM 用于程序合成

现代 LLM(如 Codex、DeepSeek-Coder)可以进行程序合成:

LLM 程序合成的根本问题:LLM 生成的代码看起来正确,但无法保证正确。测试通过 ≠ 正确。形式化验证可以提供这种保证,但 LLM 目前还不能可靠地生成形式化证明。


Verification-Guided Generation

核心思想

将 LLM 的生成能力与形式化验证的保证能力结合:

# Verification-Guided Generation:
#
# 1. LLM 生成候选程序
# 2. 形式化验证器检查正确性
# 3. 如果不通过,反馈给 LLM 重新生成
# 4. 重复直到通过或超时

# 伪代码:
def verify_guided_generate(spec, max_attempts=10):
    for attempt in range(max_attempts):
        # LLM 生成
        code = llm.generate(spec)

        # 验证器检查
        result = verifier.verify(code, spec)

        if result.is_valid:
            return code  # 通过!

        # 不通过,反馈错误信息
        feedback = result.error_message
        llm.add_feedback(feedback)

    return None  # 所有尝试都失败

优势

挑战


AI for Mathematics

AlphaProof (Google DeepMind)

AI 系统在数学竞赛中取得突破:

Lean 作为验证平台

# Lean 在 AI for Math 中的角色:

# 1. 形式化问题陈述
-- 例: 费马大定理
theorem flt (n : Nat) (hn : n ≥ 3)
  (a b c : Nat) (ha : a > 0) (hb : b > 0) :
  a^n + b^n ≠ c^n := by
  -- ...
  sorry  -- 这里放证明

# 2. LLM 生成证明步骤
# 3. Lean 检查每一步是否正确
# 4. 如果所有步骤都通过,定理被证明

形式化数学库 (Mathlib)


验证 LLM 输出

为什么需要验证 LLM?

LLM 在许多场景中被使用,其中错误代价很高:

验证方法

方法适用场景保证程度
形式化验证代码、协议、算法数学证明
符号执行有限状态系统路径覆盖
类型检查类型化语言类型安全
运行时监控任何系统运行时的部分保证

LLM 输出的形式化验证

# 例: 验证 LLM 生成的排序算法

# Step 1: LLM 生成代码
code = llm.generate("写一个快速排序")

def quicksort(arr):
    if len(arr) <= 1:
        return arr
    pivot = arr[0]
    left = [x for x in arr[1:] if x <= pivot]
    right = [x for x in arr[1:] if x > pivot]
    return quicksort(left) + [pivot] + quicksort(right)

# Step 2: 形式化规范
# 规范 1: 输出是有序的
# 规范 2: 输出是输入的排列
# 规范 3: 时间复杂度 O(n log n) 平均

# Step 3: 验证
# 用 Lean/Coq/Isabelle 证明代码满足规范
# 如果验证通过 → 数学保证正确

未来方向

1. LLM + 证明助手

让 LLM 直接生成形式化证明,由证明助手验证:

2. 神经符号方法

结合神经网络(LLM)和符号推理(证明助手):

3. 可验证的 AI 系统

构建可以数学证明其行为正确的 AI 系统:

4. 形式化 LLM 行为

用形式化方法描述和验证 LLM 本身的行为:

关键洞察:LLM 和形式化验证是互补的技术。LLL 擅长生成(但不可靠),形式化验证擅长验证(但需要规范)。将两者结合,可以构建既强大又可靠的 AI 系统。


知识检查

问题 1:形式化验证相比传统测试的主要优势是什么?

问题 2:Lean 是什么?

问题 3:Verification-guided generation 的核心思想是什么?

问题 4:LLM 和形式化验证的关系是什么?


Concept Check · proof 证明了错误 specification

Proof kernel 接受了证明,但 specification 漏掉负数输入。能否声称原始程序需求已验证?

答案:不能;只验证了 formal statement,informal intent 到 specification 的翻译仍有缺口。

若答“能,因为 kernel sound”,你把 proof checking soundness 扩张成了 specification completeness。

你现在应该能够解释

通往第 19 课

Verifier 给“结果是否满足规格”的反馈;最后一课回到系统测量,展示 profiler 与 hardware cost model 怎样给“实现为什么慢”的反馈。

如果只能记住 5 件事

形式化验证

数学证明程序正确,超越测试

Lean

开源定理证明器,Mathlib 形式化数学库

Verification-Guided

LLM 生成 + 验证器检查的循环

互补性

LLM 生成能力 + 形式化验证的保证


延伸阅读

Reference · 延伸阅读与一手资料