7天精通密集检索:FlagEmbedding实战指南
你是否还在为文本检索效率低而烦恼?是否想快速掌握最先进的密集检索技术?本文将带你通过7天系统学习,从入门到精通FlagEmbedding,轻松构建高效的检索系统。读完本文,你将能够:
- 理解密集检索的核心原理与应用场景
- 熟练使用BGE系列模型进行文本嵌入与重排序
- 掌握模型微调与评估的关键技巧
- 构建基于FlagEmbedding的端到端RAG系统
项目概述
FlagEmbedding是一个专注于检索增强LLM领域的一站式工具包,由BAAI(北京人工智能研究院)开发。该项目提供了从嵌入模型(Embedder)、重排序模型(Reranker)到微调、评估的完整解决方案,广泛应用于信息检索、问答系统、推荐系统等场景。
FlagEmbedding的核心优势包括:
- 高性能:BGE系列模型在MTEB和C-MTEB等权威榜单上持续领先
- 多语言支持:覆盖100+种语言,特别优化中文处理能力
- 多功能:支持稠密检索、稀疏检索、多向量检索等多种检索方式
- 易用性:提供简洁API和详细教程,降低使用门槛
官方文档:README_zh.md
7天学习路径
第1天:环境搭建与基础概念
环境准备
首先,我们需要安装FlagEmbedding。根据是否需要微调功能,可选择不同的安装方式:
# 仅使用推理功能
pip install -U FlagEmbedding
# 需要微调功能
pip install -U FlagEmbedding[finetune]
如果需要从源码安装,可以执行:
git clone https://gitcode.com/GitHub_Trending/fl/FlagEmbedding
cd FlagEmbedding
pip install . # 仅推理
# 或 pip install .[finetune] # 含微调依赖
核心概念
密集检索(Dense Retrieval)是一种将文本转换为低维稠密向量,通过向量相似度计算实现文本匹配的技术。相比传统的稀疏检索方法(如TF-IDF),密集检索能更好地捕捉文本语义信息,在相关性匹配任务上表现更优。
FlagEmbedding主要包含两大核心组件:
- 嵌入模型(Embedder):将文本转换为固定长度的向量表示
- 重排序模型(Reranker):对初步检索结果进行精细排序,提升结果质量
第2天:嵌入模型基础与应用
快速上手
使用BGE嵌入模型非常简单,以下是一个基本示例:
from FlagEmbedding import FlagModel
# 加载模型
model = FlagModel('BAAI/bge-base-en-v1.5',
query_instruction_for_retrieval="Represent this sentence for searching relevant passages:",
use_fp16=True)
# 文本编码
sentences = ["I love NLP", "I love machine learning"]
embeddings = model.encode(sentences)
# 计算相似度
similarity = embeddings[0] @ embeddings[1].T
print(similarity)
模型选择
BGE提供了多种规格的嵌入模型,适用于不同场景:
| 模型名称 | 语言 | 描述 | 推荐指令 |
|---|---|---|---|
| BAAI/bge-large-en-v1.5 | 英文 | 1.5版本,相似度分布更加合理 | Represent this sentence for searching relevant passages: |
| BAAI/bge-large-zh-v1.5 | 中文 | 1.5版本,相似度分布更加合理 | 为这个句子生成表示以用于检索相关文章: |
| BAAI/bge-m3 | 多语言 | 多功能、多语言、多粒度(最大长度8192) | - |
详细的模型列表和使用方法可参考:嵌入模型示例
第3天:重排序模型与检索优化
嵌入模型能快速返回Top-K候选结果,但精度有限。重排序模型(Reranker)可以对这些候选结果进行精细排序,进一步提升检索质量。
重排序模型使用示例
from FlagEmbedding import FlagReranker
# 加载重排序模型
reranker = FlagReranker('BAAI/bge-reranker-base', use_fp16=True)
# 计算查询与候选文本的相关性分数
query = "Who is the father of deep learning?"
candidates = [
"Geoffrey Hinton is a British-Canadian cognitive psychologist and computer scientist.",
"Yann LeCun is a French computer scientist working primarily in the fields of machine learning, computer vision, mobile robotics, and computational neuroscience.",
"Andrew Ng is a British-American computer scientist and businessman focusing on machine learning and artificial intelligence."
]
scores = reranker.compute_score([[query, candidate] for candidate in candidates])
print(scores) # 分数越高,相关性越强
BGE提供了多个重排序模型,包括:
- bge-reranker-large:高精度,适合对结果质量要求高的场景
- bge-reranker-base:平衡精度与速度
- bge-reranker-v2-m3:轻量级,多语言支持
详细示例可参考:重排序模型示例
第4天:密集检索实战
下面我们通过一个完整示例,展示如何使用FlagEmbedding构建一个简单但高效的检索系统。
步骤1:准备数据
corpus = [
"Michael Jackson was a legendary pop icon known for his record-breaking music and dance innovations.",
"Fei-Fei Li is a professor in Stanford University, revolutionized computer vision with the ImageNet project.",
"Brad Pitt is a versatile actor and producer known for his roles in films like 'Fight Club' and 'Once Upon a Time in Hollywood.'",
"Geoffrey Hinton, as a foundational figure in AI, received Turing Award for his contribution in deep learning.",
"Eminem is a renowned rapper and one of the best-selling music artists of all time.",
"Taylor Swift is a Grammy-winning singer-songwriter known for her narrative-driven music.",
"Sam Altman leads OpenAI as its CEO, with astonishing works of GPT series and pursuing safe and beneficial AI.",
"Morgan Freeman is an acclaimed actor famous for his distinctive voice and diverse roles.",
"Andrew Ng spread AI knowledge globally via public courses on Coursera and Stanford University.",
"Robert Downey Jr. is an iconic actor best known for playing Iron Man in the Marvel Cinematic Universe.",
]
query = "Who could be an expert of neural network?"
步骤2:文本向量化
from FlagEmbedding import FlagModel
# 加载嵌入模型
model = FlagModel('BAAI/bge-base-en-v1.5',
query_instruction_for_retrieval="Represent this sentence for searching relevant passages:",
use_fp16=True)
# 计算嵌入向量
corpus_embeddings = model.encode(corpus)
query_embedding = model.encode(query)
步骤3:计算相似度并排序
# 计算余弦相似度
similarity_scores = query_embedding @ corpus_embeddings.T
# 按相似度排序
sorted_indices = sorted(range(len(similarity_scores)), key=lambda k: similarity_scores[k], reverse=True)
# 输出结果
for i in sorted_indices[:3]:
print(f"Score: {similarity_scores[i]:.4f}, Text: {corpus[i]}")
步骤4:使用重排序模型优化结果
from FlagEmbedding import FlagReranker
reranker = FlagReranker('BAAI/bge-reranker-base', use_fp16=True)
# 准备待重排序的文本对
pairs = [[query, corpus[i]] for i in sorted_indices[:5]] # 取Top-5结果进行重排序
# 计算相关性分数
rerank_scores = reranker.compute_score(pairs)
# 结合原始分数和重排序分数得到最终结果
final_scores = [0.3 * similarity_scores[i] + 0.7 * rerank_scores[j]
for j, i in enumerate(sorted_indices[:5])]
final_ranking = [sorted_indices[:5][j] for j in sorted(range(5), key=lambda k: final_scores[k], reverse=True)]
# 输出优化后的结果
for i in final_ranking[:3]:
print(f"Final Score: {final_scores[sorted_indices[:5].index(i)]:.4f}, Text: {corpus[i]}")
完整示例代码可参考:快速入门教程
第5天:模型微调
当预训练模型不能满足特定领域需求时,我们需要对模型进行微调。FlagEmbedding提供了便捷的微调工具,支持嵌入模型和重排序模型的微调。
嵌入模型微调步骤
- 数据准备:准备格式如下的训练数据
{"query": "查询文本", "pos": ["相关文本1", "相关文本2"], "neg": ["不相关文本1", "不相关文本2"]}
-
配置文件:创建训练配置文件,如
ds_stage1.json -
开始微调:
python -m FlagEmbedding.finetune.embedder.run \
--output_dir ./output \
--model_name_or_path BAAI/bge-base-en-v1.5 \
--train_data ./train_data.jsonl \
--learning_rate 2e-5 \
--num_train_epochs 3 \
--per_device_train_batch_size 32 \
--gradient_accumulation_steps 1 \
--logging_steps 10 \
--save_steps 100 \
--fp16 \
--dataloader_num_workers 2 \
--dataset_cache_dir ./cache \
--disable_tqdm False
详细的微调教程和示例代码可参考:
第6天:模型评估
评估是衡量模型性能的关键步骤。FlagEmbedding提供了丰富的评估工具,支持多种标准数据集和评估指标。
常用评估指标
- MRR (Mean Reciprocal Rank):衡量第一个相关结果的排名位置
- NDCG (Normalized Discounted Cumulative Gain):评估排序质量
- MAP (Mean Average Precision):综合考虑所有相关结果的排名
评估示例
以MSMARCO数据集为例,评估嵌入模型性能:
cd examples/evaluation/msmarco
bash eval_msmarco.sh
评估结果将包含MRR@10、Recall@100等指标,帮助你全面了解模型性能。
支持的评估数据集包括:
第7天:构建RAG系统
检索增强生成(RAG)是将检索技术与大语言模型结合的有效方法,能显著提升LLM的知识准确性和时效性。下面我们将构建一个基于FlagEmbedding的简单RAG系统。
RAG系统架构
构建步骤
- 文档预处理:
from FlagEmbedding import FlagModel
import numpy as np
# 加载文档
documents = [...] # 你的文档集合
# 文档分块
chunk_size = 512
chunks = []
for doc in documents:
for i in range(0, len(doc), chunk_size):
chunks.append(doc[i:i+chunk_size])
# 生成文档嵌入
model = FlagModel('BAAI/bge-base-zh-v1.5', use_fp16=True)
chunk_embeddings = model.encode(chunks)
- 检索模块:
def retrieve(query, top_k=5):
query_embedding = model.encode(query)
similarities = np.dot(query_embedding, chunk_embeddings.T)
top_indices = similarities.argsort()[-top_k:][::-1]
return [chunks[i] for i in top_indices]
- 生成模块:
from transformers import AutoTokenizer, AutoModelForCausalLM
# 加载LLM模型
tokenizer = AutoTokenizer.from_pretrained("your-llm-model")
llm_model = AutoModelForCausalLM.from_pretrained("your-llm-model")
def generate_answer(query, context):
prompt = f"基于以下信息回答问题:\n{context}\n问题:{query}\n回答:"
inputs = tokenizer(prompt, return_tensors="pt")
outputs = llm_model.generate(**inputs, max_new_tokens=200)
return tokenizer.decode(outputs[0], skip_special_tokens=True)
# RAG流程
def rag_pipeline(query):
context = "\n".join(retrieve(query))
answer = generate_answer(query, context)
return answer
- 系统评估与优化:通过用户反馈和自动评估不断优化系统性能
详细的RAG教程可参考:RAG教程
学习资源与进阶
官方教程
FlagEmbedding提供了全面的教程,覆盖从基础到高级的各种主题:
常见问题
-
Q: 如何选择合适的模型?
-
A: 对于英文场景,推荐使用
bge-base-en-v1.5;对于中文场景,推荐使用bge-base-zh-v1.5;多语言场景使用bge-m3。如果对速度要求高,可选择small版本;对精度要求高,可选择large版本。 -
Q: 如何处理长文本?
-
A: 可使用
bge-m3模型,支持最长8192 tokens的输入;或对长文本进行分块处理,再进行检索。
更多常见问题请参考:FAQ
社区交流
欢迎加入BGE技术交流群,与开发者和用户交流经验:
总结与展望
通过7天的学习,我们从基础概念到实际应用,全面掌握了FlagEmbedding的核心功能。从文本嵌入、重排序到模型微调、RAG系统构建,FlagEmbedding提供了一站式解决方案,帮助我们快速构建高性能的检索系统。
未来,FlagEmbedding将持续迭代,推出更强大的模型和更便捷的工具。我们可以期待:
- 更高效的长文本处理能力
- 更强的多模态检索支持
- 与LLM更深度的融合
现在,是时候动手实践了!克隆项目仓库,开始你的密集检索之旅吧:
git clone https://gitcode.com/GitHub_Trending/fl/FlagEmbedding
cd FlagEmbedding
pip install .[finetune]
祝你的检索系统构建之路顺利!如果觉得本教程对你有帮助,欢迎点赞、收藏、关注,获取更多FlagEmbedding的使用技巧和最佳实践。
参考资料
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考






