首页 >科技周边 >人工智能 >HumaneVal:评估LLM代码生成功能的基准

HumaneVal:评估LLM代码生成功能的基准

Joseph Gordon-Levitt
Joseph Gordon-Levitt原创
2025-03-02 09:47:11887浏览

HumaneVal:通过PASS@k

评估代码生成

>本教程探索了HumaneVal,这是评估大语模型(LLM)代码生成功能的OpenAI基准,重点介绍了pass@k指标。我们将使用拥抱的面部生态系统来评估164个Python问题的codeparrot-small模型。 这提供了一种实用的功能正确性评估,与传统的文本相似度指标形成鲜明对比。

HumanEval: A Benchmark for Evaluating LLM Code Generation Capabilities

>由作者 图像

理解通过@k

k

生成的代码样本中的一个概率正确解决了问题。 这比简单的文本匹配更相关,反映了现实世界开发人员测试。>

公式为:1 -c(n -c,k)/c(n,k) pass@k其中:

    :总生成的样品。
  • n
  • :正确样本的数量。
  • c
  • :考虑的顶级样本数量。
  • > k
  • 公式计算出
所有

k 样品的概率不正确,然后从1中减去它以获取至少一个正确的样本的概率。 更高的分数表示更好的代码生成性能。 排行榜经常使用pass@kpass@10> pass@100人性化的评估,拥抱脸

本节使用拥抱面的

库详细介绍了评估过程。我们将使用较小的

模型进行更快的评估。evaluate codeparrot-small

1。设置:

安装必要的库:

设置环境变量:
pip install evaluate

import os
os.environ["HF_ALLOW_CODE_EVAL"] = "1"
os.environ["TOKENIZERS_PARALLELISM"] = "false"
2。加载数据集和公制:

>加载

>数据集和

公制: openai_humaneval code_eval

3。加载模型和令牌器:
from datasets import load_dataset
from evaluate import load
human_eval = load_dataset("openai_humaneval")['test']
code_eval_metric = load("code_eval")

> 加载模型和令牌:

codeparrot/codeparrot-small

4。 Tokenizer调整:
from transformers import AutoModelForCausalLM, AutoTokenizer
import torch
model_name = "codeparrot/codeparrot-small"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(model_name)
model.eval()

确保令牌具有>和

,请在必要时调整型号嵌入:

pad_token_ideos_token_id5。代码生成:

if tokenizer.pad_token_id is None: tokenizer.pad_token_id = 0
if tokenizer.eos_token_id is None: tokenizer.eos_token_id = 2
if tokenizer.pad_token is None: tokenizer.add_special_tokens({'pad_token': '<pad>'})
if tokenizer.eos_token is None: tokenizer.add_special_tokens({'eos_token': ''})
if len(tokenizer) > model.config.vocab_size: model.resize_token_embeddings(len(tokenizer))</pad>

每个问题生成5个代码示例(总共164个问题):> 6。计算通过@k:

compute

num_samples_per_problem = 5
test_cases = []
candidates = []
for problem in tqdm(human_eval, desc="Problems", unit="problem"):
    prompt = problem['prompt']
    test_code = problem['test']
    test_cases.append(test_code)
    problem_candidates = []
    for _ in range(num_samples_per_problem):
        inputs = tokenizer(prompt, return_tensors="pt").to("cuda" if torch.cuda.is_available() else "cpu")
        with torch.no_grad():
            outputs = model.generate(input_ids=inputs['input_ids'], attention_mask=inputs['attention_mask'], max_length=512, do_sample=True, temperature=0.7, top_p=0.95, num_return_sequences=1, pad_token_id=tokenizer.pad_token_id, eos_token_id=tokenizer.eos_token_id)
        generated_code = tokenizer.decode(outputs[0], skip_special_tokens=True)
        generated_code = generated_code[len(prompt):]
        problem_candidates.append(generated_code)
    candidates.append(problem_candidates)

>

pip install evaluate

>输出将显示pass@1pass@5分数,以表明模型的性能。 请记住,由于代码生成的随机性,结果可能会有所不同。 将这些结果与更强大的模型(例如GPT-4)的结果进行比较,为codeparrot-small>模型的功能提供了上下文。 进一步的分析可能涉及探索不同的超参数或使用更复杂的代码生成技术。

以上是HumaneVal:评估LLM代码生成功能的基准的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn