finetune-embedding
用LLM合成数据微调专属Embedding,零人工标注显著提升RAG检索精度
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
用LLM合成数据微调专属Embedding,零人工标注显著提升RAG检索精度
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
想象这样一个场景:你的公司积累了大量内部文档(财务报告、技术手册、客服记录),你希望AI能够精准回答「我们Q3的研发投入占比是多少」这类涉及具体数字的检索问题。然而,开箱即用的通用Embedding模型往往在垂直领域表现平平——它能把「苹果」和「水果」关联起来,却可能无法区分「你的苹果账号」和「早餐水果盘」。
LlamaIndex团队(后发展为run-llama组织)早在2023年就直面这个问题,并给出了令人惊喜的答案:用大模型自己生成训练数据,再微调专属Embedding模型。他们在金融PDF文档上的实验显示,经过微调的模型检索Hit Rate从基线的52%提升到了令人印象深刻的水平。
Embedding(向量嵌入)是将文本转化为数学向量的技术,是RAG(检索增强生成)系统的核心组件。主流做法是直接调用OpenAI的text-embedding-ada-002,或者使用开源的BAAI/bge-small-en等预训练模型。这些通用模型在通用语料上表现不错,但一旦进入垂直领域——医疗、法律、金融——就会出现「语义漂移」问题:模型分不清「资产负债表」在金融语境和日常语境中的差异。
图1:run-llama 组织
传统解法是让人工标注员为每个领域手写「问题-答案对」作为训练数据,但这需要大量人力投入,且标注质量参差不齐。run-llama项目另辟蹊径:既然大模型已经理解了语义关系,为什么不让它来生成训练数据?
这个思路非常巧妙。传统数据生成是正向的(文档→人类提问),项目将其反过来:给模型一段文本,让它自己推断「什么样的问题最适合用这段话来回答」。
具体流程是:
这种方法的优势在于:完全不需要人工标注,且生成的数据天然与目标领域对齐。你甚至可以生成训练集和验证集,分别用于训练和调参。
图2:BAAI(FlagAlpha)团队开源的BGE系列Embedding模型
项目选择BAAI/bge-small-en作为基座模型(22M参数,384维向量),通过sentence-transformers库进行微调。关键配置:
整个微调流程通过finetune.ipynb notebook呈现,代码非常简洁:
from sentence_transformers import SentenceTransformer, InputExample, losses
from torch.utils.data import DataLoader
model = SentenceTransformer('BAAI/bge-small-en')
train_examples = [InputExample(texts=[q, pos_doc]) for q, pos_doc in train_pairs]
train_loader = DataLoader(train_examples, shuffle=True, batch_size=10)
loss = losses.MultipleNegativesRankingLoss(model=model)
model.fit(train_objectives=[(train_loader, loss)], epochs=3)
3行核心代码即可完成Embedding微调,这正是sentence-transformers库的设计哲学——让复杂的NLP训练变得触手可及。
evaluate.ipynb提供了完整的评估框架,同时对比三个候选者:
| 模型 | 特点 |
|---|---|
| OpenAI text-embedding-ada-002 | 商业方案,效果好但有API成本和隐私顾虑 |
| BAAI/bge-small-en(基座) | 开源轻量,但领域适配不足 |
| 微调后Embedding | 开源+垂直领域优化 |
评估采用两种指标:
项目在results/目录下保留了CSV格式的评估结果,方便后续分析和复现。
项目采用纯Notebook驱动的架构,而非传统Python包:
finetune-embedding/
├── generate_dataset.ipynb # 合成数据生成
├── finetune.ipynb # 模型微调训练
├── evaluate.ipynb # 多模型横向对比评估
├── requirements.txt # 依赖声明
├── exp_finetune/ # 训练好的模型权重(BGE-base微调版)
└── data/ # 合成训练/验证数据集
依赖极简:只有llama-index(用于读取PDF和构建索引)和sentence-transformers(微调框架)。值得注意的是,虽然README标注项目已过时(功能已合并入LlamaIndex主库),但作为教学素材仍然极具价值——三步流程清晰,每一步都有完整代码和数据可复现。
安装部署只需三步:
git clone git@github.com:jerryjliu/llama_index
git clone git@github.com:run-llama/finetune-embedding.git
cd finetune-embedding && pip install -r requirements.txt
然后用jupyter lab打开三个notebook依次运行即可。README注明「notebook很轻量,在任何机器上都能跑」,但这是针对推理阶段;如果你要进行微调训练,建议配备GPU(至少8GB显存)以加速收敛。
需要注意的是,项目依赖的llama-index==0.8.5.post2和sentence-transformers==2.2.2版本较旧(2023年),新版LlamaIndex已大幅重构,直接用最新版本可能会遇到API不兼容的问题。建议在虚拟环境中运行。
然而作为思路启蒙价值巨大:它教会我们「用AI训练AI」的范式,对于资源有限但希望在垂直领域深耕的团队具有重要参考意义。
run-llama项目代表了RAG领域的一个重要趋势:从追求通用大模型转向追求领域适配的小模型。2023年之后,BGE、MTEB等开源评测基准的兴起,进一步推动了这一趋势。今天,Embedding微调已经成为RAG系统优化的标准手段之一。
而这个项目作为该领域的早期实践者,即使代码已不再维护,其核心理念——「合成数据+轻量微调」——仍然影响着无数后续项目。它证明了:
如果你对RAG系统优化感兴趣,这个项目是理解Embedding微调逻辑的绝佳起点。