human-eval
OpenAI推出的LLM代码生成评测基准,含164道手写编程题,以pass@k指标衡量功能正确性
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
OpenAI推出的LLM代码生成评测基准,含164道手写编程题,以pass@k指标衡量功能正确性
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
2021年,OpenAI 发布了一篇震动 AI 学术圈的论文——《Evaluating Large Language Models Trained on Code》,正式推出 HumanEval 数据集。这不仅是一份评测工具,更是 LLM 代码生成领域从"可用"走向"可信"的分水岭。
在 HumanEval 出现之前,LLM 代码生成的主流评测方式是语法正确率——只要模型生成的代码能通过 Python 解释器编译,就认为"正确"。但这带来了一个根本性问题:一段代码可以完全符合语法规范,却计算出错误的结果。
OpenAI 的研究团队正是带着这个问题出发,设计了 HumanEval。核心创新在于以功能正确性(Functional Correctness)为评判标准:模型生成的代码片段必须通过配套的单元测试,才能被视为真正"通过"。这一设计直接模拟了真实软件开发的验收流程——代码好不好用,测试用例说了算。
HumanEval 的另一个重要设计是人工手写问题集。164 道题目由真人编写,每道题目包含函数签名、任务描述(docstring)和一组测试用例,确保题目不会被意外泄露到训练数据中。相比自动生成的评测题,这种方式从根本上规避了"数据污染"问题(Data Contamination),让评测结果更加可信。
关键数据对比(来自原始论文):
| 模型 | Pass@1 |
|---|---|
| GPT-3 | 0% |
| GPT-J | 11.4% |
| Codex(初代) | 28.8% |
| Codex(100样本投票) | 70.2% |
HumanEval 的代码库虽然轻量,但架构设计非常清晰。整个项目分为四个核心模块,分工明确:
data.py — 数据层负责读取和解析 HumanEval 数据集。核心数据结构是 gzip 压缩的 JSONL 文件(HumanEval.jsonl.gz),每行一个 JSON 对象,包含:
task_id:题目唯一标识prompt:函数签名和任务描述(docstring)canonical_solution:参考答案test:单元测试用例entry_point:待实现的函数名read_problems() 函数将压缩文件解压后解析为字典,键为 task_id,值为完整题目对象,供评测模块直接查询使用。
execution.py — 执行沙箱层这是 HumanEval 架构中最关键也最敏感的部分。核心函数 check_correctness() 负责在隔离环境中执行模型生成的代码:
安全设计(多重防护):
multiprocessing.Process 将代码执行放入独立子进程,与主进程隔离create_tempdir() 为每次执行创建临时目录,避免文件系统污染reliability_guard() 禁用了 os.rmdir、os.chdir 等可能影响测试环境的系统调用time_limit(timeout) 通过 SIGALRM 信号实现超时控制,默认超时 3 秒swallow_io() 捕获 stdout/stderr,防止恶意输出干扰执行流程:
将 prompt + completion + test + check(entry_point) 拼接为完整程序,通过 exec() 在受控环境中执行。执行结果通过 Manager().list() 返回,主进程读取结果判断"通过"或"失败"。
⚠️ 安全警告:README 明确声明此模块默认禁用执行,用户必须手动取消注释 exec() 调用并自行承担风险。这体现了 OpenAI 对安全问题的审慎态度——评测工具本身可以执行任意代码,使用者必须自行配置沙箱环境。
evaluation.py — 评测引擎层这是数学建模最精妙的部分。evaluate_functional_correctness() 使用 ThreadPoolExecutor 并行提交评测任务:
Pass@K 指标计算:对于每个题目,模型生成 K 个候选解,只要其中任意一个通过所有测试用例,就算 pass@k。公式为:
pass@k = 1 - C(N-C, K) / C(N, K)
其中 N 为总采样数,C 为正确解数量。当 N 不足 K 时(无法无偏估计),该题目不纳入计算。
这意味着即使模型 100 次生成中只对 1 次正确,pass@100 也会接近 100%——这是"量变引发质变"的数学表达,也是为什么 top 模型在 pass@100 上能接近满分。
evaluate_functional_correctness.py — CLI 入口使用 fire 库将函数暴露为命令行工具,支持参数:
--k:指定评测的 K 值(默认 1,10,100)--n_workers:并行工作线程数(默认 4)--timeout:单个执行超时(默认 3.0 秒)--problem_file:自定义题目文件路径最典型的使用方式是:将待测模型的生成结果(JSONL 格式)传入评测脚本,得到 pass@k 分数:
pip install -e human-eval
python -m human_eval.evaluate_functional_correctness samples.jsonl
输出示例:
{'pass@1': 0.35, 'pass@10': 0.58, 'pass@100': 0.72}
研究者可以将自己的模型与论文中报告的分数对比。需要注意的是,HumanEval 在 2021 年发布后迅速被各大模型刷榜,当前 top 模型 pass@1 已超过 95%,原始论文中的分数仅具历史参考价值。
通过 --problem_file 参数接入自定义题目集,格式兼容 JSONL,这使得 HumanEval 的框架可以复用于其他代码评测任务。
随着 GPT-4、Claude 等模型在训练中大量使用 GitHub 和互联网数据,HumanEval 中的 164 道题可能被"泄露"进训练语料。有研究指出,即使头部模型分数接近天花板,也不代表代码能力真正达到人类专家水平。这正是 HumanEval+、LiveCodeBench 等新一代基准诞生的背景。
164 道题全部为 Python 代码,题目类型以算法和数据结构为主(如字符串处理、搜索排序),缺乏真实软件工程场景(如代码重构、Bug 修复、多文件协作)。这与实际开发中的代码生成需求存在显著差距。
execution.py 虽然设计了沙箱,但 README 坦承这是"最低限度的安全措施"。在生产环境中使用此工具评测第三方模型代码,必须配合容器级隔离(Docker/Kubernetes)并限制系统资源。
HumanEval 的发布标志着 LLM 代码评测进入"功能正确性"时代。它开创性地将学术评测标准与工程实践对接,直接催生了后续的 Codex、SantaCoder、StarCoder 等代码专用模型。
演进时间线:
值得注意的是,HumanEval 原始作者团队早已发出警告:随着模型能力提升,HumanEval 作为"前沿能力信号"的价值已接近饱和。评测榜单的头部模型差距已无实际意义——真正有区分度的是 HumanEval+(对抗性过滤版)、LiveCodeBench(动态更新题目)和 SWE-bench Pro(真实 GitHub Issue 解决)。
OpenAI HumanEval 是 AI 代码评测领域的一座里程碑。它用 164 道手写编程题和 pass@k 指标,将"模型代码写得好不好"这个模糊问题,转化为可量化、可复现的科学评测标准。尽管存在数据污染和题目覆盖有限的局限,HumanEval 仍然是理解 LLM 代码能力演进的最佳历史锚点。
对于开发者而言,HumanEval 提供了一套完整、可扩展的评测框架,可直接用于评估自己的模型或集成到 CI 流程中。安装仅需一条命令,评测仅需一份 JSONL 结果文件——这种极简设计本身就是工程上的成功。