趋近智
大师班
评估监督式微调(SFT)模型的主要目标是验证模型是否已更好地与期望行为对齐。这项评估有别于单纯继续预训练的目标,它侧重于评估模型遵循指令、提供有用回复和遵守指定限制的能力,而非原始的语言建模能力(如在通用语料库上的困惑度)。这一评估步骤非常重要,因为它决定了SFT阶段的成功,并常为后续的对齐阶段(如基于人类反馈的强化学习(RLHF))提供信息。
在评估之前,需清晰定义SFT旨在实现的特定对齐目的。这些通常包括:
衡量这些品质常需超越标准自动化指标。
对于主观属性,如实用性、复杂任务上的指令遵循忠实度以及无害性,人工评估仍是最可靠的方法。建立有效的人工评估涉及几个考量:
虽然强大,但人工评估是资源密集型的(时间、成本),并可能受到注释者间分歧的影响。它常用于验证自动化指标或进行周期性深入评估。
使用人工和自动化方法评估SFT模型回复的工作流程。
为补充人工评估并实现更快迭代,会使用几种自动化方法:
基于模型的评估:借助一个强大、预先存在的LLM(常被称为“评估器模型”,例如GPT-4、Claude)来评估SFT模型回复的质量。
你是一名公正的评判员,评估AI助手对用户指令回复的质量。
指令:“将以下文本总结为三点:\n[此处插入长文本片段...]”
助手回复:“[此处插入模型生成的摘要...]”
请根据以下标准评估回复:
1. 准确性:摘要是否准确反映了原文的主要观点?(1-5)
2. 简洁性:摘要是否简短扼要?(1-5)
3. 格式符合性:助手是否使用了正好三点?(是/否)
请以JSON格式提供您的评分:{"准确性": <分数>, "简洁性": <分数>, "格式符合性": "<是/否>"}
同时提供您评分的简短理由。
基准数据集:在专为指令遵循或实用性设计的既定基准上评估SFT模型。
text-davinci-003)。使用基准涉及在基准提示上运行SFT模型,然后使用基准规定的评估协议(常基于模型或基于人工)。
基于参考的指标(谨慎使用):ROUGE(用于摘要)或BLEU(用于翻译)等指标可以用于如果SFT任务涉及生成应与参考文本(例如,针对特定摘要风格进行微调)紧密匹配的文本。然而,它们常是衡量一般指令遵循或实用性的不佳指标,因为:
考虑这个简单例子: 指令:“用一句话解释万有引力。” 参考:“万有引力是行星或其他物体将物体吸引向其中心的力量。” 模型A:“万有引力是吸引有质量物体相互靠近的基本力。”(好,但BLEU/ROUGE得分低) 模型B:“万有引力是一种力。物体被行星吸引到它们的中心。”(尚可,BLEU/ROUGE得分高但流畅度较低)
在此处使用ROUGE可能会误导性地偏向模型B。
我们来演示获取回复并准备评估。假设您已使用PyTorch和Hugging Face transformers加载了您的SFT模型和分词器。
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
# 假设模型和分词器已加载
# model = AutoModelForCausalLM.from_pretrained(
# "path/to/your/sft_model"
# )
# tokenizer = AutoTokenizer.from_pretrained(
# "path/to/your/sft_model"
# )
# device = torch.device(
# 如果torch.cuda可用则为"cuda",否则为"cpu"
# )
# model.to(device)
# model.eval() # 将模型设置为评估模式
# --- 实际模型加载的占位符 ---
class DummyModel: # 模拟已加载的模型
def generate(
self, input_ids, attention_mask, max_new_tokens, pad_token_id
):
# 根据输入长度模拟生成
new_tokens = torch.randint(
100,
1000,
(input_ids.shape[0], max_new_tokens),
device=input_ids.device
)
output_ids = torch.cat([input_ids, new_tokens], dim=1)
return output_ids
class DummyTokenizer: # 模拟已加载的分词器
def __init__(self):
self.pad_token_id = 0
def encode(self, text, return_tensors=None):
# 非常简单的模拟
tokens = [101] + [ i+1000 for i in range(len(text.split())) ]
return torch.tensor([tokens], dtype=torch.long)
def decode(self, ids, skip_special_tokens=False):
# 非常简单的模拟
words = [
f"word{i-1000}" if i >= 1000 else "[CLS]"
for i in ids[0].tolist()
]
return " ".join(words)
def __call__(
self, text, return_tensors=None, padding=False, truncation=False
):
# 模拟常用的__call__
encoded = self.encode(text, return_tensors)
return {"input_ids": encoded, "attention_mask": torch.ones_like(encoded)}
model = DummyModel()
tokenizer = DummyTokenizer()
device = torch.device("cpu") # 示例简化
# --- 占位符结束 ---
def generate_response(prompt_text, model, tokenizer, max_new_tokens=100):
"""从SFT模型生成回复。"""
inputs = tokenizer(
prompt_text, return_tensors="pt", padding=True, truncation=True
).to(device)
with torch.no_grad():
output_ids = model.generate(
inputs.input_ids,
attention_mask=inputs.attention_mask,
max_new_tokens=max_new_tokens,
pad_token_id=tokenizer.pad_token_id
)
# 仅解码新生成的token
input_length = inputs.input_ids.shape[1]
generated_ids = output_ids[:, input_length:]
response = tokenizer.decode(generated_ids, skip_special_tokens=True)
return response
# 评估提示示例
eval_prompt = (
"指令:编写一个计算阶乘的简短 Python 函数。"
"\n回复:"
)
# 注意:好的SFT格式包括清晰的分隔符,例如
# \n回复:
generated_text = generate_response(eval_prompt, model, tokenizer)
print(f"评估提示:\n{eval_prompt}")
print(f"\n生成的回复:\n{generated_text}")
# --- 接下来的步骤将是:---
# 1. 将 `eval_prompt` 和 `generated_text` 发送给人工评估者。
# 2. 或者,为基于模型的评估器(如GPT-4)格式化它们。
# 3. 或者,如果作为基准的一部分,使用基准的特定评估
# 脚本。
# 4. 或者,应用更简单的检查(例如,检查生成的文本中是否包含 'def' 和 'return')——有限但快速。
不同的评估方法提供不同的信号。将它们结合使用常有益处。例如,使用自动化指标/基准进行广泛覆盖和频繁检查,并定期使用人工评估来验证自动化结果并检查不明显的问题。
评估SFT模型对齐度的不同方法的分数比较。注意自动化检查与人工或基于模型的评分可能存在的差异。
归根结底,有效评估SFT模型需要清晰理解对齐目的,并周全结合人类洞察力和可扩展的自动化技术。评估结果指引进一步的微调工作,助力创建不仅能干,而且真正实用可靠的LLM。
这部分内容有帮助吗?
© 2026 ApX Machine Learning用心打造