【finetuning】交叉编码器微调案例 📅 发布时间:2026/7/15 4:42:56 👁️ 浏览次数: 本案例演示如何使用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比较上都优于基础模型。这种方法可以应用于各种领域以提升检索系统的性能。交叉编码器微调的关键在于高质量的数据需要准备与目标领域相关的查询-文档对合适的微调策略选择适当的基础模型和超参数全面的评估使用多种评估方法来衡量模型性能通过本案例的学习您应该能够掌握交叉编码器微调的基本流程并将其应用到自己的检索系统中。
微服务学习 --- Spring Cloud概述 目录 1.认识微服务 1.1 单体架构 1.2 集群和分布式架构 1.3 微服务架构 1.4 微服务带来的优势与挑战 2.微服务解决方案 - Spring Cloud 2.1 什么是Spring Cloud 2.2 Spring Cloud版本 2.3 Spring Cloud实现方案 3.小结 从这篇文章开始,我将开始介绍微服务… 2026/7/15 4:42:56
Windows下Obsidian多版本共存实战:mklink+AppData精细化管理 1. 为什么需要在一台电脑上装多个 Obsidian 版本?这真不是折腾,而是刚需Obsidian 不是普通软件,它本质是一个本地优先的知识操作系统。你用它写笔记、搭知识库、做项目管理、甚至当轻量级 IDE,不同场景对版本的要求天差地别。我见… 2026/7/15 4:40:54
解决macOS上C++程序因SIGKILL信号被终止的完整方案 1. 项目概述:当CPH扩展在macOS上遭遇SIGKILL如果你是一名在macOS上使用Visual Studio Code的C开发者,并且安装了像“Competitive Programming Helper (CPH)”这类能一键编译运行代码的扩展,那么你很可能遇到过这个令人抓狂的场景:… 2026/7/15 4:40:54
Qt跨平台开发实战:从环境搭建到部署优化的完整指南 1. 项目概述:为什么选择Qt进行C跨平台开发?如果你是一名C开发者,正在寻找一个既能构建漂亮界面,又能轻松实现跨平台部署的框架,那么Qt几乎是一个绕不开的名字。我接触Qt已经超过十年,从早期的桌面工具开发&… 2026/7/15 6:49:46
MSP430FR21xx/FR2000超低功耗MCU实战:FRAM存储与功耗优化详解 1. 项目概述在电池供电的嵌入式世界里,功耗就是生命线。无论是挂在树上的环境监测节点,还是藏在门框里的门窗传感器,亦或是戴在手腕上的健身手环,它们的共同使命就是在有限的电池容量下,尽可能长久地工作。作为这些设备… 2026/7/15 6:49:46
Diablo Edit2:重新定义暗黑破坏神2的角色构建体验 Diablo Edit2:重新定义暗黑破坏神2的角色构建体验 【免费下载链接】diablo_edit Diablo II Character editor. 项目地址: https://gitcode.com/gh_mirrors/di/diablo_edit 你是否曾为暗黑破坏神2中某个build的失败而感到沮丧?是否因为技能点分配不… 2026/7/15 6:45:44
基于深度学习的端到端声音事件检测与定位系统实战 最近在开发智能家居或安防系统时,很多开发者会遇到一个看似简单却颇为棘手的问题:如何准确识别和定位特定声音事件,比如房间里的"跺脚声"?传统的解决方案要么成本高昂,要么准确率不尽如人意。本文将深入探讨… 2026/7/15 6:43:43
Python字符串格式化全解析:从%占位符到f-string的演进与实战 1. Python字符串格式化的前世今生 第一次接触Python字符串格式化时,我被各种百分号和花括号搞得晕头转向。后来在实际项目中踩过不少坑才明白,Python的字符串格式化其实经历了三个重要的演进阶段:从最早的%操作符,到更灵活的forma… 2026/7/15 6:39:42
[AI] 这周最值得继续追的 3 个 AI / Dify 热点,到底哪一个最可能先落地? 这段时间 AI 相关信息实在太多了。 每天打开资讯流,你都会看到类似内容: 新模型发布了 智能体又火了 工作流自动化又出了新玩法 企业助手、知识库、周报生成、评审助手、内部 AI 平台,几乎每个方向都有人在做 问题是: 大多数团队根本没有精力把所有热点都跟一遍。 所以真正… 2026/7/15 6:35:40
行星减速机的工作原理是什么?从齿轮运动关系到减速比计算 一、行星齿轮机构的组成 标准行星齿轮机构主要包括: 太阳轮; 行星轮; 内齿圈; 行星架。 太阳轮位于机构中心。 多个行星轮围绕太阳轮均匀布置,行星轮内侧与太阳轮外啮合,外侧与内齿圈内啮合。 行星轮通过轴… 2026/7/15 0:03:00
阅读Java开源框架源码的心得分享! 前几日闲来无事有幸看到了一位博主分享自己阅读开源框架源码的心得,看了之后也引发了我的一些深度思考。我们为什么要看源码?我们该怎么样去看源码? 其中前者那位博主描述的我觉得很全了(如下图所示),就不做… 2026/7/15 0:03:00
【LINUX】驱动 【LINUX驱动】【字符设备】【中断】【Platform】【网课 设备树】【GPIO】【PINCTRL】【INPUT】【IIC】【SPI】【网络驱动】【屏幕驱动】【一 设备树】【二 内核模块编译】【三 基本驱动框架】【四 Platform总线设备驱动框架】【五 驱动子系统】【六 综合】 2026/7/15 0:07:01
Git reset 与 revert 深度对比:5个关键差异与 3 种典型应用场景 Git Reset 与 Revert 深度对比:5个关键差异与3种典型应用场景在团队协作开发中,代码版本管理如同行走钢丝——一步失误可能导致整个项目陷入混乱。作为Git进阶用户,你是否曾在深夜面对错误的提交束手无策?是否在强制推送后收到同事… 2026/7/13 8:31:55
GitHub 学生包申请避坑:5个常见失败原因与开发者工具调试方案 GitHub 学生包申请技术排障指南:5个高频失败场景与开发者工具实战方案第一次尝试申请GitHub学生包时,我盯着屏幕上那个不断转圈的加载动画整整15分钟,最终只等来了一行冰冷的错误提示。这可能是许多开发者共同的经历——明明按照教程操作&… 2026/7/14 18:25:04
冒烟测试用例设计规范:5%-10%覆盖率下的3类核心场景与执行标准 冒烟测试用例设计的黄金法则:5%-10%覆盖率下的精准筛选策略在快节奏的敏捷开发环境中,冒烟测试作为质量保障的第一道防线,其重要性不言而喻。当测试资源有限而时间紧迫时,如何从海量测试用例中精准筛选出那关键的5%-10%࿰… 2026/7/14 5:09:41