如何对OpenAI微调模型开展问答基准测试?
微调OpenAI模型对接HuggingFace问答基准测试实现方案
核心逻辑不需要做模型格式转换,直接把OpenAI API调用封装成HuggingFace数据集、评估库兼容的推理接口即可,完全可以支撑自动化批量测试需求,不受官方文档仅提供基础调用示例的限制。
环境准备
- 安装必要依赖:执行命令
pip install openai datasets evaluate tqdm - 提前准备好微调后模型的专属ID(格式类似
ft:gpt-3.5-turbo-0613:个人/组织标识::自定义ID),API密钥建议通过环境变量读取,不要硬编码在脚本中。
封装适配评估流程的推理函数
按照你微调时使用的Prompt格式封装预测逻辑,保证推理输入和训练输入格式完全一致,避免精度损失:
import os import time from openai import OpenAI from tqdm import tqdm # 初始化客户端 client = OpenAI(api_key=os.getenv("OPENAI_API_KEY")) FINETUNED_MODEL_ID = "替换为你的微调模型ID" def predict_single_sample(example): # 以下messages格式严格对齐微调时的输入模板 messages = [ {"role": "system", "content": "你是精准问答助手,针对用户问题给出简洁正确答案"}, {"role": "user", "content": example["question"]} # 如果是SQuAD类带上下文的问答任务,把example["context"]拼接到content里即可 ] try: resp = client.chat.completions.create( model=FINETUNED_MODEL_ID, messages=messages, temperature=0, # 基准测试必须固定为0,关闭随机采样保证结果可复现 max_tokens=256, top_p=1 ) example["model_prediction"] = resp.choices[0].message.content.strip() except Exception as e: # 失败重试逻辑,可根据自己的API限额调整等待时间 time.sleep(1) resp = client.chat.completions.create( model=FINETUNED_MODEL_ID, messages=messages, temperature=0, max_tokens=256, top_p=1 ) example["model_prediction"] = resp.choices[0].message.content.strip() return example
注意:如果你的测试集样本量较大,可以在函数里加随机抖动的延迟,避免触发OpenAI API的并发速率限制。
加载目标基准数据集批量推理
- 常用问答类基准(MMLU、TruthfulQA、SQuAD、C-Eval等)都可以直接通过
datasets库加载,不需要手动下载整理文件。 - 调用数据集的
map方法批量执行推理,可配置多进程提速,适配自动化流水线:
from datasets import load_dataset # 示例为加载MMLU会计分支测试集,替换为你需要测试的数据集名称和配置即可 qa_test_dataset = load_dataset("lukaemon/mmlu", "accounting", split="test") # 批量推理 result_dataset = qa_test_dataset.map( predict_single_sample, batched=False, num_proc=3 # 根据自身CPU核数、OpenAI账号并发限额调整数值 ) # 推理结果可以直接存到本地,避免重复调用API浪费额度 result_dataset.to_json("mmlu_accounting_finetuned_pred.jsonl", force_ascii=False)
加载对应指标计算测试结果
- 根据任务类型从
evaluate库加载对应评估指标:分类类问答用准确率指标,抽取/生成类问答用精确匹配(EM)、F1值指标,传入模型预测结果和数据集自带的标准答案即可自动算分:
import evaluate # 示例为计算分类问答准确率,生成类问答替换为squad对应指标即可 acc_metric = evaluate.load("accuracy") # 注意reference字段对应数据集里的标准答案键名,比如MMLU为target,SQuAD为answers eval_result = acc_metric.compute( predictions=result_dataset["model_prediction"], references=result_dataset["target"] ) print(f"模型在当前测试集准确率:{eval_result['accuracy']:.4f}")
常见踩坑提示
- 测试阶段所有推理参数(temperature、top_p、max_tokens)必须固定,不要开启随机采样,否则多次测试的分数没有对比意义。
- 输入Prompt的拼接规则、系统提示词内容必须和微调训练时完全一致,格式偏差会导致模型表现大幅下降。
- 大样本量测试前先确认账号的OpenAI API TPM、并发限额,避免请求被批量拦截。
内容的提问来源于stack exchange,提问作者samuelnihoul
相关产品推荐
相关产品推荐

