# HumanEval-X: 多语言代码生成基准 🌐 English 为了更好地评测代码生成模型的多语言生成能力,我们构建了一个新基准HumanEval-X。此前,多语言代码生成能力是基于语义相似度(比如[CodeBLEU](https://arxiv.org/abs/2009.10297))衡量的,具有一定误导性;HumanEval-X则可用于衡量生成代码的功能正确性。HumanEval-X包含820个高质量手写样本,覆盖Python、C++、Java、JavaScript、Go,可用于多种任务。

HumanEval-X支持的任务示例。声明描述解答分别用红、绿、蓝色标注。代码生成将声明与描述作为输入,输出解答。代码翻译将两种语言的声明与源语言的解答作为输入,输出目标语言的解答。

HumanEval-X中每个语言的样本,包含了声明、描述和解答,它们之间的组合可以支持不同的下游任务,包括生成、翻译、概括等。我们目前关注两个任务:**代码生成**与**代码翻译**。对于代码生成任务,模型将函数声明与文档字符串作为输入,输出函数实现;对于代码翻译任务,模型将两种语言的函数声明与源语言的实现作为输入,输出目标语言上的实现。我们在代码翻译任务中不将文档字符串输入模型,以避免模型直接通过描述生成答案。在两种任务下,我们都采用[Codex](https://arxiv.org/abs/2107.03374)所使用的无偏pass@k指标:$\text{pass}@k:= \mathbb{E}[1-\frac{\tbinom{n-c}{k}}{\tbinom{n}{k}}]$, $n=200$, $k\in(1,10,100)$。 ## 如何使用HumanEval-X 样本使用JSON列表格式存储在``codegeex/benchmark/humaneval-x/[LANG]/data/humaneval_[LANG].jsonl.gz``,每条样本包含6个部分: * ``task_id``: 题目的目标语言与ID。语言为["Python", "Java", "JavaScript", "CPP", "Go"]中之一。 * ``prompt``: 函数声明与描述,用于代码生成。 * ``declaration``: 仅有函数声明,用于代码翻译。 * ``canonical_solution``: 手写的示例解答。 * ``test``: 隐藏测例,用于评测。 * ``example_test``: 提示中出现的公开测例,用于评测。 ### 评测环境 评测生成的代码需要使用多种语言编译、运行。为了省去使用者配置这些语言环境的麻烦,我们构建了一个Docker镜像,并在其中配置了所需要的环境。 可以直接从Docker Hub拉取镜像: ```bash docker pull rishubi/codegeex:latest ``` 如果您熟悉Dockerfile,也可以从`codegeex/docker/Dockerfile`构建镜像,或者修改之以定制自己的配置: ```bash cd codegeex/docker docker build [OPTIONS] . ``` 获取镜像后,使用如下命令创建容器: ```bash docker run -it --gpus all --mount type=bind,source=,target= [OPTIONS] ``` ### 评测 我们推荐使用给定的[评测环境](#评测环境)进行评测。在评测前,将生成的代码以如下JSON列表形式存储: ``` {"task_id": "../..", "generation: "..."} {"task_id": "../..", "generation: "..."} ... ``` 并在本仓库的根目录下使用如下指令(请谨慎执行,生成的代码可能有极低概率产生意外行为。在[execution.py](execution.py)中查看警告并取消执行代码的注释,风险自负): ```bash bash scripts/evaluate_humaneval_x.sh ```