HumaneVal:通过PASS@k
评估代码生成>本教程探索了HumaneVal,这是评估大语模型(LLM)代码生成功能的OpenAI基准,重点介绍了pass@k
指标。我们将使用拥抱的面部生态系统来评估164个Python问题的codeparrot-small
模型。 这提供了一种实用的功能正确性评估,与传统的文本相似度指标形成鲜明对比。
>由作者 图像
理解通过@k
生成的代码样本中的一个概率正确解决了问题。 这比简单的文本匹配更相关,反映了现实世界开发人员测试。>
pass@k
其中:
n
c
k
k 样品的概率不正确,然后从1中减去它以获取至少一个正确的样本的概率。 更高的分数表示更好的代码生成性能。 排行榜经常使用和pass@k
。pass@10
>
pass@100
人性化的评估,拥抱脸
本节使用拥抱面的
库详细介绍了评估过程。我们将使用较小的模型进行更快的评估。evaluate
codeparrot-small
安装必要的库:
设置环境变量:
pip install evaluate
import os os.environ["HF_ALLOW_CODE_EVAL"] = "1" os.environ["TOKENIZERS_PARALLELISM"] = "false"2。加载数据集和公制:
>加载
>数据集和公制:openai_humaneval
code_eval
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
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_id
eos_token_id
5。代码生成:
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个问题):
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@1
和pass@5
分数,以表明模型的性能。 请记住,由于代码生成的随机性,结果可能会有所不同。 将这些结果与更强大的模型(例如GPT-4)的结果进行比较,为codeparrot-small
>模型的功能提供了上下文。 进一步的分析可能涉及探索不同的超参数或使用更复杂的代码生成技术。
以上是HumaneVal:评估LLM代码生成功能的基准的详细内容。更多信息请关注PHP中文网其他相关文章!