虽然单独的指标计算有益,但手动逐个模型地执行它们效率低下且难以扩展。要从临时抽查转变为可重复且可靠的评估过程,您需要构建一个自动化评估流程。此流程将评估步骤规范化为脚本或工作流程,您可以在不同模型检查点、超参数设置或微调方法上保持一致地运行。精心设计的流程是模型系统化改进的根本。它确保每个模型都在相同条件下依据相同标准进行评判,使您的比较公平,结论可靠。评估流程的组成评估流程是一系列自动化步骤,接收模型和测试数据集作为输入,并输出包含性能指标的全面报告。核心组成部分处理数据加载、推理、计算和报告。digraph G { rankdir=TB; splines=ortho; node [shape=box, style="rounded,filled", fillcolor="#e9ecef", fontname="sans-serif"]; edge [fontname="sans-serif"]; subgraph cluster_input { label="输入"; style="dotted"; color="#adb5bd"; test_data [label="测试数据集\n(保留分割)", fillcolor="#a5d8ff"]; model [label="微调模型\n(检查点)", fillcolor="#d0bfff"]; } subgraph cluster_pipeline { label="自动化流程"; style="filled"; fillcolor="#f8f9fa"; color="#ced4da"; load_data [label="1. 加载与准备数据"]; inference [label="2. 生成预测\n(批量推理)"]; compute_metrics [label="3. 计算量化指标\n(ROUGE, BLEU, 困惑度)"]; sample_qualitative [label="4. 选择样本进行检查\n(例如,低分样本)"]; } subgraph cluster_output { label="输出"; style="dotted"; color="#adb5bd"; report [label="指标报告\n(JSON, CSV, 或 WandB)", shape=document, fillcolor="#b2f2bb"]; samples [label="定性样本文件", shape=document, fillcolor="#ffec99"]; } test_data -> load_data; model -> inference; load_data -> inference; inference -> compute_metrics; inference -> sample_qualitative; compute_metrics -> report; sample_qualitative -> samples; }自动化评估流程的标准工作流程,处理输入以生成结构化的性能报告。我们来审视这个过程的每个阶段。1. 加载测试数据集第一步是加载您的保留测试集。此数据集在训练或验证期间模型不得接触过。使用 Hugging Face datasets 库,这简单直接。确保数据格式,包括任何提示模板,与模型期望的精确匹配,这一点非常重要。from datasets import load_dataset # 从 Hugging Face Hub 或本地文件加载测试分割 test_dataset = load_dataset("argilla/ultrafeedback-binarized-preferences-cleaned", split="test_prefs") # 我们选择一个较小的样本进行快速评估 test_sample = test_dataset.select(range(100))2. 生成模型预测接下来,流程会遍历测试集,将每个输入提示馈送给模型,并收集生成的文本。此步骤通常是流程中最耗时的部分。为了提高效率,您应该批量处理数据。这是一个简单的推理循环示例。它接收模型、分词器和数据集,然后为每个条目生成预测。import torch from transformers import AutoModelForCausalLM, AutoTokenizer from tqdm.auto import tqdm # 假设模型和分词器已从检查点加载 # model = AutoModelForCausalLM.from_pretrained(...) # tokenizer = AutoTokenizer.from_pretrained(...) predictions = [] references = [] for example in tqdm(test_sample): # 根据您的微调任务格式化提示 prompt = f"### User:\n{example['chosen'][0]['content']}\n\n### Assistant:\n" reference_output = example['chosen'][1]['content'] inputs = tokenizer(prompt, return_tensors="pt").to(model.device) # 生成输出 outputs = model.generate(**inputs, max_new_tokens=256, pad_token_id=tokenizer.eos_token_id) prediction_text = tokenizer.decode(outputs[0], skip_special_tokens=True) # 清理输出,仅获取助手的回复 # 这部分高度依赖于您的数据和提示格式 clean_prediction = prediction_text.split("### Assistant:\n")[-1] predictions.append(clean_prediction) references.append(reference_output)3. 计算量化指标有了预测列表及其对应的真实参考,您现在可以计算我们之前讨论的自动化指标。Hugging Face 的 evaluate 库简化了此计算。import evaluate # 加载所需指标 rouge_metric = evaluate.load("rouge") bleu_metric = evaluate.load("bleu") # 计算分数 rouge_results = rouge_metric.compute(predictions=predictions, references=references) # BLEU 要求参考资料为列表的列表 bleu_results = bleu_metric.compute(predictions=predictions, references=[[r] for r in references]) print("ROUGE Results:", rouge_results) print("BLEU Results:", bleu_results)此步骤的输出是分数字典。这些结果应以 JSON 或 CSV 等结构化格式保存,并附带有关模型版本和评估日期的元数据。这会创建性能的历史记录。4. 将流程整合到训练生命周期中评估流程直接整合到您的模型开发生命周期中时效用最大。您可以将其配置为在特定间隔自动运行,例如在每个训练周期后,而不是在训练后运行一次性脚本。这使您能够随时间追踪模型性能,并找出模型在验证集上表现最佳的精确时间点,从而帮助您避免过拟合并选择最佳检查点进行最终部署。Weights & Biases 或 MLflow 等工具非常适合记录这些指标并在仪表板中进行可视化。{"layout":{"title":"每次评估步骤的 ROUGE-L 分数","xaxis":{"title":"评估步骤"},"yaxis":{"title":"ROUGE-L 分数"}},"data":[{"type":"scatter","mode":"lines+markers","name":"ROUGE-L","x":[1,2,3,4,5],"y":[0.22,0.35,0.41,0.40,0.38],"marker":{"color":"#4263eb"}}]}追踪 ROUGE-L 等指标在各个评估步骤中的表现,有助于找出表现最佳的模型检查点。在此示例中,性能在步骤 3 达到峰值。5. 选择样本进行定性检查最后,自动化指标不能说明全部情况。您的流程也应辅助定性检查过程。您可以利用量化分数找出最值得关注的案例,而不是随意选择样本进行检查。例如,您可以自动保存 ROUGE 分数最低的前五个预测。这些通常代表模型最大的不足,并提供对其弱点的有益信息。您还可以标记异常短、长或包含重复的输出。将这些困难的样本保存到单独的文件中,使人工进行有针对性且高效的检查变得更加容易。通过构建此自动化流程,您为模型评估建立了一个严谨、可重复、可扩展的过程。这种工程规范是将随意尝试与高质量、可靠语言模型的专业开发区分开来的原因。