【必藏干货】零基础掌握Embedding模型微调,LlamaIndex让RAG效果大幅提升
本文详细介绍了使用LlamaIndex微调Embedding模型的方法,针对RAG系统检索效果不佳的问题。通过三步走策略:自动生成训练数据集、使用SentenceTransformersFinetuneEngine进行模型微调、以及使用命中率指标评估效果。实战表明,微调后的模型在专业领域的检索命中率从8.9%提升到23.5%,显著提升了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等)
- 将微调后的模型集成到生产环境
写在最后:
Embedding模型微调是提升RAG系统效果的关键技术。通过本文的实战教程,相信你已经掌握了完整的微调流程。在实际项目中,根据你的业务场景调整参数和数据,一定能获得更好的效果!
普通人如何抓住AI大模型的风口?
为什么要学AI大模型
当下,⼈⼯智能市场迎来了爆发期,并逐渐进⼊以⼈⼯通⽤智能(AGI)为主导的新时代。企业纷纷官宣“ AI+ ”战略,为新兴技术⼈才创造丰富的就业机会,⼈才缺⼝将达 400 万!
DeepSeek问世以来,生成式AI和大模型技术爆发式增长,让很多岗位重新成了炙手可热的新星,岗位薪资远超很多后端岗位,在程序员中稳居前列。

与此同时AI与各行各业深度融合,飞速发展,成为炙手可热的新风口,企业非常需要了解AI、懂AI、会用AI的员工,纷纷开出高薪招聘AI大模型相关岗位。
AI大模型开发工程师对AI大模型需要了解到什么程度呢?我们先看一下招聘需求:

知道人家要什么能力,一切就好办了!我整理了AI大模型开发工程师需要掌握的知识如下:
大模型基础知识
你得知道市面上的大模型产品生态和产品线;还要了解Llama、Qwen等开源大模型与OpenAI等闭源模型的能力差异;以及了解开源模型的二次开发优势,以及闭源模型的商业化限制,等等。

了解这些技术的目的在于建立与算法工程师的共通语言,确保能够沟通项目需求,同时具备管理AI项目进展、合理分配项目资源、把握和控制项目成本的能力。
产品经理还需要有业务sense,这其实就又回到了产品人的看家本领上。我们知道先阶段AI的局限性还非常大,模型生成的内容不理想甚至错误的情况屡见不鲜。因此AI产品经理看技术,更多的是从技术边界、成本等角度出发,选择合适的技术方案来实现需求,甚至用业务来补足技术的短板。
AI Agent
现阶段,AI Agent的发展可谓是百花齐放,甚至有人说,Agent就是未来应用该有的样子,所以这个LLM的重要分支,必须要掌握。
Agent,中文名为“智能体”,由控制端(Brain)、感知端(Perception)和行动端(Action)组成,是一种能够在特定环境中自主行动、感知环境、做出决策并与其他Agent或人类进行交互的计算机程序或实体。简单来说就是给大模型这个大脑装上“记忆”、装上“手”和“脚”,让它自动完成工作。
Agent的核心特性
自主性: 能够独立做出决策,不依赖人类的直接控制。
适应性: 能够根据环境的变化调整其行为。
交互性: 能够与人类或其他系统进行有效沟通和交互。

对于大模型开发工程师来说,学习Agent更多的是理解它的设计理念和工作方式。零代码的大模型应用开发平台也有很多,比如dify、coze,拿来做一个小项目,你就会发现,其实并不难。
AI 应用项目开发流程
如果产品形态和开发模式都和过去不一样了,那还画啥原型?怎么排项目周期?这将深刻影响产品经理这个岗位本身的价值构成,所以每个AI产品经理都必须要了解它。

看着都是新词,其实接触起来,也不难。
从0到1的大模型系统学习籽料
最近很多程序员朋友都已经学习或者准备学习 AI 大模型,后台也经常会有小伙伴咨询学习路线和学习资料,我特别拜托北京清华大学学士和美国加州理工学院博士学位的鲁为民老师(吴文俊奖得主)
给大家准备了一份涵盖了AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频 全系列的学习资料,这些学习资料不仅深入浅出,而且非常实用,让大家系统而高效地掌握AI大模型的各个知识点。

这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】
适学人群
应届毕业生: 无工作经验但想要系统学习AI大模型技术,期待通过实战项目掌握核心技术。
零基础转型: 非技术背景但关注AI应用场景,计划通过低代码工具实现“AI+行业”跨界。
业务赋能突破瓶颈: 传统开发者(Java/前端等)学习Transformer架构与LangChain框架,向AI全栈工程师转型。
AI大模型系统学习路线
在面对AI大模型开发领域的复杂与深入,精准学习显得尤为重要。一份系统的技术路线图,不仅能够帮助开发者清晰地了解从入门到精通所需掌握的知识点,还能提供一条高效、有序的学习路径。
- 基础篇,包括了大模型的基本情况,核心原理,带你认识了解大模型提示词,Transformer架构,预训练、SFT、RLHF等一些基础概念,用最易懂的方式带你入门AI大模型
- 进阶篇,你将掌握RAG,Langchain、Agent的核心原理和应用,学习如何微调大模型,让大模型更适合自己的行业需求,私有化部署大模型,让自己的数据更加安全
- 项目实战篇,会手把手一步步带着大家练习企业级落地项目,比如电商行业的智能客服、智能销售项目,教育行业的智慧校园、智能辅导项目等等

但知道是一回事,做又是另一回事,初学者最常遇到的问题主要是理论知识缺乏、资源和工具的限制、模型理解和调试的复杂性,在这基础上,找到高质量的学习资源,不浪费时间、不走弯路,又是重中之重。
AI大模型入门到实战的视频教程+项目包
看视频学习是一种高效、直观、灵活且富有吸引力的学习方式,可以更直观地展示过程,能有效提升学习兴趣和理解力,是现在获取知识的重要途径

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
海量AI大模型必读的经典书籍(PDF)
阅读AI大模型经典书籍可以帮助读者提高技术水平,开拓视野,掌握核心技术,提高解决问题的能力,同时也可以借鉴他人的经验。对于想要深入学习AI大模型开发的读者来说,阅读经典书籍是非常有必要的。
600+AI大模型报告(实时更新)
这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。
AI大模型面试真题+答案解析
我们学习AI大模型必然是想找到高薪的工作,下面这些面试题都是总结当前最新、最热、最高频的面试题,并且每道题都有详细的答案,面试前刷完这套面试题资料,小小offer,不在话下

AI时代,企业最需要的是既懂技术、又有实战经验的复合型人才,**当前人工智能岗位需求多,薪资高,前景好。**在职场里,选对赛道就能赢在起跑线。抓住AI这个风口,相信下一个人生赢家就是你!机会,永远留给有准备的人。
如何获取?
这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】

更多推荐


所有评论(0)