【finetuning】嵌入模型微调案例分析

发布时间:2026/7/18 5:00:49
【finetuning】嵌入模型微调案例分析 1. 案例目标本案例旨在展示如何对嵌入模型进行微调以提高在特定领域金融文档的检索效果。主要目标包括使用LlamaIndex框架加载和预处理金融PDF文档利用LLM生成合成查询-文档对作为微调数据使用SentenceTransformersFinetuneEngine对开源嵌入模型进行微调评估微调后的模型与原始模型和商业模型的性能差异2. 技术栈与核心依赖LlamaIndexSentenceTransformersOpenAI GPT-3.5-turboBAAI/bge-small-enPyTorchHugging Face Transformers核心依赖库llama-index-finetuning- 提供微调引擎和数据集生成功能llama-index-embeddings-huggingface- 集成Hugging Face嵌入模型llama-index-embeddings-openai- 集成OpenAI嵌入模型llama-index-llms-openai- 集成OpenAI语言模型llama-index-readers-file- 文件读取功能datasets- 数据集处理transformers[torch]- PyTorch版本的Transformers库3. 环境配置3.1 数据准备案例使用Lyft和Uber的2021年10K财务报告作为训练和验证数据TRAIN_FILES [./data/10k/lyft_2021.pdf] VAL_FILES [./data/10k/uber_2021.pdf]3.2 API配置需要配置OpenAI API密钥用于生成合成查询import os OPENAI_API_KEY sk- os.environ[OPENAI_API_KEY] OPENAI_API_KEY3.3 基础模型使用BAAI/bge-small-en作为基础嵌入模型进行微调model_idBAAI/bge-small-en4. 案例实现4.1 数据加载与预处理使用SimpleDirectoryReader加载PDF文档并通过SentenceSplitter将文档分割为文本节点def load_corpus(files, verboseFalse): if verbose: print(fLoading files {files}) reader SimpleDirectoryReader(input_filesfiles) docs reader.load_data() if verbose: print(fLoaded {len(docs)} docs) parser SentenceSplitter() nodes parser.get_nodes_from_documents(docs, show_progressverbose) if verbose: print(fParsed {len(nodes)} nodes) return nodes4.2 合成查询生成使用gpt-3.5-turbo为每个文本节点生成相关问题创建查询-文档对from llama_index.finetuning import generate_qa_embedding_pairs from llama_index.core.evaluation import EmbeddingQAFinetuneDataset from llama_index.llms.openai import OpenAI train_dataset generate_qa_embedding_pairs( llmOpenAI(modelgpt-3.5-turbo), nodestrain_nodes, output_pathtrain_dataset.json, ) val_dataset generate_qa_embedding_pairs( llmOpenAI(modelgpt-3.5-turbo), nodesval_nodes, output_pathval_dataset.json, )4.3 模型微调使用SentenceTransformersFinetuneEngine对基础模型进行微调from llama_index.finetuning import SentenceTransformersFinetuneEngine finetune_engine SentenceTransformersFinetuneEngine( train_dataset, model_idBAAI/bge-small-en, model_output_pathtest_model, val_datasetval_dataset, ) finetune_engine.finetune() embed_model finetune_engine.get_finetuned_model()4.4 模型评估案例使用两种评估方法4.4.1 命中率(Hit Rate)评估对于每个查询-文档对检索top-k文档检查相关文档是否在结果中def evaluate( dataset, embed_model, top_k5, verboseFalse, ): corpus dataset.corpus queries dataset.queries relevant_docs dataset.relevant_docs nodes [TextNode(id_id_, texttext) for id_, text in corpus.items()] index VectorStoreIndex( nodes, embed_modelembed_model, show_progressTrue ) retriever index.as_retriever(similarity_top_ktop_k) eval_results [] for query_id, query in tqdm(queries.items()): retrieved_nodes retriever.retrieve(query) retrieved_ids [node.node.node_id for node in retrieved_nodes] expected_id relevant_docs[query_id][0] is_hit expected_id in retrieved_ids # assume 1 relevant doc eval_result { is_hit: is_hit, retrieved: retrieved_ids, expected: expected_id, query: query_id, } eval_results.append(eval_result) return eval_results4.4.2 InformationRetrievalEvaluator评估使用sentence_transformers库的InformationRetrievalEvaluator进行更全面的评估from sentence_transformers.evaluation import InformationRetrievalEvaluator from sentence_transformers import SentenceTransformer def evaluate_st( dataset, model_id, name, ): corpus dataset.corpus queries dataset.queries relevant_docs dataset.relevant_docs evaluator InformationRetrievalEvaluator( queries, corpus, relevant_docs, namename ) model SentenceTransformer(model_id) return evaluator(model, output_pathresults/)5. 案例效果评估结果案例比较了三种嵌入模型的性能OpenAI嵌入模型- 商业闭源模型BAAI/bge-small-en- 开源基础模型微调后的模型- 基于bge-small-en微调的模型在命中率评估中BAAI/bge-small-en基础模型的命中率为0.793微调后的模型显示出更高的命中率具体值在代码中计算在InformationRetrievalEvaluator评估中微调后的模型在多个指标上均优于基础模型包括Mean Average Precision (MAP)Normalized Discounted Cumulative Gain (NDCG)Precision at k (Pk)Recall at k (Rk)6. 案例实现思路6.1 数据处理流程文档加载使用LlamaIndex的SimpleDirectoryReader加载PDF文档文本分割使用SentenceSplitter将文档分割为适合处理的文本块数据集划分将Lyft文档作为训练集Uber文档作为验证集6.2 微调数据生成合成查询生成使用gpt-3.5-turbo为每个文本块生成相关问题数据集构建将(查询, 相关文档)对构建为微调数据集数据持久化将生成的数据集保存为JSON文件便于后续使用6.3 模型微调流程基础模型加载加载BAAI/bge-small-en作为基础模型微调引擎初始化使用SentenceTransformersFinetuneEngine配置微调参数模型训练在合成数据集上训练模型模型保存保存微调后的模型到本地6.4 评估策略多模型对比同时评估商业模型、开源基础模型和微调模型多指标评估使用简单命中率和全面的信息检索指标跨领域验证使用不同公司的文档进行验证测试泛化能力7. 扩展建议7.1 数据扩展增加更多行业领域的文档提高模型的泛化能力尝试不同类型的文档如新闻、研究报告、法律文件等使用人工标注的查询-文档对替代或补充合成数据7.2 模型优化尝试不同的基础模型如bge-large、e5等作为微调起点调整微调超参数学习率、批大小、训练轮数等探索适配器微调(LoRA)等参数高效微调方法7.3 评估增强增加更多评估指标如MRR、Reciprocal Rank等进行人工评估验证检索结果的相关性测试模型在长文档检索和多跳问答任务中的表现7.4 应用扩展将微调后的模型集成到RAG系统中开发基于微调模型的语义搜索应用探索在特定领域如法律、医疗的应用潜力8. 总结本案例展示了使用LlamaIndex框架对嵌入模型进行领域特定微调的完整流程。通过使用LLM生成的合成数据对开源嵌入模型进行微调显著提高了在金融文档检索任务上的性能。这种方法具有以下优势成本效益相比使用商业API微调开源模型可以降低长期使用成本领域适应通过领域特定数据微调模型能更好地理解专业术语和上下文数据隐私本地部署微调模型可以保护敏感数据可控性完全控制模型训练和部署过程便于定制和优化该案例的方法可以扩展到各种专业领域为构建高效、准确的领域特定检索系统提供了实用方案。随着开源嵌入模型的不断进步结合领域特定微调有望在更多应用场景中达到甚至超越商业模型的性能。