在优化 LLM 应用的过程中,我们常常遇到这样的问题:通用模型在特定领域的表现总是差强人意。是直接上 GPT-4 成本太高?还是微调流程太复杂?今天我们就用 LlamaIndex 框架,一步步拆解 GPT-3.5-Turbo 的微调全流程,让你的模型在专属任务上焕发新生。

一、微调的核心目标:让模型成为领域专家

微调的核心是让模型 “记住” 特定领域的知识,就像让一个博学的专家专注于某个细分领域,回答更精准,响应更贴合需求。这次我们尝试用 GPT-4 生成训练数据,再用这些数据微调 GPT-3.5-Turbo,相当于让 “学霸” 带 “学神”,把高阶知识 “蒸馏” 到更经济的模型中。

二、数据准备:从 PDF 到高质量训练集的华丽转身

1. 下载与解析领域文档

我们选择 IPCC 的气候报告作为领域数据,这一步很关键 —— 数据质量直接决定微调上限。用 curl 下载 PDF 后,LlamaIndex 的 SimpleDirectoryReader 能轻松解析文档内容:

python

运行

!curl https://www.ipcc.ch/report/ar6/wg2/downloads/report/IPCC_AR6_WGII_Chapter03.pdf --output IPCC_AR6_WGII_Chapter03.pdf
from llama_index.core import SimpleDirectoryReader
documents = SimpleDirectoryReader(input_files=["IPCC_AR6_WGII_Chapter03.pdf"]).load_data()
# 打乱文档顺序,避免模型过拟合特定段落顺序
import random
random.seed(42)
random.shuffle(documents)

2. 生成训练与评估问题

这里我们扮演 “出题老师” 的角色,让 GPT-3.5 根据文档内容生成 40 个关键问题。注意看这个提示词设计:

python

运行

question_gen_query = (
    "你是一名教师/教授。你的任务是设置一场测验/考试。利用所提供的上下文,提出一个能抓住上下文中重要事实的单一问题。问题需局限于所提供的上下文信息。"
)
from llama_index.core.evaluation import DatasetGenerator
gpt_35_llm = OpenAI(model="gpt-3.5-turbo", temperature=0.3)
dataset_generator = DatasetGenerator.from_documents(
    documents[:50],
    question_gen_query=question_gen_query,
    llm=gpt_35_llm,
)
questions = dataset_generator.generate_questions_from_nodes(num=40)
print(f"成功生成{len(questions)}个训练问题")

这里有个小技巧:我们把文档分成两部分,前 50 页生成训练问题,后 50 页生成评估问题,确保评估数据的独立性。

三、关键环节:用 GPT-4 “投喂” 高质量训练数据

为什么用 GPT-4 生成数据?因为它的回答更接近 “标准答案”。这里我们用 OpenAIFineTuningHandler 来捕获 GPT-4 的响应作为训练样本:

python

运行

from llama_index.finetuning.callbacks import OpenAIFineTuningHandler
from llama_index.core.callbacks import CallbackManager
finetuning_handler = OpenAIFineTuningHandler()
callback_manager = CallbackManager([finetuning_handler])
# 这里切换到GPT-4生成高质量答案
llm = OpenAI(model="gpt-4", temperature=0.3)
llm.callback_manager = callback_manager

from llama_index.core import VectorStoreIndex
index = VectorStoreIndex.from_documents(documents)
query_engine = index.as_query_engine(similarity_top_k=2, llm=llm)

# 对每个训练问题,获取GPT-4的回答作为标签
questions = []
with open("train_questions.txt", "r") as f:
    for line in f:
        questions.append(line.strip())
        
for question in questions:
    response = query_engine.query(question)

四、评估体系:Ragas 库的双维指标拆解

微调效果好不好,得用科学的指标说话。Ragas 库的这两个指标太关键了:

  • answer_relevancy(答案相关性):衡量回答是否紧扣问题,避免 “答非所问”
  • faithfulness(忠实度):检查回答是否严格基于上下文,杜绝 “幻觉”

来看微调前的基线表现:

python

运行

from ragas import evaluate
from ragas.metrics import answer_relevancy, faithfulness
# 省略数据加载过程...
result = evaluate(ds, [answer_relevancy, faithfulness])
print(f"微调前Ragas得分:{result}")
# 输出:{'ragas_score': 0.8356, 'answer_relevancy': 0.9725, 'faithfulness': 0.7325}

可以看到,原始模型的忠实度只有 0.73,说明存在一定的 “编造” 情况。

五、启动微调:见证模型进化的关键时刻

终于到了激动人心的微调环节!LlamaIndex 的 OpenAIFineTuneEngine 把复杂的 API 调用封装得非常友好:

python

运行

from llama_index.finetuning import OpenAIFineTuneEngine
finetune_engine = OpenAIFineTuneEngine(
    "gpt-3.5-turbo",
    "finetuning_events.jsonl",
)
finetune_engine.finetune()

看看控制台输出的训练统计:

  • 61 个训练样本,每个样本包含系统提示、用户问题和专家回答
  • 平均每个样本 1274 个 tokens,3 个 epoch 的总费用约 0.62 美元(2023 年价格)
  • 没有样本超过 4096 tokens 限制,不用担心截断问题

六、效果验证:微调后的模型脱胎换骨

微调完成后,我们用相同的评估集测试,惊喜来了:

python

运行

# 加载微调后的模型
ft_llm = finetune_engine.get_finetuned_model(temperature=0.3)
# 省略评估过程...
result = evaluate(ds, [answer_relevancy, faithfulness])
print(f"微调后Ragas得分:{result}")
# 输出:{'ragas_score': 0.8680, 'answer_relevancy': 0.9607, 'faithfulness': 0.7917}

虽然相关性略有下降(0.9725→0.9607),但忠实度大幅提升(0.7325→0.7917),这意味着模型更少 “胡说八道” 了!

看个具体例子,原问题是:“根据这份报告,在全球范围内,海洋健康、治理以及适应气候变化的主要障碍是什么?”

  • 原始模型回答:强调技术、知识和资金支持的可获取性
  • 微调后回答:不仅提到上述因素,还补充了 “现有海洋治理结构面临多维度、与规模相关的挑战”

明显能感觉到,微调后的回答更完整,更贴合文档内容,这正是忠实度提升的直观体现。

七、行业中其他知识蒸馏的常见方法

1. 基于软标签(Soft Labels)的蒸馏
  • 教师模型输出:不仅提供真实标签(硬标签,如 “类别 1”),还输出样本属于各标签的概率分布(软标签,如 “类别 1: 60%,类别 2: 30%”)。
  • 训练方式:学生模型同时学习硬标签的交叉熵损失和软标签的 KL 散度损失,迫使学生模仿教师的 “不确定性” 和 “泛化逻辑”。
    • 案例:Hinton 等人提出的经典知识蒸馏方法,用于将 ResNet 的知识迁移到更小的网络。
2. 基于特征表示(Feature-based Distillation)的蒸馏
  • 教师模型输出:提取中间层的特征图(如 CNN 的卷积特征、Transformer 的注意力矩阵),作为学生模型的学习目标。
  • 训练方式:学生模型不仅学习预测标签,还学习匹配教师模型的特征分布,确保对输入数据的高层语义理解一致。
    • 案例:在 NLP 中,将 BERT 的层间隐藏状态作为特征,蒸馏到更浅层的模型(如 DistilBERT)。
3. 基于关系 / 结构(Relational/Structural Distillation)的蒸馏
  • 教师模型输出:挖掘样本之间的关系(如相似性排序、层次结构),要求学生模型保持相同的关系结构。
  • 训练方式:通过对比学习或图结构损失,迫使学生模型的输出空间与教师模型的几何结构一致。
    • 案例:在推荐系统中,教师模型生成用户 - 物品的交互关系,学生模型学习保留类似的关联模式。

八、实战总结与避坑指南

  1. 数据为王:61 个样本就有明显提升,但更多高质量数据(尤其是多样化场景)能进一步提升效果
  2. 提示词设计:系统提示中的 “禁止直接引用上下文” 等规则,能有效规范模型输出格式
  3. 成本控制:GPT-4 生成数据是成本大头,可以尝试用高质量人工标注数据替代
  4. 评估重要性:Ragas 的忠实度指标一定要重点关注,否则微调可能让模型 “跑偏”

如果本文对你有帮助,别忘了点赞收藏,关注我,一起探索更高效的开发方式~

Logo

更多推荐