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 | 商业 | 强 | 亚马逊云集成 |
原理/机制
代码生成的训练方法
- 大规模代码预训练:在 GitHub 等开源代码上做下一 Token 预测,学习代码语法和常见模式。
- 指令微调:在 (自然语言描述, 代码实现) 对上微调,建立需求到代码的映射。
- 执行反馈微调:用单元测试通过率作为奖励信号进行 RL 训练。
- 修复数据训练:在 (错误代码, 错误信息, 修复代码) 三元组上训练,增强自我修复能力。
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)
↓
运行仓库测试套件验证补丁
↓
通过 → 正确 / 失败 → 错误
设计时真正要权衡什么
- 函数级 vs. 仓库级:HumanEval 考察单函数生成,SWE-bench 考察仓库级理解和修改。后者更贴近真实工程,但评估复杂度更高。
- 生成 vs. 理解:代码生成(从零写代码)和代码理解(阅读并修改现有代码)需要不同的能力侧重。
- 执行反馈的价值:允许模型执行代码并看到结果能显著提升正确率,但增加了延迟和基础设施成本。
- 安全与能力的权衡:完全开放的代码执行能力最强,但安全风险最高;受限环境更安全但限制了可用功能。
- 单次 vs. 迭代:单次生成速度快但成功率低;迭代修复(执行-看错-修复)成功率高但消耗更多 Token。
容易踩的坑
- 语法正确但逻辑错误:代码能运行但结果不正确,这是最常见也最难检测的问题。
- 幻觉库和 API:编造不存在的函数签名或已弃用的 API 用法。
- 缺乏边界处理:忽略空输入、超大输入、异常类型等边界情况。
- 依赖版本不兼容:生成的代码假设特定版本的库,在目标环境中不可用。
- 安全漏洞:生成的代码包含 SQL 注入、命令注入、路径遍历等安全问题。
- 上下文窗口溢出:处理大型仓库时,所有相关文件超出模型上下文限制。
- 过度工程 vs. 工程不足:要么生成过于复杂冗长的代码,要么过于简陋缺少错误处理。
工程落地时我会怎么做
- 分层评估:不要只看 HumanEval 分数,用与业务匹配的自定义评测集验证。
- 执行验证是必需品:所有代码生成场景都应配备自动化测试和执行验证。
- 上下文工程:为代码任务提供充分的上下文——相关文件、类型定义、项目规范。上下文质量决定代码质量。
- 安全第一:代码执行必须在沙箱中,网络受限、文件系统隔离、资源上限。
- 人机协作:让 AI 生成代码,人审查和测试。不要完全自动化关键代码路径。
- 版本锁定:明确指定依赖版本,避免"在我机器上能跑"的问题。
如果要对外讲,可以怎么概括
"代码生成与执行是 LLM 在工程领域最直接的应用场景。从评估角度看,HumanEval 已接近饱和——顶级模型的 pass@1 超过 90%,但这是函数级别的简单测试。真正有意义的是 SWE-bench 这类仓库级别的评测,它要求模型理解整个代码库结构、定位问题、生成正确的补丁,并通过真实的测试套件验证。从 2024 到 2025 年,SWE-bench Verified 的最佳成绩从 20% 提升到 50% 以上,进展惊人。Code Interpreter 的设计哲学是'让模型写代码来解决问题',通过沙箱执行获取真实反馈,再迭代修复。这种执行-反馈-修复的循环比单次生成的可靠性强得多。在实际工程中,我认为最关键的不是模型选择,而是上下文工程——给模型提供充分的代码库上下文、清晰的规范和完整的测试用例。"
最后记几条
- HumanEval 已饱和,SWE-bench 是新战场:函数级生成已接近解决,仓库级工程才是真正的挑战。
- 执行反馈是最强提升手段:允许模型运行代码看到结果,能将成功率提升 30-50%。
- Agentless 出人意料地强:不一定需要复杂的 Agent 框架,简单的"定位-补丁"方法在某些场景下更高效。
- 安全是代码执行的生命线:沙箱隔离、资源限制、网络控制是必须项,不是可选项。
- 上下文工程 > 提示工程:代码生成中,提供给模型的代码库上下文质量比 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