← 返回文章归档

AI 深度解读 2026.03.07

【深度解读】2026-03-07|LLM 永远写不出正确的代码?理解语言模型的本质局限

背景与问题定义

2026年3月6日,一篇标题为”LLM Doesn’t Write Correct Code. It Writes Plausible Code”的博客文章在 Hacker News 引发热烈讨论,截至目前已获得超过 200 个赞同。文章的核心观点并不复杂但极具冲击力:大型语言模型生成的不是”正确的代码”,而是”看似合理的代码”——这两者的区别可能在简单任务中不明显,但在复杂系统中足以造成严重故障。

这不是学术界第一次提出类似的观点。但这篇文章的特殊之处在于它来自一线开发者的实践经验分享,而非理论推导。文章作者是一个长期使用 LLM 进行编程的开发者,他详细记录了多次”代码看似正确但运行崩溃”的案例,并试图分析背后的原因。

理解 LLM 的这一本质局限,对于正确使用 AI 编程辅助工具至关重要。


核心机制拆解

语言模型的本质:下一个 token 预测

要理解为什么 LLM”写不出正确的代码”,需要回到大语言模型的本质训练目标。

所有现代 LLM 都是基于”下一个 token 预测”(Next Token Prediction)目标进行训练的。模型被喂入海量文本数据,任务是预测给定前文后下一个最可能出现的词元。这个目标函数本身不关心”正确性”,只关心”统计意义上的合理性”。

这意味着什么?模型学到的是”在给定上下文中,什么样的文本最可能出现”,而不是”什么是真正正确的”。这两个目标在大多数情况下是重叠的,但在某些场景下会产生显著差异。

“合理”与”正确”的区别

文章作者用了一个生动的比喻:这就像一个学生学习数学,他的练习册答案是”抄写”而非”计算”。在考试中,如果题目与练习册类似,他能写出完美答案;但一旦题目形式变化,他的”理解”就失效了。

具体到代码生成场景,这种差异表现为几种模式:

模式一:边界条件错误

def find_element(arr, target):
    for i in range(len(arr)):  # 正确:range(len(arr))
        if arr[i] == target:
            return i
    return -1

# LLM 可能写成:
def find_element(arr, target):
    for i in range(len(arr) + 1):  # 错误:多遍历一位
        if arr[i] == target:
            return i
    return -1

这段代码在大多数情况下能工作(当目标不在数组中时),但当目标存在于数组最后位置时会崩溃。

模式二:隐藏假设

LLM 常常做出未被明确说明的假设。比如假设输入总是有效的、假设不会有并发问题、假设文件总是存在。这些假设在训练数据中常见,但在特定业务场景中可能不成立。

模式三:表面正确的错误逻辑

# 用户要求:返回所有偶数
def get_evens(numbers):
    result = []
    for n in numbers:
        if n % 2 == 0:
            result.append(n)
        else:  # 不必要的 else 分支
            continue
    return result

这段代码功能上正确,但结构冗余。如果代码更复杂,这类”看似合理但多余”的逻辑可能悄然引入性能问题或难以调试的 bug。

为什么测试通过不等于代码正确

文章指出了一个更令人担忧的现象:LLM 生成的代码往往能通过测试,但测试本身可能不够全面。

在测试驱动开发(TDD)中,开发者会主动设计边界 case。但当开发者”信任 AI”时,他们更可能只运行基本的功能测试。LLM 生成的代码可能在 happy path 上表现完美,但在边界情况下失败。

更深层的问题是:即便测试失败了,开发者可能也难以理解失败原因——因为代码不是他们自己写的,逻辑链条不在他们的心智模型中。


实践价值与适用边界

LLM 编程适合什么场景

尽管存在上述局限,LLM 在以下场景中仍然非常有效:

样板代码生成 当需要生成标准化的代码模式(如 API 端点、CRUD 操作、常见数据结构)时,LLM 的表现通常很好。这些代码的模式在训练数据中出现频繁,模型”见过”大量正确实现。

代码翻译 将代码从一种语言翻译到另一种是 LLM 的强项。这不是”创造”,而是”转换”,LLM 在这类任务上表现稳定。

学习辅助 当开发者需要理解不熟悉的代码库时,让 LLM 添加注释、解释逻辑是有效的。它不会”创造错误理解”,因为它是在已有代码基础上进行解释。

LLM 编程不适合什么场景

关键基础设施 涉及安全、金融、医疗等高风险领域的代码,应该极度谨慎地使用 AI 生成。文章作者特别强调:绝不应该让 LLM 独立编写生产环境的核心逻辑。

新领域代码 当任务涉及开发者不熟悉的领域时,AI 生成的代码尤其危险。开发者无法有效验证代码的正确性,因为判断需要专业知识。

复杂系统设计 LLM 擅长生成”看起来对”的代码,但架构设计需要系统性的思考。AI 无法理解业务的完整上下文和约束条件。

实用的”人机协作”模式

基于以上分析,可以总结出更安全的 AI 编程工作流:

  1. AI 负责初稿,人负责验证:将 AI 生成的代码视为”第一稿”而非”最终稿”
  2. 测试先行:在让 AI 写代码之前,先明确测试 case——这迫使你思考边界条件
  3. 小步迭代:不要让 AI 生成大段代码,而是分步骤生成,每步验证
  4. 知识保留:即使使用 AI 辅助,最终也要确保自己理解代码逻辑

行业意义与启示

对 AI 编程工具开发者的启示

这篇文章在 Hacker News 上的热度表明,开发者社区对 AI 编程工具的认识正在从”崇拜”转向”务实”。

此前行业叙事过度强调”AI 将取代程序员”。但一线开发者的经验显示,这个论断至少在目前是过时的。AI 更像是”一个超级实习生”——可以快速产出,但需要资深工程师的指导和审核。

对于 AI 编程工具的开发者而言,这意味着单纯追求”生成更多代码”不是最优方向。更重要的是:

  • 增强代码可解释性(让开发者理解 AI 为什么这样写)
  • 集成更严格的测试和验证
  • 明确告知用户代码的置信度

对教育体系的启示

如果 LLM 写不出”真正正确”的代码,那它还能用于编程教育吗?

一个可能的回答是:工具的价值不只在”产出”,也在”学习过程”。即便 AI 生成的代码有局限,让学习者分析”AI 为什么这样写”、”这样写有什么问题”本身也是一种学习。

对评估标准的启示

当前对 LLM 编程能力的评估主要看”通过率”——在 HumanEval、MBPP 等基准上答对多少题。但这些基准无法衡量”代码在实际部署中的可靠性”。

行业可能需要新的评估范式:不是看”能否跑通测试”,而是看”在复杂场景下是否仍然正确”。


参考来源