V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
drymonfidelia
V2EX  ›  程序员

为什么 LLM 生成的代码这么多逻辑错误/凭空编出来的 API,却几乎见不到语法错误?用了后处理还是代码是从 AST 转换回来的?

  •  
  •   drymonfidelia · 2 天前 · 1546 次点击
    11 条回复    2025-11-15 15:06:16 +08:00
    tamakiui
        1
    tamakiui  
       2 天前 via Android
    语言的泛化能力被错误用到了 api ?
    yukino
        2
    yukino  
       2 天前
    让大模型写宏就容易错了
    codehz
        3
    codehz  
       2 天前 via Android   ❤️ 2
    语法错误有明确且可量化的评价标准,非常适合用于强化学习
    sillydaddy
        4
    sillydaddy  
       1 天前 via Android
    谜底就在迷面上。它的自然语言,你也肯定找不到一丁点的语法错误。
    suni
        5
    suni  
       1 天前   ❤️ 1
    有语法错误的,cursor 每次会自己 lint 一遍
    liyafe1997
        6
    liyafe1997  
       1 天前   ❤️ 10
    你不能用 AST 这些传统的算法/逻辑来理解 AI ,AI 是没有逻辑的。

    各种 LLM 最基本的原理说白了就是「吐出下一个概率最高的 token 」,大量的各种语言的代码的训练数据基本就保证了,不会吐出导致语法错误的 token ,换句话说,导致语法错误的 token 不会得到高分(因为在训练数据中没有这种 case ),所以不会吐出来。

    就跟我们学习人类语言一样,你可能不了解一种语言的语法,但是从小到大有大量的 input (比如你的母语,中文,我想没多少人真的懂其中的门道),所以你也不太容易说出写出语法错误的句子,因为跟你以前看到的听到的别人说的不一样,会感觉很别扭(虽然你也说不出其中的规则),除非训练数据被污染了(比如你整天看很多中二的东西,那你说话可能也会变得很中二)。

    「逻辑错误/凭空编出来的 API 」,这就是所谓的幻觉,因为相关训练数据缺失,在这种情况下,一个概率最大的 token 可能就会是不正确的信息(编出来的 API ),因为实在没有其它更好的选择了,(即,尽管概率得分不大,但是依然是最大的那个,或者说,没有比它更正确的信息了)。

    比如 AI 不知道到底有哪些 API ,你的 prompt 提到一个「读用户年龄信息」,根据你的仓库里的代码,它可能会脑补出一个 GetUserAgeFromDB(),但是怎么样也不会吐一个 GetYourMoneyFromDB(),因为这时 token 一路吐下去,最正确的回答就是「 GetUserAgeFromDB()」。

    还是拿人类思维和语言来举例子,比如你从小在城市长大,你没见过西瓜是怎么长的,也没阅读过有相关内容的资料(训练数据缺失)。然后呢老师让你写作文,写篇「去乡下摘西瓜的故事」( prompt ),然后呢根据你从小到大的 input ,你知道西瓜是水果,然后呢水果一般都是长在树上的(「果」这个 token 后面经常跟着「树」)苹果也是水果,苹果树也经常出现,所以当你写下「西瓜」的时候,「树」这个 token 在你脑海里得分是很高的,于是你写下了「西瓜树」,幻觉就这么来了。尽管「西瓜树」是错的,但是你也不会写下「西瓜人」,「树」比「人」概率更大。

    但是从语法层面,你不大可能犯错误,尽管你可能并不懂什么主谓宾定状补这些语法知识和规则,但你会写出「我->去->爬->西瓜->树」,因为在你以前阅读过的材料(训练数据)中见过很多类似的组合(你见过很多句子第一个字是「我」,因此「我」在这里概率是最高的,然后「我」后面经常跟着「去」,于是你写了「去」......),你不大可能会写出「爬去我」,因为训练数据里你没见过「爬」放句首的,所以这个得分不会高,你就不会吐「爬」出来,「爬」后面也不会跟着「去」......因此你不会写出语法错误的句子,尽管你并不懂具体的语法规则。
    liyafe1997
        7
    liyafe1997  
       1 天前 via Android
    写上面这个的时候突然想到以前看到过的一个很好玩的视频:
    https://www.bilibili.com/video/BV1Pt421a7rw/

    这人估计因为什么原因,脑子里的 LLM 丢失了大量参数,像极了 LLM 规模过小过拟合在胡言乱语,但是无论是上面这人还是 LLM 胡言乱语,你会发现把每一句话单独挑出来都没毛病,至少语法是正确的。编程语言也是,你用一个再垃圾的模型让它写主流编程语言的复杂需求的代码,代码逻辑可能乱写一通,但语法基本上是对的。说明语法这个层面的信息(无论是编程语言还是人类语言)是非常基本的,小模型都不容易犯错,别说大模型了。
    litchinn
        8
    litchinn  
       1 天前
    因为 LLM 仍然是基于概率的,它的训练数据中几乎不会有语法错误的代码,它出现语法错误自然也是小概率
    zololiu
        9
    zololiu  
       1 天前
    @liyafe1997 #6 比喻写得太好了大佬!
    maolon
        10
    maolon  
       20 小时 53 分钟前
    准确的说是后训练这步操作里,在 RL 过程中错误的语法会被惩罚,而正确的语法会被奖励。

    语法这种东西一般是可以定性的(而且也相对比较稳定,一般新版本也只是在老语法上加东西,很少会去改已有语法),错就是错,对就是对,只要有大量的正确的训练例子做基础,哪怕不是那么大的模型也不会犯语法错误。

    而 api 这种东西
    1. 没有一个很明显的对错标准,有可能上个版本这个 api 还存在,下个版本就 deprecated 了,模型可能训练了老版本的 api
    2. 这么多的库,有些常用的被训练进去了,还有很多不常用的没有训练(以及模型参数量本身太小做出的取舍)
    3. 库和库之间很可能 api 的名称相差很小,导致训练后模型很难做出区分

    TLDR:语法容易训练,api 难,且要经常保持更新,所以语法基本不会错,api 经常错
    defaw
        11
    defaw  
       14 小时 16 分钟前
    ai 不管 ast 的,语法和 api 的关系你可以参考 ai 和你对话和知识问答的关系。ai 可以和你流畅对话,这是语法对了,但是知识问答说的不对,这是就是 api 不对。
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   Solana   ·   820 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 21:22 · PVG 05:22 · LAX 13:22 · JFK 16:22
    ♥ Do have faith in what you're doing.