为什么 LLM 生成的代码这么多逻辑错误/凭空编出来的 API,却几乎见不到语法错误?用了后处理还是代码是从 AST 转换回来的? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
drymonfidelia
V2EX    程序员

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

  •  
  •   drymonfidelia 1 天前 1384 次点击
    11 条回复    2025-11-15 15:06:16 +08:00
    tamakiui
        1
    tamakiui  
       1 天前 via Android
    语言的泛化能力被错误用到了 api ?
    yukino
        2
    yukino  
       1 天前
    让大模型写宏就容易错了
    codehz
        3
    codehz  
       1 天前 via Android   2
    语法错误有明确且可量化的评价标准,非常适合用于强化学习
    sillydaddy
        4
    sillydaddy  
       1 天前 via Android
    谜底就在迷面上。它的自然语言,你也肯定找不到一丁点的语法错误。
    suni
        5
    suni  
       1 天前   1
    有语法错误的,cursor 每次会自己 lint 一遍
    liyafe1997
        6
    liyafe1997  
       1 天前   9
    你不能用 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  
       7 小时 50 分钟前
    准确的说是后训练这步操作里,在 RL 过程中错误的语法会被惩罚,而正确的语法会被奖励。

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

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

    TLDR:语法容易训练,api 难,且要经常保持更新,所以语法基本不会错,api 经常错
    defaw
        11
    defaw  
       1 小时 13 分钟前
    ai 不管 ast 的,语法和 api 的关系你可以参考 ai 和你对话和知识问答的关系。ai 可以和你流畅对话,这是语法对了,但是知识问答说的不对,这是就是 api 不对。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2695 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 08:20 PVG 16:20 LAX 00:20 JFK 03:20
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86