想象你是一家软件公司的技术总监,今天要做的头等大事,是从一群应届生里挑出真正会写代码的“种子选手”。笔试该怎么出题,才能既不考死记硬背、又能测出真本事?——AI 大模型圈子里,同样的问题每天都在发生:在 ChatGPT 和 Claude 们被吹得天花乱坠的今天,你要怎么知道一个“AI 程序员”是真的能干活,还是只会背台词? 业界给出的答案是两套“笔试题库”:一套叫 HumanEval,另一套叫 MBPP。它们相当于 AI 代码生成领域的“高考模拟卷”,专门用来考 AI 写函数的真实水平。但光有考卷还不够,还得有评分标准。怎么评分?答案简单粗暴——跑测试用例,跟学校里老师拿标准答案判卷一个道理:AI 写完代码,就用预设好的测试用例去验,跑得通就是“会做”,跑不通就是“不会”。至于一个通过率指标 pass@k,则描述了“一个 AI 程序员交多少次卷,能至少蒙对一次”。 这篇文章会把这套“AI 编程笔试系统”的三大件——考题怎么设计、分数怎么算、判卷怎么判——拆开揉碎讲清楚。读完你就能明白,为什么各家模型发布会上的代码分数永远在涨,也永远不会跌;以及当你自己需要挑选代码模型时,该怎么用数据说话,而不是凭感觉。

岗位关联

对 AI 从业者而言,读懂 HumanEval/MBPP 等于掌握了一把“代码能力尺子”:选型对比、迭代追踪、效果验收都能用数据说话,避免被营销话术牵着走。

目录
  1. 可视化演示
  2. 两大基准是什么
  3. 题目设计思路
  4. pass@k 怎么打分
  5. 测试用例怎么判
  6. 跑评测的实战流程
  7. 局限与改进方向
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

展示HumanEval/MBPP基准的评测流程和pass@k指标的计算方式,直观理解代码生成能力评估方法。

本节配有交互动效(进入视口后自动加载,约 3KB)。

HumanEval与MBPP评测流程 Prompt:函数签名+文档字符串+函数体占位 生成:模型采样n个候选解,执行测试用例 判定:通过/未通过,统计pass率 pass@k = 1 - C(n-c,k) / C(n,k) HumanEval用pass@k衡量代码生成正确率

两大基准是什么

回到那场“AI 程序员招聘会”。你手里有两套名声在外的笔试题库:一套出自大厂研发团队(OpenAI)之手,叫 HumanEval,收录了 164 道函数补全题;另一套则来自伯克利等高校研究者的整理,叫 MBPP(Mostly Basic Python Programs),收纳了 974 道基础 Python 编程题。业内很多人把它们戏称为“AI 代码圈的南北两大名校”——一个考逻辑推演,一个考基础功,双管齐下,防止偏科。

HumanEval 的题目长这样:模型拿到一个函数签名和一段说明文档,比如“计算列表中所有偶数元素的和”,它得把函数体补全出来。164 道题看起来不多,但每道题都经过了人工审视,基本覆盖了字符串操作、数学计算、数据结构变换等经典算法场景。MBPP 则更“口语化”:直接用自然语言描述需求,比如“写一个函数,输入一串单词,返回首字母大写的拼接结果”,模型要把整段可运行代码从零生成出来。如果说 HumanEval 是“给定骨架填血肉”,那 MBPP 就是“听到需求搭骨架再填血肉”,难度更基础,但更贴近真实开发中“需求 → 代码”的转化过程。

这两套题库的定位,简单说就是给模型分层级体检:HumanEval 检测“程序员的逻辑肌肉”,MBPP 检测“程序员的语言理解底板”。研究界之所以把这两个基准当作标配,是因为它们互补性强——一个偏严谨的算法理解,一个偏开放的自然语言理解。你在任何一份模型技术报告里看到 “HumanEval@1“ 或 ”MBPP@1“ 的分数,就相当于看到了这个 AI 程序员在这两场标志性笔试中的得分,横向对比时”含金量”最容易被行业认可。

题目设计思路

既然是一份合格的笔试试卷,题目本身的设计就是最大的学问。你给 AI 出题,既不能是“一句废话”式的开放式作文,也不能是偏题怪题。HumanEval 的每一题都遵循一个三段式结构:问题描述、函数签名、测试用例。问题描述用自然语言写清楚“要干什么”,函数签名像答题卡上的密封线,规定了函数名、参数类型和返回值类型,测试用例则交给后面说的判卷系统去处理。

这三段结构里有个常被忽略的隐藏考点:领域语言(domain-specific language)。模型得看懂“palindrome“(回文)、”Fibonacci“(斐波那契)、”binary tree traversal“(二叉树遍历)这些专业词汇,才能在脑海中调取对应的算法模板。这就像笔试里的英文阅读理解——不是单纯考语法,而是考”你知不知道这个行业黑话在说什么“。如果一个模型连”回文”是什么都不知道,那它第一步就输了。

题目难度控制也很有讲究。研究者刻意把题目设置在“大多数人类程序员能在几分钟内解决”的程度,排斥了需要大量领域经验或复杂系统设计的题目。为什么这么做?因为评测的初衷是测“代码生成的基础能力”,而不是测“系统架构能力”。如果题目难到人类专家都要想一小时,那模型答不出来,你也分不清它到底是算法能力不行,还是题目本身太偏。这就像是给小学生出奥数题,考了半天,测出来的其实不是“数学基础”,而是“有没有上过奥数班”。

一句话总结:HumanEval 的题目设计原则,是用规范和简洁,把“写代码”这件事拆解成可量化的能力切片——你翻译需求的能力、你读懂签名的能力、你实现经典算法的能力,各占一个评分维度。理解了出题逻辑,你才能读懂分数的含金量:它考的是“给定精确规格的编码能力”,而非“自由发挥的工程创造力”。

pass@k 怎么打分

笔试考完了,100 分的卷子,AI 交上来好几个版本的答案,怎么算分?人类考试只允许交一份答卷,AI 却可以“多交几份”。pass@k 指标的思路是:允许模型对同一个问题生成 $k$ 个候选答案,只要其中至少一个能通过全部测试用例,就算这道题“做对了”。

形式上,研究者先从模型中采样 $n$ 个样本($n \geq k$),再从中随机挑选 $k$ 个样本,看这 $k$ 个里有没有正确的。但是直接枚举“从 n 里挑 k 的组合”代价太大,于是就有了下面这个经典的无偏估计公式:

其中 $n$ 是为每道题生成的答案总数,$c$ 是这批答案中通过全部测试用例的正确个数,$\binom{n}{k}$ 表示从 $n$ 个答案里任选 $k$ 个的组合数。这个公式的直觉是:先算“从 n 个答案里挑出的 k 个全都错了”的概率,用 1 减去这个全错概率,就是“至少命中一个对的”的概率。

如果只看 pass@1,就等价于让模型只提交一个答案,答对算对,答错算错。这衡量的是模型直接可用性——就像招聘时看“刚入职就能干活”的比例。而 pass@100 则衡量模型的潜力上限——哪怕它平时写的代码经常有小 bug,但只要 100 次里有一次能写对,就说明它的知识储备里存着正确答案,只是平时不一定能稳定输出。两个数字配合着看,一个看稳定性,一个看上限,好比看程序员“日常发挥”与“巅峰状态”。

pass@k=Eproblems[1−(n−ck)(nk)]\text{pass@k} = \mathbb{E}_{\text{problems}} \left[ 1 - \frac{\binom{n-c}{k}}{\binom{n}{k}} \right]
  1. $n$总生成数:$n$ 表示模型对同一道题共生成的候选答案个数。这相当于给 AI 的“多次答题机会”上限,$n$ 越大,机会越多,评分越稳定。
    n=每个问题的采样次数\displaystyle n = \text{每个问题的采样次数}
  2. $c$正确数:$c$ 表示这 $n$ 个答案中通过全部测试用例的个数。$c$ 越大,模型在这个题目上的“真实实力”越强。
    c=通过全部测试用例的答案数\displaystyle c = \text{通过全部测试用例的答案数}
  3. $\binom{n}{k}$所有抽法:从 $n$ 个答案里任意取出 $k$ 个答案的所有可能组合数。这是评分员“随机挑选 $k$ 份答卷”的全部可能性空间。
    (nk)=n!k!(n−k)!\displaystyle \binom{n}{k} = \frac{n!}{k!(n-k)!}
  4. 全错概率从 $n$ 个答案中挑出的 $k$ 个全部都是错误答案的概率,即从 $n-c$ 个错误答案中挑出 $k$ 个的组合数,除以从 $n$ 个中挑 $k$ 个的组合数。
    (n−ck)(nk)\displaystyle \frac{\binom{n-c}{k}}{\binom{n}{k}}
  5. 做对概率用 $1$ 减去全错概率,得到的正是“至少有一个正确答案被选中”的概率,也就是 pass@k 的最终得分。
    1−(n−ck)(nk)\displaystyle 1 - \frac{\binom{n-c}{k}}{\binom{n}{k}}

测试用例怎么判

卷子交上来了,谁来判分?答案是测试用例。HumanEval 的每道题都附带一组标准的单元测试用例,比如计算偶数和的函数,测试用例会检查 sum_even([1,2,3,4]) == 6 这样的输入输出对。评测系统执行代码,把输入喂进去,把输出跑出来,跟标准答案逐一比对——全部通过,这道题记 1 分;有一个不通过,记 0 分。整个过程全自动,没有任何人工主观因素,保证了“同卷同判”的公平性。

MBPP 的测试用例比 HumanEval 构造得相对简单,通常覆盖 3 个以内的示例输入。这里隐含一个值得注意的事实:HumanEval 每道题平均只有 7.7 个测试用例。这意味着判卷标准其实很“宽松”——只要代码在这七八个点上输出正确,就算会做这题。这就像面试官只抽查了三四个边界条件,没把你的代码翻个底朝天。那么问题来了:AI 有没有可能“刷题”?有。它完全可能记住了这道题的某个变体,或者恰好写出的逻辑能糊弄过这有限几个用例。

所以,高质量的测试用例是评判的核心竞争力。研究者会用更极端的测试来“刁难”模型,比如引入大数据量输入、边界条件、特殊字符、并发场景等。那个著名的 EvalPlus 项目,就是把 HumanEval 原本平均 7.7 个测试用例,扩充到了平均 769 个——相当于把原本只抽查几张卷子的面试官,升级成把每一行代码都翻来覆去审查的监控器。在 EvalPlus 增强版的判卷标准下,靠“背题”蒙混过关的模型,分数会断崖式下跌,这个现象本身就说明了测试用例的重要性。

跑评测的实战流程

现在你手上有了考题和判卷标准,是不是就可以开跑了?且慢,真正的实战评测比想象中更讲究“实验纪律”。第一步是选择温度参数。温度(temperature)控制模型输出的随机性:温度越低,输出越保守,几乎总是选概率最高的那个答案;温度越高,输出越发散,更可能生成各种不同的答案。跑 pass@k 这类需要多样性的指标时,一般会把温度设置为 0.6~0.8 之间的某个值,让模型“认真作答但允许灵光一闪”。如果温度设成 0,生成的 $k$ 个答案几乎是一模一样的,那 pass@k 就退化成 pass@1 了,失去了“多次机会”的意义。

第二步是控制采样数量 $n$。你为每道题生成多少个候选答案,直接影响最终分数的置信度。生成太少,统计波动大;生成太多,算力和时间成本陡增。常见做法是每道题生成 200 个左右候选,从中计算 pass@1、pass@10、pass@100 这几个档位的分数。

第三步是固定随机种子。AI 从随机噪声开始生成内容,如果不固定种子,同一模型跑两次评测,分数可能差出好几个百分点,这就像两次考试题目内容毫无变化,但考生却因状态起伏考出了不同分数。为了保证“可复现”,研究者会固定随机种子,让每次评估生成相同的候选样本序列。

最后一点,公式实现上也藏着坑:那个组合数公式如果直接用浮点运算,当 $n=200$、$c$ 很大时可能溢出。所以标准实现会在计算过程中不停地约分,或者在分子分母上做变换来避免天文数字。比如,直接用 comb(n-c, k) / comb(n, k) 在数值上更稳健。跑评测不是把模型调出来、把代码喂进去、看个输出就完事——它更像一场“双盲实验”,严格控制变量,才能保证对比有意义。

局限与改进方向

任何一套好用的技术,都有它的天花板。HumanEval 和 MBPP 最大的阴影,是数据污染。所谓数据污染,就是指这些静态的题目在互联网上泄露了。模型在预训练阶段可能已经把题目和标准答案一起“背”了下来——它根本不需要会写代码,只要背熟“答案库”,就能在考试中拿到高分。这就好比考题已经在小圈子论坛上传疯了,你再考,考出来的就是“记忆力”,不是“编程能力”。

第二个痛点是测试用例的覆盖不足。前面提到 HumanEval 平均仅 7.7 个测试用例,漏掉大量边界条件。一个模型可能用完全错误的逻辑误打误撞通过了个位数用例,拿个满分。针对这点,EvalPlus 应运而生:它用自动化变体扩展出大量额外测试用例,把“背题党”的分数打回原形。甚至,在 EvalPlus 的增强版测试下,某些模型在原始 HumanEval 的高分神话会瞬间破功,下降 20 个点以上。

第三个方向是动态更新基准。既然静态题库会被污染,那就让考题“活”起来。LiveCodeBench 定期从竞赛网站或代码仓库抓取新题,每隔一段时间就换一批卷子。AI 程序员面对的永远是不曾见过的“新题型”,无从背起。另外,多语言扩展也在弥补 HumanEval 只考 Python 的单一性——MBXP、MultiPL-E 等基准把同一批题翻译成 Java、C++、Go、Rust 等十几种语言,考察模型跨语言迁移的通用代码能力。

AI 应用场景

场景一:模型选型对比——别再“盲选”代码大模型

阶段:模型评估与选型

解决的问题:企业在挑选代码大模型时,市场宣传语满天飞,各家都说自己“编程能力最强”。实际落地需要一份可复现、可对比的客观分数,用于在多个候选模型之间做差异化对比,判断“同一道题谁的正确率更高”。

具体案例:某金融科技公司的 AI 团队要为企业内部引入一款代码助手,候选有三家模型。团队在内部测试集上统一跑 HumanEval 和 MBPP,规定温度 0.6、每道题采样 200 次,计算 pass@1 与 pass@10。结果显示:A 模型的 HumanEval@1 领先 5 个百分点,但 MBPP@1 落后 3 个点;B 模型两者均衡但 pass@10 垫底。团队据此确认:A 模型适合“精确翻译需求为代码”,B 模型的“潜力上限”较低,最终选择 A 模型试点,并辅助以 EvalPlus 增强版复测,确认 8 个关键用例全过。

场景二:模型迭代追踪——每次微调都该跑一次“月考”

阶段:模型迭代与回归测试

解决的问题:模型微调后,“能力是涨了还是跌了”不能凭感觉判断。传统做法靠主观试用,成本高且不客观;用 HumanEval/MBPP 做回归测试,每次改动后跑同一套评测,拿分数变化说话,能敏锐捕捉到某类代码能力的回退。

具体案例:某大模型团队的微调工程师在完成一次针对 SQL 数据结构的强化训练后,用 HumanEval 做了回归测试,发现 HumanEval@1 从 78% 涨到了 81%,但 MBPP@1 从 76% 跌到了 71%。分析测试样本后发现,模型因为过度拟合 SQL 领域数据,反而丢失了一部分基础 Python 字符串处理的泛化能力。团队随后调整了训练集比例,重新微调后两个指标同时回升——这个“月考”机制成了团队每次发版前的必备流程。

Python 演示

python52 行
# -*- coding: utf-8 -*-"""Unbiased pass@k estimation for HumanEval/MBPP evaluation."""import mathimport random  def estimate_pass_at_k(num_samples: int, num_correct: int, k: int) -> float:    """Estimate pass@k of one problem.     Args:        num_samples: total number of generated samples (n)        num_correct: number of samples that passed all tests (c)        k: the k in pass@k     Returns:        Estimated probability that at least one of k samples is correct.    """    if num_correct == 0:        return 0.0    if num_correct == num_samples:        return 1.0    # Use combinatorial identity to avoid division overflow    comb_n_k = math.comb(num_samples, k)    comb_nc_k = math.comb(num_samples - num_correct, k)    return 1.0 - comb_nc_k / comb_n_k  def simulate_pass_at_k(eval_results: list, k: int, seed: int = 42) -> float:    """Simulate pass@k from a list of (n, c) pairs, averaged over problems."""    rng = random.Random(seed)    per_problem = []    for num_samples, num_correct in eval_results:        rng.seed(seed)        p = estimate_pass_at_k(num_samples, num_correct, k)        per_problem.append(p)    total = sum(per_problem)    return total / len(per_problem) if len(per_problem) > 0 else 0.0  if __name__ == "__main__":    # Example: 2 problems, each generated 200 samples,    # with 136 and 158 correct respectively.    results = [(200, 136), (200, 158)]    for k_value in (1, 10, 100):        score = simulate_pass_at_k(results, k=k_value)        print(f"pass@{k_value} = {score:.4f}")    # Direct check for numerical sanity    p1 = estimate_pass_at_k(200, 136, 1)    p10 = estimate_pass_at_k(200, 136, 10)    assert 0.0 <= p1 <= 1.0    assert p10 >= p1    print("sanity check passed")
目的:用无偏估计公式计算 pass@k 分数,并演示在同一组评测结果下,不同 k 值对应的通过率差异。
  1. math.comb(num_samples, k)计算组合数 $\binom{n}{k}$,用 Python 标准库实现,避免自写阶乘溢出。
  2. comb_nc_k = math.comb(num_samples - num_correct, k)计算从错误样本中抽 $k$ 个的组合数,这是“全错概率”的分子。
  3. return 1.0 - comb_nc_k / comb_n_k用 1 减去全错概率,得到“至少对一个”的无偏估计,即 pass@k。
  4. for k_value in (1, 10, 100)同一批评测结果分别算 pass@1、pass@10、pass@100,展示不同 k 值的分数差异。
  5. assert p10 >= p1验证“k 越大,通过率越高”的单调性直觉,确保公式没有用反。

常见误区

误区“两个模型都跑了一遍基准,A 的 pass@1 更高,所以 A 一定比 B 强,直接选 A。”

正解pass@1 只衡量“只给一次机会时写对的概率”,衡量的是稳定性。但真实工作中我们常常允许 AI 跑多次、挑最优(比如 IDE 插件里点一次不满意再生成一次)。这时候 pass@10 或 pass@100 代表了“潜力上限”——B 的 pass@1 比 A 低,但 pass@100 可能远超 A,说明 B 只是在稳定输出上略差,但知识储备更全。就像两个应聘者,一个平时稳定 70 分,一个偶尔 90 分,关键看你的岗位要稳定输出还是冲刺创新。

为何常见:大多数营销材料只公布 pass@1,因为它“看起来最像人类考试的分数”,最容易让外行理解,因此业内误把 pass@1 当作唯一排名依据。

误区“模型在 HumanEval 上考了 90 分,那它写生产级代码一定很厉害。”

正解HumanEval 的题目是“几分钟能解决的经典算法小题”,测试用例平均只有 7.7 个,它测量的是“函数级代码生成能力”,而不是工程能力。生产级代码涉及模块划分、错误处理、性能优化、依赖管理等复杂度,这些完全不在评测范围内。HumanEval 高分更像一个“扎实的算法笔试冠军”,而真实项目里还需要系统设计、代码审查、团队协作等能力——后者是两个基准根本不考的东西。

为何常见:人类社会中“考试成绩≈能力”的思维惯性被迁移到了 AI 评测上,但 AI 的基准考试覆盖面非常窄,分数高只能说明“这部分能力好”,不能外推。

误区“模型生成的代码通过了题目附带的所有测试用例,那这段代码一定是正确的。”

正解测试通过只能说明“在覆盖到的输入上行为正确”,不代表逻辑没有隐藏 bug。HumanEval 平均 7.7 个用例浮于表面,很多代码用错误逻辑也能碰巧通过。EvalPlus 的实验证明,把测试用例扩充到数百个后,许多原本满分的模型瞬间跌落 20 个百分点——说明它们之前的“正确”只是通过了窄小的抽查。测试用例质量决定了判卷可信度,这就像抽查作业时只对答案不验算,自然抓不出过程错误。

为何常见:人们天然信任“机器判分”的结果,忽略了判分规则本身可能过松。看到“全部通过”就自动脑补成“完美正确”,这在测试用例稀疏的基准上很容易造成误判。

误区“评测嘛,跑一遍得到分数就行了,种子也懒得固定,大概率差别不大。”

正解模型生成的随机性使得不固定种子的两次分数波动可能超过 2~3 个百分点。当你用分数做选型对比时,这个波动足以让“第一名”和“第二名”互换位置。只有固定种子并保持相同的采样参数,评测才是可复现的,也才能支撑“A 比 B 强”的结论。一次严谨的评测,应该像做科学实验一样严格控制随机种子、温度、采样数等所有变量。

为何常见:很多人把“跑基准”当成“跑测试”——认为代码没问题结果就必然一样。他们没意识到生成式模型带随机性,每次采样结果都不同,分数天然有统计波动。

误区“我查过了,题没有原样出现在训练数据里,所以不存在数据污染。”

正解数据污染不只是“原文背诵”一种形式。模型可能在训练时见过高度相似的题目变体、见过同一逻辑的多种表述、甚至见过测试用例的构造方式,从而学会了“套路化答题”,本质上仍属于污染。LAMBDA、IDEFICS 等研究都表明,即使原始题目没进训练集,模型也能通过“记忆相似模式”获得不该有的分数增益。换句话说,污染是光谱式的,不是非黑即白。

为何常见:“非黑即白”的思维方式在作祟——人们倾向于认为“没原题 = 干净”,忽略了深度嵌套、语法改写、语义复述等隐蔽形式。真实世界的污染是渐变光谱,评估时要有意识地用 EvalPlus 这类增强基准做二次复测。

面试题

Q1. 在 HumanEval 评测中,某模型对一道题的 200 个采样答案中有 100 个通过了全部测试用例,则该题在 pass@100 上的得分是?

单选题 · mid

  • A.约等于 0.5
  • B.约等于 1.0← 正确答案
  • C.约等于 0.0
  • D.无法由题目条件确定

答案:B。pass@100 表示从 200 个答案里任取 100 个,至少有一个正确的概率。由于 200 个里已有 100 个正确,任意取 100 个都不中的概率为 0(因为错误答案总共只有 100 个),因此 pass@100 = 1。选 B。其他选项:0.5 对应的是“先随机抽一个正确答案的概率”(pass@1 的近似),0.0 显然不对,D 忽略了该信息足以确定结果。

Q2. MBPP 基准最突出的特点是什么?

单选题 · mid

  • A.题目全部由竞赛级难题组成
  • B.每道题都是自然语言描述的直接编程任务← 正确答案
  • C.只支持 Java 一门语言
  • D.不提供任何测试用例

答案:B。MBPP(Mostly Basic Python Programs)的核心特点是“给一句自然语言需求,模型要写出完整 Python 函数”,强调从需求到代码的直接转化。A 错在难度,MBPP 是基础题为主而非竞赛难题;C 错在语言,MBPP 以 Python 为核心;D 错在它同样带有测试用例用于判分。

Q3. HumanEval 每道题平均的测试用例数量大约是多少?

单选题 · easy

  • A.约 3 个
  • B.约 7.7 个← 正确答案
  • C.约 77 个
  • D.约 769 个

答案:B。原版 HumanEval 平均约 7.7 个测试用例,这也是其评测标准偏宽松的原因之一。约 769 个是 EvalPlus 增强后的平均用例数,不是原版;约 3 个偏少,约 77 个也无依据。理解这个数字,才能抓住“为什么 EvalPlus 能打垮背题党”的要点。

Q4. 关于 pass@k 指标,下列说法正确的有?

多选题 · mid

  • A.k 值越大,pass@k 通常越大← 正确答案
  • B.pass@1 衡量模型稳定输出能力← 正确答案
  • C.温度设置为 0 时 pass@k≈pass@1← 正确答案
  • D.pass@k 与测试用例数量无关

答案:ABC。A 正确:k 增大意味着“多交几次答卷”,至少中一次的概率单调不降;B 正确:只给一次机会的通过率正是稳定性的度量;C 正确:温度 0 时每次生成几乎相同,多个样本退化为一个样本,pass@k 趋同于 pass@1;D 错误:测试用例决定了“什么是正确”,用例数量和质量会直接影响正确样本数 c,从而影响 pass@k。

Q5. 下列哪个选项是 EvalPlus 对原始 HumanEval 的主要改进?

单选题 · mid

  • A.将题目从 Python 翻译成英语
  • B.大幅扩充测试用例数量,增强判卷严格度← 正确答案
  • C.把静态题库换成动态更新的竞赛真题
  • D.删除所有函数签名,提高答题难度

答案:B。EvalPlus 通过自动生成大量额外测试用例(平均从 7.7 个提升到 769 个),让原本靠背题和碰运气得高分的行为现出原形。A 属于反向操作,题目本身已基于自然语言;C 是 LiveCodeBench 的思路,不是 EvalPlus;D 删除函数签名会改变题目结构,并非 EvalPlus 的做法。

Q6. 在跑 HumanEval 评测时,想要保证结果可复现,需要控制哪些变量?

多选题 · hard

  • A.固定随机种子← 正确答案
  • B.固定每道题的采样数量 n← 正确答案
  • C.固定温度参数← 正确答案
  • D.固定测试用例的先后顺序

答案:ABC。随机种子决定了采样序列,采样数量 n 影响统计置信度,温度影响输出多样性,三者是影响生成结果的核心变量,必须固定。D 测试用例顺序本身不影响模型输出(模型不会看到用例顺序),它影响的是评测脚本的执行细节,不是生成环节的可复现变量。因此正确组合是 A、B、C。

Q7. 关于数据污染导致分数虚高,以下哪种说法最符合实际?

单选题 · easy

  • A.只有原始题目原样出现在训练集才算污染
  • B.只要题目变体出现在训练数据中,也可能导致分数虚高← 正确答案
  • C.数据污染只会影响 MBPP,不影响 HumanEval
  • D.污染导致分数虚高但不会影响排名

答案:B。数据污染是“光谱式”的:原文出现最严重,但经过改写、近似变体、模式记忆等隐蔽形式同样会带来分数增益。A 把污染定义得过于狭窄,D 错在污染会导致强弱模型的分数都被抬升,排名可能恰好不变但分数本身已失效。C 没有依据,两个基准都可能被污染。

Q8. 用 pass@k 公式做统计估计时,为什么计算中要用约分技巧(如组合数化简)而非直接算大数阶乘?

单选题 · mid

  • A.阶乘计算耗时太长
  • B.避免 n 较大时中间数值溢出← 正确答案
  • C.为了人为提高分数
  • D.组合数无法用阶乘表示

答案:B。当 n=200 甚至更大时,直接计算 n! 会得到天文数字,尽管最终结果落在 [0,1] 区间,但中间过程极易超出浮点数表示范围。通过约分、逐步相乘等数值技巧,可以让中间值保持在可控范围而不会溢出。A 的耗时问题其次,核心是数值稳定性;C 显然荒谬;D 错误,组合数可以用阶乘定义,只是实现上要讲究方法。

Q9. 以下哪些做法属于在跑评测时“投机取巧”而应避免的行为?

多选题 · mid

  • A.只挑对自己有利的基准公布← 正确答案
  • B.用无法复现的随机种子设置← 正确答案
  • C.在不同模型间对比时使用不同的采样数← 正确答案
  • D.在报告中同时附上 pass@1 和 pass@100

答案:ABC。A 明显是选择性披露,会误导对比;B 不可复现,分数无从验证;C 在对比模型时,采样数不同会让 pass@k 失去公平性,属于变量不控制。D 反而是负责任的做法,同时展示稳定性和潜力上限,能让读者更全面地理解模型能力,不属于投机取巧。

Q10. 某模型在 HumanEval 原始基准上 pass@1 为 85%,在 EvalPlus 增强版上却只有 62%。以下哪种解释最合理?

单选题 · hard

  • A.EvalPlus 的测试用例写错了
  • B.模型有一定程度的“背题”或“刷题”行为← 正确答案
  • C.EvalPlus 增强了题目难度,模型能力不足
  • D.原始基准的测试用例必然有错

答案:B。EvalPlus 并不修改原题本身,只是新增了大量额外测试用例。“原始高分 + 增强低分”的典型原因,是模型在原始准上靠模式记忆或过拟合有限用例获得高分,遇到更全面的判卷后现出原形,这正是数据污染的标志。C 错在 EvalPlus 的题目本身没有变难,是判卷更严;A 和 D 属于甩锅,默认测试用例有误是不合理的。