首頁 >科技週邊 >人工智慧 >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