趋近智
关于评估指标和方法的理论与讨论必不可少,但实际应用能巩固理解。一个动手操作演示将展示如何将标准安全基准应用于大型语言模型(LLM)。此次实践演示将着重评测模型生成真实陈述的倾向,这是评估模型诚实性的一个主要方面,同时考虑到无害性和实用性。
我们将使用 TruthfulQA 基准,该基准专门设计用于衡量语言模型在回答人类可能因误解或错误信念而给出错误答案的问题时是否真实。它为评估事实记忆中的诚实性提供了一个具有挑战性的测试平台。
首先,请确保您已安装必要的库。我们将主要使用Hugging Face生态系统(transformers、datasets、evaluate)进行模型加载、数据处理和指标计算。
pip install transformers datasets evaluate sentencepiece accelerate torch
# 如果您偏好使用TensorFlow或JAX后端,请添加它们
我们假设您拥有一个可用的Python环境(推荐3.8+版本)和所需的机器学习框架(本示例中使用PyTorch)。
TruthfulQA在Hugging Face Hub上方便获取。我们将加载“生成”('generation')子集,其中包含用于评估生成模型的问题。
"我们还需要一个语言模型来评估。本示例中,我们使用一个现成的指令微调模型,如 google/flan-t5-base。在实际场景中,您需要将其替换为您正在开发或评估的特定大型语言模型。"
from datasets import load_dataset
from transformers import AutoModelForSeq2SeqLM, AutoTokenizer
import torch
# 加载TruthfulQA生成数据集
try:
truthfulqa_dataset = load_dataset("truthful_qa", "generation")
print("TruthfulQA数据集加载成功。")
# 可选:选择一个较小的子集以加快测试速度
# subset_indices = range(10) # 使用前10个示例
# truthfulqa_subset = truthfulqa_dataset['validation'].select(subset_indices)
truthfulqa_subset = truthfulqa_dataset['validation'] # 使用完整的验证集
except Exception as e:
print(f"加载数据集出错: {e}")
# 妥善处理数据集加载失败
exit()
# 定义模型ID
model_id = "google/flan-t5-base"
print(f"正在加载模型: {model_id}")
# 加载分词器和模型
# 确保与您的硬件(CPU或GPU)兼容
device = torch.device("cuda" if torch.cuda_is_available() else "cpu")
print(f"正在使用设备: {device}")
try:
tokenizer = AutoTokenizer.from_pretrained(model_id)
model = AutoModelForSeq2SeqLM.from_pretrained(model_id).to(device)
model.eval() # 将模型设置为评估模式
print("模型和分词器加载成功。")
except Exception as e:
print(f"加载模型或分词器出错: {e}")
# 处理模型加载失败
exit()
truthfulqa_dataset['validation'] 对象现在包含了问题。每个示例通常包含:
question:模型输入的问题。best_answer:根据人工评估得出的最真实答案。correct_answers:可接受的真实答案列表。incorrect_answers:常见的错误答案列表。现在,我们将遍历基准问题,并使用我们加载的LLM生成回答。我们将存储这些生成的答案以供后续评估。
import time
generated_answers = []
max_examples = len(truthfulqa_subset) # 如果需要加速,限制示例数量
batch_size = 8 # 根据您的GPU内存调整
num_batches = (max_examples + batch_size - 1) // batch_size
print(f"正在为{max_examples}个问题生成答案,分为{num_batches}批次...")
start_time = time.time()
for i in range(0, max_examples, batch_size):
batch_questions = truthfulqa_subset['question'][i:min(i + batch_size, max_examples)]
# 为模型准备输入
inputs = tokenizer(batch_questions, return_tensors="pt", padding=True, truncation=True, max_length=128).to(device)
# 生成输出
with torch.no_grad(): # 推理时禁用梯度计算
outputs = model.generate(
**inputs,
max_new_tokens=64, # 限制生成答案的长度
do_sample=False # 使用贪婪解码以获得确定性输出
# 考虑对采样输出尝试使用temperature, top_k, top_p
)
# 将生成的token ID解码回文本
batch_answers = tokenizer.batch_decode(outputs, skip_special_tokens=True)
generated_answers.extend(batch_answers)
# 进度更新
if (i // batch_size + 1) % 10 == 0 or (i // batch_size + 1) == num_batches:
elapsed_time = time.time() - start_time
print(f"已处理批次 {i // batch_size + 1}/{num_batches}。耗时: {elapsed_time:.2f}秒")
print(f"\n已生成 {len(generated_answers)} 个答案。")
# 生成答案的示例
if generated_answers:
print("\n生成的答案示例:")
print(f"问题: {truthfulqa_subset['question'][0]}")
print(f"生成: {generated_answers[0]}")
print(f"最佳参考: {truthfulqa_subset['best_answer'][0]}")
请注意:为完整的TruthfulQA验证集(约800个问题)生成回答可能需要时间,特别是在CPU或性能较低的GPU上。根据需要调整 max_examples 或 batch_size。
TruthfulQA评估通常使用两种主要方法进行:
correct_answers 列表进行对比。这提供了一个基本的重叠度量,但不能保证真实性。为方便本次实践,我们将演示如何使用 evaluate 库计算BLEU分数。计算判断模型分数需要设置特定的判断模型,这增加了超出本示例范围的复杂度,但却是严谨评估的推荐方法。请查阅TruthfulQA官方资料以获取使用判断模型的详细信息。
import evaluate
import numpy as np
# 加载BLEU指标
try:
bleu_metric = evaluate.load("bleu")
print("\nBLEU指标已加载。")
except Exception as e:
print(f"加载BLEU指标出错: {e}")
# 处理指标加载失败
exit()
# 准备参考答案:TruthfulQA为每个问题提供了多个正确答案。
# 我们需要为evaluate库正确格式化它们(字符串列表的列表)。
references = [truthfulqa_subset['correct_answers'][i] for i in range(len(generated_answers))]
predictions = generated_answers
# 计算BLEU分数
# 注意:BLEU可能不是衡量真实性的理想指标,
# 因为一个流畅的谎言相对于真实参考答案可能仍然获得较低的BLEU分数。
# 它在这里作为一个基本示例。
try:
results = bleu_metric.compute(predictions=predictions, references=references)
print("\nBLEU分数结果:")
print(results)
# 判断为真实的百分比示例(模拟 - 需要判断模型)
# 这部分是说明性的;您需要用实际的判断模型输出替换随机分数。
# 假设判断模型输出1表示真实,0表示虚假
simulated_truth_scores = np.random.randint(0, 2, size=len(predictions))
percent_true = np.mean(simulated_truth_scores) * 100
print(f"\n模拟真实性分数(真实百分比): {percent_true:.2f}% (需要实际判断模型)")
except Exception as e:
print(f"计算指标出错: {e}")
例如,您可能会发现基础模型在TruthfulQA上达到30%的“真实且信息量大”,而RLHF对齐版本达到55%。这为对齐技术对特定安全维度的影响提供了具体证据。
示例对比,展示了对齐后的模型(模型B)在模拟TruthfulQA指标上可能比基础模型(模型A)有所提升。实际评估需要运行特定的基准判断模型。
本次实践演示了应用一个特定安全基准的工作流程。请记住:
本次动手实践构成了一个起点。在严谨的评估过程中,下一步的合理举措涉及用本章前面讨论的人工评估协议和红队方法来补充自动化基准,以获得对您的LLM安全状况更全面的了解。
这部分内容有帮助吗?
© 2026 ApX Machine Learning用心打造