Skip to content

Latest commit

 

History

History
75 lines (52 loc) · 3.9 KB

README_zh.md

File metadata and controls

75 lines (52 loc) · 3.9 KB

HumanEval-X: 多语言代码生成基准

🌐 English

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

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

HumanEval-X中每个语言的样本,包含了声明、描述和解答,它们之间的组合可以支持不同的下游任务,包括生成、翻译、概括等。我们目前关注两个任务:代码生成代码翻译。对于代码生成任务,模型将函数声明与文档字符串作为输入,输出函数实现;对于代码翻译任务,模型将两种语言的函数声明与源语言的实现作为输入,输出目标语言上的实现。我们在代码翻译任务中不将文档字符串输入模型,以避免模型直接通过描述生成答案。在两种任务下,我们都采用Codex所使用的无偏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: 提示中出现的公开测例,用于评测。

评测环境

评测生成的代码需要使用多种语言编译、运行。我们使用的各编程语言依赖及所用包的版本如下:

依赖 版本
Python 3.8.12
JDK 18.0.2.1
Node.js 16.14.0
js-md5 0.7.3
C++ 11
g++ 7.5.0
Boost 1.71.0
OpenSSL 3.0.0
go 1.18.4

为了省去使用者配置这些语言环境的麻烦,我们构建了一个Docker镜像,并在其中配置了所需要的环境。

可以直接从Docker Hub拉取镜像:

docker pull rishubi/codegeex:latest

如果您熟悉Dockerfile,也可以从codegeex/docker/Dockerfile构建镜像,或者修改之以定制自己的配置:

cd codegeex/docker
docker build [OPTIONS] .

获取镜像后,使用如下命令创建容器:

docker run -it --gpus all --mount type=bind,source=<LOCAL PATH>,target=<PATH IN CONTAINER> [OPTIONS] <IMAGE NAME:TAG>

评测

我们推荐使用给定的评测环境进行评测。在评测前,将生成的代码以如下JSON列表形式存储:

{"task_id": "../..", "generation: "..."}
{"task_id": "../..", "generation: "..."}
...

并在本仓库的根目录下使用如下指令(请谨慎执行,生成的代码可能有极低概率产生意外行为。在execution.py中查看警告并取消执行代码的注释,风险自负):

bash scripts/evaluate_humaneval_x.sh <RESULT_FILE> <LANG> <N_WORKERS>