2024年10月22日

04-Code 能力与执行

代码生成与执行能力是指 LLM 理解自然语言需求、生成可运行的程序代码、并通过沙箱环境执行验证的能力,是 AI 从"语言助手"迈向"工程助手"的核心能力。

知识库大模型智能体与工具调用agent

04-Code 能力与执行

先说结论

代码生成与执行能力是指 LLM 理解自然语言需求、生成可运行的程序代码、并通过沙箱环境执行验证的能力,是 AI 从"语言助手"迈向"工程助手"的核心能力。

先把核心脉络捋清楚

评测基准对比

基准 规模 语言 任务类型 局限性
HumanEval 164 题 Python 函数级代码补全 规模小,仅 Python,已近饱和
HumanEval+ 164 题 + 增强测试 Python 函数级(更严格) 仍限于 Python
MBPP 974 题 Python 基础编程题 题目偏简单
APPSDataset 10,000 题 Python 竞赛级编程 难度分布不均
BigCodeBench 1,140 题 Python 真实库调用 较新,生态未成熟
SWE-bench 2,294 任务 Python 真实 GitHub Issue 修复 评估复杂,耗时
LiveCodeBench 持续更新 多语言 竞赛编程 防止数据泄露
SWE-bench Verified ~500 任务 Python 人工验证的 Issue 修复 质量高但规模有限

模型性能演进(HumanEval pass@1)

模型 pass@1 发布时间 备注
Codex 12B ~28.8% 2021 首个专用代码模型
GPT-3.5-turbo ~48-50% 2023 通用模型
GPT-4 ~67% 2023 大幅提升
CodeLlama 34B ~53% 2023 开源代表
DeepSeek-Coder-V2 ~90%+ 2024 开源最强
Claude 3.5 Sonnet ~92% 2024 接近饱和

代码智能体对比

智能体 类型 SWE-bench Verified 特点
SWE-Agent 开源 Agent 强基线 普林斯顿 NLP 开发
Devin 商业产品 中上 Cognition AI,首个 AI 软件工程师
OpenHands 开源 Agent 原 OpenDevin
Agentless 无 Agent 意外地强 仅用 LLM 定位+补丁,无迭代
Codex 商业 最高级别 OpenAI 产品级
Amazon Q Agent 商业 亚马逊云集成

原理/机制

代码生成的训练方法

  1. 大规模代码预训练:在 GitHub 等开源代码上做下一 Token 预测,学习代码语法和常见模式。
  2. 指令微调:在 (自然语言描述, 代码实现) 对上微调,建立需求到代码的映射。
  3. 执行反馈微调:用单元测试通过率作为奖励信号进行 RL 训练。
  4. 修复数据训练:在 (错误代码, 错误信息, 修复代码) 三元组上训练,增强自我修复能力。

Code Interpreter 的工作流程

Code Interpreter(代码解释器)是让 LLM 在沙箱中编写并执行代码的能力:

用户问题(如"分析这个 CSV 文件的销售额趋势")
   ↓
LLM 生成 Python 代码
   ↓
沙箱环境执行代码
   ↓  ↓
成功        失败
   ↓           ↓
返回结果    LLM 看到错误信息
   ↓           ↓
生成回答    修复代码,重新执行

关键组件:

  • 沙箱隔离:Docker / Firecracker / WebAssembly 等安全执行环境
  • 文件系统:支持上传文件、持久化中间结果
  • 包管理:预装常用库(pandas, matplotlib, numpy 等)
  • 输出捕获:捕获 stdout、stderr、异常、图表、文件输出

SWE-bench 的评估流程

GitHub Issue 描述
   ↓
Agent 探索代码仓库结构
   ↓
Agent 定位相关文件和函数
   ↓
Agent 生成补丁(Patch)
   ↓
运行仓库测试套件验证补丁
   ↓
通过 → 正确 / 失败 → 错误

设计时真正要权衡什么

  1. 函数级 vs. 仓库级:HumanEval 考察单函数生成,SWE-bench 考察仓库级理解和修改。后者更贴近真实工程,但评估复杂度更高。
  2. 生成 vs. 理解:代码生成(从零写代码)和代码理解(阅读并修改现有代码)需要不同的能力侧重。
  3. 执行反馈的价值:允许模型执行代码并看到结果能显著提升正确率,但增加了延迟和基础设施成本。
  4. 安全与能力的权衡:完全开放的代码执行能力最强,但安全风险最高;受限环境更安全但限制了可用功能。
  5. 单次 vs. 迭代:单次生成速度快但成功率低;迭代修复(执行-看错-修复)成功率高但消耗更多 Token。

容易踩的坑

  • 语法正确但逻辑错误:代码能运行但结果不正确,这是最常见也最难检测的问题。
  • 幻觉库和 API:编造不存在的函数签名或已弃用的 API 用法。
  • 缺乏边界处理:忽略空输入、超大输入、异常类型等边界情况。
  • 依赖版本不兼容:生成的代码假设特定版本的库,在目标环境中不可用。
  • 安全漏洞:生成的代码包含 SQL 注入、命令注入、路径遍历等安全问题。
  • 上下文窗口溢出:处理大型仓库时,所有相关文件超出模型上下文限制。
  • 过度工程 vs. 工程不足:要么生成过于复杂冗长的代码,要么过于简陋缺少错误处理。

工程落地时我会怎么做

  1. 分层评估:不要只看 HumanEval 分数,用与业务匹配的自定义评测集验证。
  2. 执行验证是必需品:所有代码生成场景都应配备自动化测试和执行验证。
  3. 上下文工程:为代码任务提供充分的上下文——相关文件、类型定义、项目规范。上下文质量决定代码质量。
  4. 安全第一:代码执行必须在沙箱中,网络受限、文件系统隔离、资源上限。
  5. 人机协作:让 AI 生成代码,人审查和测试。不要完全自动化关键代码路径。
  6. 版本锁定:明确指定依赖版本,避免"在我机器上能跑"的问题。

如果要对外讲,可以怎么概括

"代码生成与执行是 LLM 在工程领域最直接的应用场景。从评估角度看,HumanEval 已接近饱和——顶级模型的 pass@1 超过 90%,但这是函数级别的简单测试。真正有意义的是 SWE-bench 这类仓库级别的评测,它要求模型理解整个代码库结构、定位问题、生成正确的补丁,并通过真实的测试套件验证。从 2024 到 2025 年,SWE-bench Verified 的最佳成绩从 20% 提升到 50% 以上,进展惊人。Code Interpreter 的设计哲学是'让模型写代码来解决问题',通过沙箱执行获取真实反馈,再迭代修复。这种执行-反馈-修复的循环比单次生成的可靠性强得多。在实际工程中,我认为最关键的不是模型选择,而是上下文工程——给模型提供充分的代码库上下文、清晰的规范和完整的测试用例。"

最后记几条

  1. HumanEval 已饱和,SWE-bench 是新战场:函数级生成已接近解决,仓库级工程才是真正的挑战。
  2. 执行反馈是最强提升手段:允许模型运行代码看到结果,能将成功率提升 30-50%。
  3. Agentless 出人意料地强:不一定需要复杂的 Agent 框架,简单的"定位-补丁"方法在某些场景下更高效。
  4. 安全是代码执行的生命线:沙箱隔离、资源限制、网络控制是必须项,不是可选项。
  5. 上下文工程 > 提示工程:代码生成中,提供给模型的代码库上下文质量比 Prompt 技巧重要得多。

参考资料

  • Chen, M. et al. "Evaluating Large Language Models Trained on Code" (2021) — HumanEval 原论文
  • Jimenez, C. et al. "SWE-bench: Can Language Models Resolve Real-World GitHub Issues?" (ICLR 2024)
  • Yang, J. et al. "SWE-agent: Agent-Computer Interfaces Enable Automated Software Engineering" (2024)
  • OpenAI Code Interpreter 文档
  • Li, Y. et al. "Competition-Level Code Generation with AlphaCode" (Science, 2022)
  • Austin, J. et al. "Program Synthesis with Large Language Models" (2021) — MBPP

延伸阅读