HumanEval: Hand-Written Evaluation Set 一个代码评测基准。
一共包括164条样本,数量较少
https://huggingface.co/datasets/openai/openai_humaneval/viewer/openai_humaneval/test?row=78
有个博客取其中一个case解释了
https://cloud.tencent.com/developer/article/2406832
{
"task_id": "问题编号",
"prompt": "提示词",
"entry_point": "入口函数",
"canonical_solution": "手写答案",
"test": "测试用例"
}
测试方法
https://github.com/abacaj/code-eval/tree/main/human-eval#usage
每一个测试问题重复实验n次,然后通过单元测试,计算平均通过率。
- 1、读取每个样本,请求模型获得结果:num_samples_per_task用来控制每道题生成多少个结果(代码中设置为200次),从而计算通过率。completion作为补全结果的存储字段。因此,整体会有32800条样本。
from human_eval.data import write_jsonl, read_problems
problems = read_problems()
num_samples_per_task = 200
samples = [
dict(task_id=task_id, completion=generate_one_completion(problems[task_id]["prompt"]))
for task_id in problems
for _ in range(num_samples_per_task)
]
write_jsonl("samples.jsonl", samples)
- 2、获得模型的结果,进行单元测试:直接使用python内置的exec函数进行校验,逻辑在于,给定超时timeout时间,如果测试通过,则标记为passed,如果不是,则不通过【比如说出现代码语法错误】。
def check_correctness(problem: Dict, completion: str, timeout: float, completion_id: Optional[int] = None) ->
里面对于测试样例的构造,是将题目的prompt、模型预测的内容completion、题目的test的按照换行符进行拼接。
评估方案 pass@K
- 所谓的pass@K,就是对每个测试问题重复测t次,每次生成K个答案,最后计算平均通过率。
假如重复实验100次来估计pass@100,就需要生成 100*100=10000个代码,这样的计算量是难以接受的。而t越小,估计的pass@k就越不准(方差越大)。
pass@K的来源
代码生成模型的主要基准是将样本与参考解进行匹配,匹配可以是精确的,也可以是模糊的(如BLEU分数)。
例如:
EM(Exact Match)是指生成的代码与真实代码具有相同的token序列的百分比;
BLUE机器翻译结果越接近专业人工翻译的结果,则越好,本质在判断两个句子的相似程度,相似度越高得分越高。
CodeBLEU是BLEU变体。在BLEU在n-gram匹配上的基础上,进一步通过抽象语法树(AST)融入代码语法,通过数据流融入代码语义;
但是,基于匹配的代码衡量标准存在缺陷。例如,BLEU在捕捉代码特有的语义特征方面存在问题。
因此,Kulal等人(2019年)使用pass@k指标评估功能正确性,每个问题生成k个代码样本,如果任何样本通过单元测试,则认为问题已解决,并报告总分数。
因此,为了评估pass@k,该工作会为每个任务生成n≥k个样本(本文中使用n=200,k≤100),计算通过单元测试的正确样本c≤n的数量,并计算无偏估计值。
假设模型只能生成这n个代码,而且他们每一种被生成出来的概率是相等的,其中有c个可以通过测试。那么模型任意生成k个代码,全都不能通过测试的概率是:生成k个不能通过测试的代码的情况总和与生成k个代码的全部情况总和之比。
根据大数定理,当样本总量趋近无穷大的时候,样本的平均值无限接近数学期望。因此只要求出其的均值,即得到了对pass@k的无偏估计。
具体代码实现:https://zhuanlan.zhihu.com/p/653063532做了公式的推演
def estimate_pass_at_k(
num_samples: Union[int, List[int], np.ndarray],
num_correct: Union[List[int], np.ndarray],
k: int,
) -> np.ndarray:
最后就可以得到官方的结果
$ evaluate_functional_correctness data/example_samples.jsonl --problem_file=data/example_problem.jsonl
Reading samples...
6it [00:00, 3397.11it/s]
Running example suites...
100%|...| 6/6 [00:03<00:00, 1.96it/s]
Writing results to data/example_samples.jsonl_results.jsonl...
100%|...| 6/6 [00:00<00:00, 6148.50it/s]
{'pass@1': 0.4999999999999999}
除了Python之外,多种编程语言的测试集HumanEval-X
https://cloud.tencent.com/developer/article/2406835
https://github.com/THUDM/CodeGeeX/blob/main/codegeex/benchmark/README_zh.md
代码评测Docker教程 https://opencompass.readthedocs.io/zh-cn/latest/advanced_guides/code_eval_service.html
除了HumanEval之外,还有其他代码测试集
MBPP数据集用来测试Code
https://opencompass.readthedocs.io/zh-cn/latest/advanced_guides/code_eval.html
BigCodeBench https://www.cnblogs.com/huggingface/p/18277793
北大出的CoderEval https://developer.huawei.com/consumer/cn/forum/topic/0204137084089559597
最新进展
LLama3在HumanEval中的表现: https://www.cnblogs.com/duanweishi/p/18148254
参考
https://blog.csdn.net/qq_27590277/article/details/135163862