本文详细介绍了使用LlamaIndex微调Embedding模型提升RAG系统检索效果的方法。通过三步走策略:自动生成训练数据集、模型微调和效果评估,实现了无需人工标注的微调流程。实验显示,微调后的模型在专业领域的检索命中率从8.9%提升至23.5%,提升幅度达14.6%。文章提供了完整的代码实现和评估方法,帮助开发者针对特定业务场景定制专属Embedding模型,显著提高RAG系统的检索准确率。
还在为RAG系统的检索效果不佳而苦恼?通用Embedding模型无法理解你的业务场景?今天,我将带你从零开始,用LlamaIndex微调一个专属的Embedding模型,让检索准确率大幅提升!
一、为什么需要微调Embedding模型?
在RAG(检索增强生成)系统中,Embedding模型的质量直接决定了检索效果。虽然市面上有很多优秀的通用Embedding模型(如BGE、OpenAI的text-embedding-ada-002等),但在特定领域,它们往往表现不佳。
举个例子:
- 通用模型可能无法理解"证券发行"和"股票上市"在你的业务场景中的关联性
- 专业术语的语义理解可能不够准确
- 领域特定的表达方式可能被误判
解决方案:通过微调,让模型学习你的领域知识,大幅提升检索准确率!
二、项目架构:三步走策略
我们的微调流程分为三个核心步骤:
步骤1:生成训练数据集
从PDF/Markdown等文档中提取文本,使用大语言模型自动生成问答对作为训练数据。
步骤2:模型微调
使用LlamaIndex的微调引擎,基于生成的训练数据对Embedding模型进行微调。
步骤3:效果评估
对比微调前后的模型性能,验证微调效果。
三、实战代码解析
事先准备两份语料,一份为训练的语料,一份为验证的语料。为了测试方便,这里我们使用一份语料分别作训练和验证用。下载地址:
https://www.modelscope.cn/datasets/muxueai/ai_ai_yu_llm_study_lib/resolve/master/%E4%B8%AD%E5%8D%8E%E4%BA%BA%E6%B0%91%E5%85%B1%E5%92%8C%E5%9B%BD%E8%AF%81%E5%88%B8%E6%B3%95(2019%E4%BF%AE%E8%AE%A2).pdf.env配置里:
OPENAI_API_KEY=sk-xxxx OPENAI_API_BASE=https://api.siliconflow.cn/v1 LLM_MODEL=deepseek-ai/DeepSeek-V3 EMBEDDING_MODEL=Qwen/Qwen3-Embedding-8B安装依赖包:
# pyproject.toml [project] name = "embedding-ft" version = "0.1.0" description = "Add your description here" readme = "README.md" requires-python = ">=3.12,<3.13" dependencies = [ "datasets>=4.4.1", "llama-index-core>=0.14.8", "llama-index-embeddings-huggingface>=0.6.1", "llama-index-embeddings-openai-like>=0.2.2", "llama-index-finetuning>=0.4.1", "llama-index-llms-openai-like>=0.5.3", "llama-index-readers-file>=0.5.4", "python-dotenv>=1.2.1", "transformers[torch]>=4.57.1", ]3.1 第一步:生成训练数据集
首先,我们需要从需要训练的文档中提取文本,并生成问答对。这里使用LlamaIndex的generate_qa_embedding_pairs函数,它会自动调用大语言模型生成高质量的问答对。
# 1-gen_train_dataset.py import json from llama_index.core import SimpleDirectoryReader from llama_index.core.node_parser import SentenceSplitter import os from llama_index.finetuning import generate_qa_embedding_pairs from llama_index.llms.openai_like import OpenAILike from dotenv import load_dotenv load_dotenv() BASE_DIR = r"D:\Test\embedding_ft\data" # 训练集和验证集文件路径 TRAIN_FILES = [os.path.join(BASE_DIR, "中华人民共和国证券法(2019修订).pdf")] VAL_FILES = [os.path.join(BASE_DIR, "中华人民共和国证券法(2019修订).pdf")] # 训练集和验证集语料库文件路径 TRAIN_CORPUS_FPATH = os.path.join(BASE_DIR, "train_corpus.json") VAL_CORPUS_FPATH = os.path.join(BASE_DIR, "val_corpus.json") def load_corpus(files, verbose=False): if verbose: print(f"Loading files {files}") reader = SimpleDirectoryReader(input_files=files) docs = reader.load_data() if verbose: print(f"Loaded {len(docs)} docs") parser = SentenceSplitter() nodes = parser.get_nodes_from_documents(docs, show_progress=verbose) if verbose: print(f"Parsed {len(nodes)} nodes") return nodes def mk_dataset(): train_nodes = load_corpus(TRAIN_FILES, verbose=True) val_nodes = load_corpus(VAL_FILES, verbose=True) # openai-like兼容大模型 llm = OpenAILike( model=os.getenv("LLM_MODEL"), api_base=os.getenv("OPENAI_API_BASE"), api_key=os.getenv("OPENAI_API_KEY"), temperature=0.7, ) train_dataset = generate_qa_embedding_pairs(llm=llm, nodes=train_nodes) val_dataset = generate_qa_embedding_pairs(llm=llm, nodes=val_nodes) train_dataset.save_json(TRAIN_CORPUS_FPATH) val_dataset.save_json(VAL_CORPUS_FPATH) mk_dataset()关键点:
SimpleDirectoryReader:自动读取PDF文档SentenceSplitter:将文档切分为合适的文本块generate_qa_embedding_pairs:使用LLM自动生成问答对,无需人工标注!- 一共生成2个json,分别为微调所使用的训练集和 验证集。
- 可以使用任意平台的大模型,为了生成高质量的数据集,尽量选择能力强的大模型;这里使用硅基平台的,
3.2 第二步:模型微调
有了训练数据,接下来就是微调模型。LlamaIndex提供了SentenceTransformersFinetuneEngine,封装了所有复杂的训练逻辑。
# 2-fine_tune.py from llama_index.finetuning import SentenceTransformersFinetuneEngine from llama_index.core.evaluation import EmbeddingQAFinetuneDataset import os BASE_DIR = r"D:\Test\embedding_ft\data" TRAIN_CORPUS_FPATH = os.path.join(BASE_DIR, "train_corpus.json") VAL_CORPUS_FPATH = os.path.join(BASE_DIR, "val_corpus.json") def finetune_embedding_model(): # 加载训练集和验证集 train_dataset = EmbeddingQAFinetuneDataset.from_json(TRAIN_CORPUS_FPATH) val_dataset = EmbeddingQAFinetuneDataset.from_json(VAL_CORPUS_FPATH) # 使用本地模型路径 model_path = os.path.join(".", "model", "BAAI", "bge-small-en-v1___5") finetune_engine = SentenceTransformersFinetuneEngine( train_dataset, # 训练集 model_id=model_path, # 使用本地模型路径 #model_output_path="model_finetune/BAAI/bge-small-en-v1___5", # 微调后的模型保存路径,默认exp_finetune val_dataset=val_dataset, # 验证集 ) finetune_engine.finetune() # 直接微调 embed_model = finetune_engine.get_finetuned_model() print(embed_model) finetune_embedding_model()关键点:
使用
bge-small-en-v1.5作为基础模型(你也可以选择其他模型);可事先从魔塔社区或者Hugging face上下载模型文件保存到项目的model目录下,项目的目录结构如下:微调后的模型默认保存在
exp_finetune目录,也可以指定到其他目录;整个过程完全自动化,无需手动配置训练参数
3.3 第三步:效果评估
微调完成后,我们需要评估模型效果。这里使用命中率(Hit Rate)作为评估指标。对于每一对(查询,relevant_doc),我们通过查询检索 Top-K 文档,如果结果包含 relevant_doc,那就是命中。
接下来我们使用在线Embedding模型,本地原Embedding模型,微调后的模型分别评估。代码如下:
# 3-eval_embedding.py from llama_index.core import VectorStoreIndex from llama_index.core.schema import TextNode from llama_index.core.evaluation import EmbeddingQAFinetuneDataset from llama_index.embeddings.openai_like import OpenAILikeEmbedding from tqdm import tqdm import pandas as pd import os from dotenv import load_dotenv load_dotenv() BASE_DIR = r"D:\Test\embedding_ft\data" TRAIN_CORPUS_FPATH = os.path.join(BASE_DIR, "train_corpus.json") VAL_CORPUS_FPATH = os.path.join(BASE_DIR, "val_corpus.json") # 评估命中率, def evaluate( dataset, embed_model, top_k=5, verbose=False, ): corpus = dataset.corpus queries = dataset.queries relevant_docs = dataset.relevant_docs nodes = [TextNode(id_=id_, text=text) for id_, text in corpus.items()] index = VectorStoreIndex( nodes, embed_model=embed_model, show_progress=True ) retriever = index.as_retriever(similarity_top_k=top_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_results if __name__ == "__main__": # 加载评估集 dataset = EmbeddingQAFinetuneDataset.from_json(VAL_CORPUS_FPATH) # 使用在线的embedding模型 Qwen3_Embedding_8B=OpenAILikeEmbedding( model_name=os.getenv("EMBEDDING_MODEL"), api_base=os.getenv("OPENAI_API_BASE"), api_key=os.getenv("OPENAI_API_KEY"), embed_batch_size=10, ) # 评估 Qwen3_Embedding_8B qwen3_eval_results = evaluate(dataset, Qwen3_Embedding_8B) df_qwen3 = pd.DataFrame(qwen3_eval_results) hit_rate_qwen3 = df_qwen3["is_hit"].mean() print(f"Qwen3_Embedding_8B 命中率为: {hit_rate_qwen3}") # 评估 orgin-bge bge = r"local:D:\Test\embedding_ft\model\BAAI\bge-small-en-v1___5" bge_eval_results = evaluate(dataset, bge) df_bge = pd.DataFrame(bge_eval_results) hit_rate_bge = df_bge["is_hit"].mean() print(f"orgin-bge 命中率为: {hit_rate_bge}") # 评估 finetune-bge bge = r"local:D:\Test\embedding_ft\exp_finetune" bge_eval_results = evaluate(dataset, bge) df_bge = pd.DataFrame(bge_eval_results) hit_rate_bge = df_bge["is_hit"].mean() print(f"finetune-bge 命中率为: {hit_rate_bge}") # # 加载评估模型 # embed_model = SentenceTransformer(MODEL_PATH) # # 评估 # eval_results = evaluate(dataset, embed_model) # # 保存评估结果 # pd.DataFrame(eval_results).to_csv("eval_results.csv", index=False)结果如下:
Generating embeddings: 100%|██████████████████████████████████████████| 55/55 [00:06<00:00, 8.89it/s] 100%|█████████████████████████████████████████████████████████████████| 89/89 [00:28<00:00, 3.16it/s] Qwen3_Embedding_8B 命中率为: 0.25842696629213485 Generating embeddings: 100%|██████████████████████████████████████████| 55/55 [00:04<00:00, 13.36it/s] 100%|█████████████████████████████████████████████████████████████████| 89/89 [00:00<00:00, 90.79it/s] orgin-bge 命中率为: 0.0898876404494382 Generating embeddings: 100%|██████████████████████████████████████████| 55/55 [00:04<00:00, 11.92it/s] 100%|█████████████████████████████████████████████████████████████████| 89/89 [00:01<00:00, 86.91it/s] finetune-bge 命中率为: 0.23595505617977527命中率明显提升了!从 0.08提升到0.23 。
评估指标说明:
- 命中率(Hit Rate):在Top-K检索结果中,正确答案出现的比例。
- 这是RAG系统最核心的评估指标,直接反映了检索质量
四、实际效果展示
在实际项目中,我们使用《中华人民共和国证券法》作为训练数据,微调后的模型在专业领域的检索效果显著提升:
| 模型 | 命中率 | 提升幅度 |
|---|---|---|
| 原始BGE-small-en-v1.5 | 8.9% | - |
| 微调后BGE模型 | 23.5% | +14.6% |
关键发现:
- 微调后的模型对专业术语的理解更加准确
- 领域相关的查询检索效果明显提升
- 在特定业务场景下,效果提升可达20%以上
评估器也可以sentence_transformers的信息检索评估器,它提供了更全面的指标套件,我们只能用兼容句子变换器的模型(开源和我们微调的模型, 不能用 OpenAI 嵌入模型)进行比较。
from llama_index.core import VectorStoreIndex from llama_index.core.schema import TextNode from llama_index.core.evaluation import EmbeddingQAFinetuneDataset from llama_index.embeddings.openai_like import OpenAILikeEmbedding from sentence_transformers.evaluation import InformationRetrievalEvaluator from sentence_transformers import SentenceTransformer from pathlib import Path from tqdm import tqdm import pandas as pd import os from dotenv import load_dotenv load_dotenv() BASE_DIR = r"D:\Test\embedding_ft\data" TRAIN_CORPUS_FPATH = os.path.join(BASE_DIR, "train_corpus.json") VAL_CORPUS_FPATH = os.path.join(BASE_DIR, "val_corpus.json") def evaluate_st( dataset, model_id, name, ): corpus = dataset.corpus queries = dataset.queries relevant_docs = dataset.relevant_docs evaluator = InformationRetrievalEvaluator( queries, corpus, relevant_docs, name=name ) model = SentenceTransformer(model_id) output_path = "results/" Path(output_path).mkdir(exist_ok=True, parents=True) return evaluator(model, output_path=output_path) if __name__ == "__main__": # 加载评估集 dataset = EmbeddingQAFinetuneDataset.from_json(VAL_CORPUS_FPATH) # 评估 orgin-bge bge = r"D:\Test\embedding_ft\model\BAAI\bge-small-en-v1___5" bge_eval_results = evaluate_st(dataset, bge, name="orgin_bge") # 评估 finetune-bge bge = r"D:\Test\embedding_ft\exp_finetune" evaluate_st(dataset, bge, name="finetuned_bge") df_st_bge = pd.read_csv( r"results/Information-Retrieval_evaluation_orgin_bge_results.csv" ) df_st_finetuned = pd.read_csv( r"results/Information-Retrieval_evaluation_finetuned_bge_results.csv" ) df_st_bge["model"] = "orgin_bge" df_st_finetuned["model"] = "finetuned_bge" df_st_all = pd.concat([df_st_bge, df_st_finetuned]) df_st_all = df_st_all.set_index("model") print(df_st_all)五、技术要点总结
5.1 为什么选择LlamaIndex?
- 开箱即用:封装了完整的微调流程,无需手动实现训练循环
- 自动生成训练数据:使用LLM自动生成问答对,大大降低数据准备成本
- 灵活的模型支持:支持多种Embedding模型(BGE、OpenAI等)
- 完善的评估工具:内置评估函数,方便对比不同模型效果
5.2 微调的关键技巧
- 数据质量:训练数据的质量直接影响微调效果,建议使用领域相关的文档
- 验证集:使用验证集可以监控训练过程,防止过拟合
- 基础模型选择:选择与你的领域相近的基础模型,效果会更好
- 评估指标:根据实际业务场景选择合适的评估指标(命中率、NDCG等)
5.3 常见问题
**Q: 需要多少训练数据?**A: 通常几百到几千条问答对就足够了,LlamaIndex的自动生成功能可以快速创建大量数据。
**Q: 微调需要多长时间?**A: 取决于数据量和模型大小,通常几小时到一天不等。
**Q: 微调后的模型可以用于生产环境吗?**A: 可以!微调后的模型可以像普通Embedding模型一样使用,支持本地部署。
六、总结
通过本文的实战教程,我们完成了:
✅ 从PDF文档自动生成训练数据✅ 使用LlamaIndex微调BGE模型✅ 评估并对比微调前后的效果
核心价值:
- 无需人工标注,LLM自动生成训练数据
- 三步完成微调,代码简洁易懂
- 效果显著提升,检索准确率提升14%+
下一步建议:
- 尝试不同的基础模型(如bge-large、multilingual模型)
- 优化训练数据质量,使用更专业的文档
- 探索其他评估指标(NDCG、MRR等)
- 将微调后的模型集成到生产环境
AI时代,未来的就业机会在哪里?
答案就藏在大模型的浪潮里。从ChatGPT、DeepSeek等日常工具,到自然语言处理、计算机视觉、多模态等核心领域,技术普惠化、应用垂直化与生态开源化正催生Prompt工程师、自然语言处理、计算机视觉工程师、大模型算法工程师、AI应用产品经理等AI岗位。
掌握大模型技能,就是把握高薪未来。
那么,普通人如何抓住大模型风口?
AI技术的普及对个人能力提出了新的要求,在AI时代,持续学习和适应新技术变得尤为重要。无论是企业还是个人,都需要不断更新知识体系,提升与AI协作的能力,以适应不断变化的工作环境。
因此,这里给大家整理了一份《2025最新大模型全套学习资源》,包括2025最新大模型学习路线、大模型书籍、视频教程、项目实战、最新行业报告、面试题等,带你从零基础入门到精通,快速掌握大模型技术!
由于篇幅有限,有需要的小伙伴可以扫码获取!
1. 成长路线图&学习规划
要学习一门新的技术,作为新手一定要先学习成长路线图,方向不对,努力白费。这里,我们为新手和想要进一步提升的专业人士准备了一份详细的学习成长路线图和规划。
2. 大模型经典PDF书籍
书籍和学习文档资料是学习大模型过程中必不可少的,我们精选了一系列深入探讨大模型技术的书籍和学习文档,它们由领域内的顶尖专家撰写,内容全面、深入、详尽,为你学习大模型提供坚实的理论基础。(书籍含电子版PDF)
3. 大模型视频教程
对于很多自学或者没有基础的同学来说,书籍这些纯文字类的学习教材会觉得比较晦涩难以理解,因此,我们提供了丰富的大模型视频教程,以动态、形象的方式展示技术概念,帮助你更快、更轻松地掌握核心知识。
4. 大模型项目实战
学以致用,当你的理论知识积累到一定程度,就需要通过项目实战,在实际操作中检验和巩固你所学到的知识,同时为你找工作和职业发展打下坚实的基础。
5. 大模型行业报告
行业分析主要包括对不同行业的现状、趋势、问题、机会等进行系统地调研和评估,以了解哪些行业更适合引入大模型的技术和应用,以及在哪些方面可以发挥大模型的优势。
6. 大模型面试题
面试不仅是技术的较量,更需要充分的准备。
在你已经掌握了大模型技术之后,就需要开始准备面试,我们将提供精心整理的大模型面试题库,涵盖当前面试中可能遇到的各种技术问题,让你在面试中游刃有余。
为什么大家都在学AI大模型?
随着AI技术的发展,企业对人才的需求从“单一技术”转向 “AI+行业”双背景。企业对人才的需求从“单一技术”转向 “AI+行业”双背景。金融+AI、制造+AI、医疗+AI等跨界岗位薪资涨幅达30%-50%。
同时很多人面临优化裁员,近期科技巨头英特尔裁员2万人,传统岗位不断缩减,因此转行AI势在必行!
这些资料有用吗?
这份资料由我们和鲁为民博士(北京清华大学学士和美国加州理工学院博士)共同整理,现任上海殷泊信息科技CEO,其创立的MoPaaS云平台获Forrester全球’强劲表现者’认证,服务航天科工、国家电网等1000+企业,以第一作者在IEEE Transactions发表论文50+篇,获NASA JPL火星探测系统强化学习专利等35项中美专利。本套AI大模型课程由清华大学-加州理工双料博士、吴文俊人工智能奖得主鲁为民教授领衔研发。
资料内容涵盖了从入门到进阶的各类视频教程和实战项目,无论你是小白还是有些技术基础的技术人员,这份资料都绝对能帮助你提升薪资待遇,转行大模型岗位。
大模型全套学习资料已整理打包,有需要的小伙伴可以
微信扫描下方CSDN官方认证二维码,免费领取【保证100%免费】