【finetuning】交叉编码器微调案例

发布时间:2026/7/15 4:44:40
【finetuning】交叉编码器微调案例 本案例演示如何使用LlamaIndex微调交叉编码器以提高检索系统的重排序效果。通过使用QASPER数据集我们将展示从数据准备、模型微调到评估的完整流程。1. 案例目标本案例的主要目标是学习交叉编码器微调了解如何使用LlamaIndex对交叉编码器进行微调以适应特定领域的重排序任务。提高检索效果通过微调交叉编码器提升检索系统的重排序能力从而提高检索结果的准确性。评估微调效果学习如何使用多种评估方法如Hits指标、pairwise比较来量化微调前后模型性能的差异。2. 技术栈与核心依赖LlamaIndex用于构建检索增强生成(RAG)系统的核心框架llama-index-finetuning-cross-encodersLlamaIndex的交叉编码器微调模块sentence-transformers用于加载和使用预训练的句子嵌入模型datasetsHugging Face数据集库用于加载和处理QASPER数据集OpenAI API用于生成评估数据Hugging Face Hub用于保存和分享微调后的模型3. 环境配置在开始之前需要安装以下依赖包!pip install llama-index-finetuning-cross-encoders !pip install datasets !pip install sentence-transformers !pip install openai !pip install huggingface_hub此外还需要设置以下环境变量import os os.environ[OPENAI_API_KEY] YOUR_API_KEY4. 案例实现4.1 数据准备本案例使用QASPER数据集这是一个包含学术论文及其相关问答的数据集。我们首先加载数据集并进行预处理from datasets import load_dataset # 加载QASPER数据集 qasper_dataset load_dataset(allenai/qasper) # 抽取部分数据用于训练和测试 train_dataset qasper_dataset[train].shuffle(seed42).select(range(800)) test_dataset qasper_dataset[test].shuffle(seed42).select(range(80))接下来我们定义一些辅助函数来处理论文文本和问题提取def get_full_text(paper): 获取论文的全文 full_text if title in paper: full_text paper[title] \n\n if abstract in paper: full_text paper[abstract] \n\n # 添加全文内容 for section in paper[full_text]: section_name section[section_name] section_text .join(section[paragraphs]) full_text f{section_name}\n{section_text}\n\n return full_text def get_questions(paper): 获取论文中的所有问题 return [q[question] for q in paper[qas]]4.2 生成微调数据我们使用LlamaIndex的generate_finetuning_dataset函数来生成微调数据from llama_index.finetuning.cross_encoders import generate_finetuning_dataset # 生成微调数据 finetuning_dataset generate_finetuning_dataset( train_dataset, get_full_text, get_questions, max_chunk_length256, top_k5, output_pathfine_tuning.csv )这个过程会生成11674条微调样本每条样本包含一个查询和相关文档的片段以及它们的相关性标签。4.3 微调交叉编码器接下来我们使用生成的微调数据来微调交叉编码器from llama_index.finetuning.cross_encoders import CrossEncoderFinetuneEngine # 初始化微调引擎 finetune_engine CrossEncoderFinetuneEngine( model_namecross-encoder/ms-marco-MiniLM-L-12-v2, train_dataset_pathfine_tuning.csv, model_output_pathfinetuned_cross_encoder, epochs3, batch_size16, learning_rate2e-5, warmup_steps50, save_steps200, eval_steps200, logging_steps50, ) # 开始微调 finetune_engine.finetune()微调完成后我们可以将模型推送到Hugging Face Hubfrom huggingface_hub import HfApi, notebook_login # 登录Hugging Face notebook_login() # 推送模型 finetune_engine.push_to_hub(your-username/finetuned-cross-encoder)4.4 评估微调效果我们使用多种方法来评估微调后的交叉编码器效果4.4.1 使用Hits指标评估from llama_index.core.evaluation import RetrieverEvaluator from llama_index.core.schema import TextNode, NodeWithScore # 创建评估数据 eval_data [] for paper in test_dataset: full_text get_full_text(paper) questions get_questions(paper) # 创建节点 node TextNode(textfull_text) # 为每个问题创建查询和期望结果 for question in questions: eval_data.append({ query: question, expected_ids: [node.id], mode: default }) # 评估原始模型 original_retriever VectorIndexRetriever(indexindex, similarity_top_k5) original_evaluator RetrieverEvaluator.from_metric_names( [hit_rate], retrieveroriginal_retriever ) original_results original_evaluator.evaluate(eval_data) # 评估微调后的模型 finetuned_retriever VectorIndexRetriever( indexindex, similarity_top_k5, rerankerCrossEncoderReranker(model_nameyour-username/finetuned-cross-encoder) ) finetuned_evaluator RetrieverEvaluator.from_metric_names( [hit_rate], retrieverfinetuned_retriever ) finetuned_results finetuned_evaluator.evaluate(eval_data)4.4.2 使用Pairwise比较评估from llama_index.core.evaluation import PairwiseComparisonEvaluator # 创建比较评估器 pairwise_evaluator PairwiseComparisonEvaluator( llmOpenAI(modelgpt-4) ) # 比较原始模型和微调后模型的结果 pairwise_results [] for query in test_queries: # 获取原始模型结果 original_response original_query_engine.query(query) # 获取微调后模型结果 finetuned_response finetuned_query_engine.query(query) # 进行比较评估 result pairwise_evaluator.evaluate( queryquery, responseoriginal_response, referencefinetuned_response ) pairwise_results.append(result)5. 案例效果通过实验我们观察到以下结果5.1 Hits指标对比无重排序器Hits5 30基础交叉编码器Hits5 34微调交叉编码器Hits5 375.2 Pairwise比较结果无重排序器平均pairwise得分 0.553788基础交叉编码器平均pairwise得分 0.556818微调交叉编码器平均pairwise得分 0.6这些结果表明微调后的交叉编码器在重排序任务上表现更好能够更准确地识别与查询最相关的文档。6. 案例实现思路6.1 数据准备我们选择QASPER数据集是因为它包含了学术论文及其相关问题非常适合用于学术检索系统的微调。通过提取论文全文和问题我们创建了高质量的查询-文档对。6.2 微调策略我们选择了cross-encoder/ms-marco-MiniLM-L-12-v2作为基础模型因为它在重排序任务上表现良好且模型大小适中。微调过程中我们使用了较小的学习率(2e-5)和适当的批次大小(16)以确保模型能够稳定学习。6.3 评估方法我们采用了多种评估方法来全面衡量模型性能Hits指标衡量正确答案出现在前K个结果中的频率Pairwise比较使用GPT-4作为评估器比较不同模型的响应质量7. 扩展建议使用更大的数据集增加训练数据量可能会进一步提升模型性能尝试不同的基础模型实验不同的预训练交叉编码器作为基础模型调整超参数优化学习率、批次大小等超参数领域自适应微调针对特定领域如医学、法律进行微调集成到RAG系统将微调后的交叉编码器集成到完整的RAG系统中8. 总结本案例展示了如何使用LlamaIndex微调交叉编码器以提高检索系统的重排序效果。通过QASPER数据集的实验我们证明了微调后的交叉编码器在Hits指标和Pairwise比较上都优于基础模型。这种方法可以应用于各种领域以提升检索系统的性能。交叉编码器微调的关键在于高质量的数据需要准备与目标领域相关的查询-文档对合适的微调策略选择适当的基础模型和超参数全面的评估使用多种评估方法来衡量模型性能通过本案例的学习您应该能够掌握交叉编码器微调的基本流程并将其应用到自己的检索系统中。