在本篇文章中,我们将介绍如何使用知识蒸馏(Knowledge Distillation)技术,将一个GPT-4 Judge模型的知识蒸馏到一个GPT-3.5 Judge模型。具体步骤包括生成训练和测试数据集、执行知识蒸馏、以及评估微调后的模型表现。
1. 生成数据集:训练集和测试集
首先,我们需要生成包含问题和答案的数据集。本文使用Wikipedia的文章来生成这些数据。以下是具体步骤:
import os
from llama_index.readers.wikipedia import WikipediaReader
# 获取一些城市的历史数据
cities = ["San Francisco", "Toronto", "New York", "Vancouver", "Montreal", "Tokyo", "Singapore", "Paris"]
# 使用WikipediaReader加载数据
documents = WikipediaReader().load_data(pages=[f"History of {x}" for x in cities])
然后,我们使用DatasetGenerator来根据这些文档生成问题和答案:
from llama_index.core.evaluation import DatasetGenerator
from llama_index.llms.openai import OpenAI
# 设置LLM
gpt_35_llm = OpenAI(model="gpt-3.5-turbo", temperature=0.3)
# 生成问题的提示
QUESTION_GEN_PROMPT = (
"You are a Teacher/ Professor. Your task is to setup "
"a quiz/examination. Using the provided context, formulate "
"a single question that captures an important fact from the "
"context. Restrict the question to the context information provided."
)
# 实例化DatasetGenerator并生成数据集
dataset_generator = DatasetGenerator.from_documents(
documents,
question_gen_query=QUESTION_GEN_PROMPT,
llm=gpt_35_llm,
num_questions_per_chunk=25,
)
qrd = dataset_generator.generate_dataset_from_nodes(num=350)
2. 执行知识蒸馏
接下来,我们使用GPT-4 Judge模型来评估由Llama-2模型生成的答案,并将这些评估结果用于微调GPT-3.5模型。
from llama_index.llms.openai import OpenAI
from llama_index.finetuning.callbacks import OpenAIFineTuningHandler
from llama_index.core.callbacks import CallbackManager
from llama_index.core.evaluation import CorrectnessEvaluator
# 初始化GPT-4 Judge
finetuning_handler = OpenAIFineTuningHandler()
callback_manager = CallbackManager([finetuning_handler])
gpt_4_llm = OpenAI(
temperature=0, model="gpt-4", callback_manager=callback_manager
)
gpt4_judge = CorrectnessEvaluator(llm=gpt_4_llm)
# 对训练数据进行评估
import tqdm
for data_entry in tqdm.tqdm(train_dataset):
eval_result = await gpt4_judge.aevaluate(
query=data_entry["question"],
response=data_entry["response_data"]["text"],
context=data_entry["response_data"]["context"],
reference=data_entry["reference"],
)
judgement = {"llm": "gpt_4", "score": eval_result.score, "text": eval_result.response}
data_entry["evaluations"] = [judgement]
finetuning_handler.save_finetuning_events("correction_finetuning_events.jsonl")
3. 评估微调后的GPT-3.5模型
最后,我们评估微调后的GPT-3.5 Judge模型在测试集上的表现,并与GPT-4的评估结果进行对比。
from llama_index.finetuning import OpenAIFinetuneEngine
# 微调GPT-3.5模型
finetune_engine = OpenAIFinetuneEngine(
"gpt-3.5-turbo",
"correction_finetuning_events.jsonl",
)
finetune_engine.finetune()
# 获取微调后的模型
ft_llm = finetune_engine.get_finetuned_model()
ft_gpt_3p5_judge = CorrectnessEvaluator(llm=ft_llm)
# 评估测试数据
for data_entry in tqdm.tqdm(test_dataset):
eval_result = await ft_gpt_3p5_judge.aevaluate(
query=data_entry["question"],
response=data_entry["response_data"]["text"],
context=data_entry["response_data"]["context"],
reference=data_entry["reference"],
)
judgement = {"llm": "ft_gpt_3p5", "score": eval_result.score, "text": eval_result.response}
data_entry["evaluations"] += [judgement]
可能遇到的错误
- API Key错误:确保环境变量中正确设置了OpenAI和HuggingFace的API Key。
- 数据加载问题:检查WikipediaReader是否能够正常加载数据,如果不能,可能需要检查网络连接或Wikipedia API的可用性。
- 模型调用超时:如果模型调用时间过长,可以调整参数或者检查网络连接是否稳定。
如果你觉得这篇文章对你有帮助,请点赞,关注我的博客,谢谢!
参考资料:
- OpenAI API参考文档
- LlamaIndex文档