大型语言模型在多大程度上只是复制它们见过的代码?
比你想象的要多得多。研究人员从一个代码模型中提取了2万个输出(每个输出长度为512个token),发现其中有超过40,125个代码片段是从训练数据中逐字记忆下来的[4]。这意味着平均每个输出包含两个被记忆的片段。该研究还构建了一个关于被复制内容的分类体系——涵盖从API使用模式到完整函数等不同层次——并发现,更大的模型比小模型记忆更多内容,而更长的输出也会增加记忆风险。关键在于,某个代码片段在训练数据中出现的频率越高,它在生成输出中出现的可能性就越大,这表明对训练数据进行去重处理可以减少记忆现象[4]。
这一点之所以重要,是因为被记忆的代码可能包含安全漏洞、敏感信息或受严格许可证约束的代码。如果你使用大语言模型为商业产品生成代码,可能会无意中引入受版权保护或有缺陷的代码。该研究建议使用指标来检测记忆化现象,并从训练集中移除重复内容以缓解这一问题[4]。
有哪些证据表明大语言模型真正理解了代码?
最有力的证据来自需要规划和领域特定推理的任务。当大型语言模型被要求先规划出解决步骤再编写代码时,其首次尝试正确解决问题的比例(Pass@1)相比直接生成代码提升了高达25.4%[1]。这一规划阶段并非简单复现模式,而是将复杂意图分解为逻辑步骤——这正是理解能力的核心标志。同一项研究发现,人类评估者对经过规划生成的代码在正确性、可读性和鲁棒性方面给出了更高评分[1]。
进一步的证据来自生物信息学等专业领域。在BioCoder基准测试中,GPT-4的Pass@K(在K次尝试内解决问题的百分比)达到了约50%,而较小的模型最高仅为25%[2]。关键发现是:成功的模型既需要长上下文窗口(超过2600个token)来理解跨文件的依赖关系,也需要掌握生物信息学算法的领域特定知识。仅凭通用编码能力是不够的——模型必须理解代码背后的生物学逻辑[2]。这表明它们并非仅仅匹配表面模式,而是在对问题领域进行推理。
另一项研究开发了一款IDE插件,让开发者无需编写提示词,即可请求大语言模型解释代码、描述API调用或定义领域术语。一项包含32名参与者的用户研究表明,使用该插件完成代码理解任务的速度比网络搜索更快[5]。大语言模型能够解释代码的功能——这需要的不仅是模式匹配,还需要推断意图并将代码映射到相关概念。
记忆何时看起来像理解——而这又为何重要?
当任务与训练数据中的内容相似时,界限便模糊了。一项名为SWE-QA-Pro的基准测试专门设计用于防止大语言模型通过记忆“作弊”,它采用了模型不太可能见过的长尾、冷门代码库[3]。在这些全新的代码库上进行测试时,依赖记忆知识的直接回答表现不佳——Claude Sonnet 4.5在直接回答上的得分比需要探索代码库的智能体工作流低了约13分[3]。这一差距证明,当记忆被阻断时,性能会急剧下降,从而暴露出真正理解能力的局限。
实际启示:如果你在处理常见问题(比如数组排序或数据库查询),大语言模型很可能会通过记忆它见过成千上万次的模式,生成正确的代码。但如果你面对的是一个新颖的库、不常见的算法或私有代码库,模型的理解能力就会弱得多。SWE-QA-Pro 研究表明,即使是小型开源模型(如 Qwen3-8B),在经过代理式训练后,也能在该基准测试上超越 GPT-4o 2.3 分——这种训练教会模型探索代码而非依赖记忆 [3]。这表明真正的理解能力是可以提升的,但这并非模型的默认行为。
本文引用的文献
基于大型语言模型的自主规划代码生成
自我规划式代码生成相比直接生成,在Pass@1指标上最高提升了25.4%,这表明大语言模型能够在编码前将复杂意图分解为逻辑步骤[1]。
BioCoder:面向大语言模型的生物信息学代码生成基准测试。
在BioCoder基准测试中,GPT-4的Pass@K达到约50%,而较小模型仅为约25%,这证明除了模式匹配之外,还需要领域特定知识[2]。
SWE-QA-Pro:面向仓库级代码理解的代表性基准与可扩展训练方案
SWE-QA-Pro发现,Claude Sonnet 4.5在直接回答与智能体工作流之间存在约13个百分点的差距,这表明大语言模型在可能的情况下会依赖记忆[3]。
揭示代码模型中的记忆机制
从代码模型中提取2万条输出,发现了超过40,125个记忆片段;模型规模越大、输出越长,记忆率也越高[4]。
使用大语言模型辅助代码理解
一款基于大语言模型的IDE插件帮助32名参与者比网页搜索更快地理解代码,展示了其对代码意图和API用法的实际理解能力[5]。
