BGE向量和重排模型架构和训练细节

模型论文:https://arxiv.org/pdf/2309.07597
模型数据:https://data.baai.ac.cn/details/BAAI-MTP

BGE的embedding模型是一个表征模型,对pair对文本分别建模成向量,再通过余弦相似度得到向量之间相似度。表征模型适合在离线场景构建索引。
相对的,Reranker模型是交互型模型,将pair对文本共同作为模型输入直接得到相似度,文本之间可以得到更好的特征交互,效果更显著。

向量模型

训练数据

在这里插入图片描述

无标签数据有标签数据组成。
无标签数据使用了悟道等数据集,有标签数据使用了dureader等数据集。
都是文本对,对于无标签数据还使用Text2Vec-Chinese过滤掉得分低于0.43的pair。
有标签数据直接来自于下游任务的标注数据集,包括DuReader、mMARCO、NLI-Zh等,涵盖retrieval、ranking、similarity comparison等任务。
在这里插入图片描述
在这里插入图片描述

模型训练

在这里插入图片描述BGE是一个类BERT的模型。
是一个三阶段的训练过程。

1.Pre-Training

使用纯文本的悟道语料,不是文本对。目的是得到更强大的表征能力。做法是采用RetroMAE的训练策略:先对text X进行随机Mask,然后进行encoding,再额外训练一个light-weight decoder(如单层transformer)进行重构。通过这一过程,强迫encoder学习到良好的embedding。作者认为,解码器结构简单,只有单层transformer,而且输入句子的掩码率很高,会使得解码变得具有挑战性,可以迫使生成高质量的句子嵌入,以便可以以良好的保真度恢复原始输入。在这里插入图片描述

2.general-purpose fine-tuning

预训练模型通过对 C-MTP(无标签)进行对比学习进行微调,以区分配对文本与其负样本。

对比学习的一个关键因素是负样本。没有特意挖掘难负样本,而是纯粹依赖批内负样本,并借助大批次(高达 19,200)来提高嵌入的区分性。

3.Task-specific fine-tuning

BGE适合各种类型的任务,如检索、摘要等等。它们包含的任务类型各异,可能会相互影响。
为了将通用的也能在各类任务中有优异表现,采用了以下两个方法:

  1. 基于指令的微调: 输入数据会被区分,以帮助模型适应不同任务。对于每个文本对 (p,
    q),会在查询侧附加一个特定任务的指令。指令是一个言语提示,明确了任务的性质,例如“为这个句子生成表示以用于检索相关文章:”。
  2. 负样本更新:除了批内负样本,每个文本对 (p, q) 还会挖掘一个难负样本 q’。难负样本从任务的原始语料库中挖掘,遵循了ANN
    风格的采样策略。难负样本通常与目标文本相似,但并不匹配,从而增加了模型的训练难度,提升了模型的区分能力。

自定义微调

官方提供了挖掘难负样本的脚本,是从query召回的top2-100中随机抽取,正样本是top1。
构造好数据集后,就可以继续做特定任务上的微调了。
https://github.com/FlagOpen/FlagEmbedding/tree/master/examples/finetune
也可以使用llama_index微调,可以参考我的http://t.csdnimg.cn/EYs91

微调在 Embeding 模型和 Reranker 模型上使用同类型的数据集,并将语义相关性任务视为二分类任务。使用二分类交叉熵损失(BCE)来训练模型,使其能够在语义相关性任务中区分正负样本。

参考:
1.https://zhuanlan.zhihu.com/p/690856333
2.https://zhuanlan.zhihu.com/p/669596130
3.https://zhuanlan.zhihu.com/p/670277586
4.https://zhuanlan.zhihu.com/p/578747792

重排模型

HNSW的近似搜索引入随机性,导致Top-K结果可能包含不够相关的文档且排序不准确,因此需要重排以确保返回的K个文档按相关性正确排序。

文本片段与 query 的相似性和文本片段是否包含 query 的答案(相关性)是两回事。LLM 输入 token 是有限制,所以必须把能回答 query 问题的片段(和问题最相关)给 LLM。

检索

Embedding 也可以给出一个得分,但是这个得分描述的更多的是相似性。Embedding 本质上是一个双编码器,两个文本在模型内部没有任何信息交互。只在最后计算两个向量的余弦相似度时才进行唯一一次交互。所以 Embedding 检索只能把最相似的文本片段给你,没有能力来判断候选文本和 query 之间的相关性。但是相似又不等于相关。

在这里插入图片描述

排序

Rerank 本质是一个 Cross-Encoder 的模型。Cross-Encoder 能让两个文本片段一开始就在 BERT 模型各层中通过 self-attention 进行交互。它能够用 self-attention 判断出来这个 query 中的重点在于大连医科大学,而不是怎么样?。所以,如下图所示,大连医科大学怎么样?这个 query 和大连医科大学创建于 1947 年… 更相关。

在这里插入图片描述
cross-encoder 需要实时计算两个文本块的相关度,如果候选文本有几万条,每一条都需要和 query 一起送进 BERT 模型中算一遍,需要实时算几万次。这个成本是非常巨大的。

参考:https://mp.weixin.qq.com/s/jo1TsJGx_cVVNpJEqSbgUQ

<think>好的,用户想了解如何搭建DeepSeek加上BGE-M3,以及选择什么样的向量数据库。首先,我需要确认这两个组件的具体所指。DeepSeek可能是指深度求索公司开发的大模型,比如DeepSeek-R1或者他们的其他模型。而BGE-M3是北京智源研究院发布的BAAI General Embedding-M3,这是一个支持多语言、多模态、多粒度的文本嵌入模型,适合作为检索模型的嵌入层。 用户的需求可能是构建一个结合了大模型高效检索的RAG(检索增强生成)系统。需要先明确步骤:首先加载微调BGE-M3模型,将其作为文本编码器生成嵌入向量;然后选择合适的向量数据库存储检索这些向量;接着将检索结果输入到DeepSeek大模型中进行生成;最后整合整个流程并优化性能。 在选择向量数据库时,用户可能需要考虑几个因素:数据规模、查询性能、扩展性、社区支持易用性。常见的选项包括FAISS、Milvus、Pinecone、Chroma等。需要根据具体需求分析每个数据库的优缺点,比如FAISS适合中小规模数据,而Milvus适合分布式大规模场景。用户可能需要处理高并发的查询,或者需要低延迟,这些都会影响选择。 接下来,用户可能对如何具体部署集成这些组件有疑问。例如,如何将BGE-M3生成的向量存入数据库,如何设计检索逻辑,以及如何将结果传递给DeepSeek模型。可能需要代码示例或者步骤说明,比如使用Hugging Face Transformers加载模型,生成嵌入,然后用向量数据库的SDK进行存储查询。 另外,用户可能关心是否需要微调BGE-M3以适应特定领域的数据,或者如何优化检索的准确性速度。比如,调整嵌入模型的参数,或者对向量数据库进行索引配置,比如使用HNSW算法。 最后,需要考虑整个系统的架构设计,比如是否需要分布式部署,如何处理高可用性,以及监控维护方面的问题。可能需要建议一些最佳实践,比如定期更新嵌入模型、监控数据库性能、进行负载测试等。 总结来说,用户需要一个从模型准备、数据库选择到系统搭建的完整指南,可能需要分步骤详细说明,并针对不同场景推荐合适的工具配置。同时,要注意可能遇到的挑战,如模型兼容性、数据库性能调优、系统延迟等,并提供解决方案或参考资源。</think>搭建 **DeepSeek + BGE-M3** 的组合主要用于构建高效的检索增强生成(RAG)系统,结合大语言模型(DeepSeek)的生成能力嵌入模型BGE-M3)的语义检索能力。以下是关键步骤向量数据库选择建议: --- ### **一、搭建流程概述** #### 1. **模型准备** - **BGE-M3**(Embedding 模型) 作用:将文本转换为高维向量,支持多语言、多模态、多粒度检索。 使用方式: - 通过 Hugging Face 直接加载模型: ```python from transformers import AutoModel, AutoTokenizer model = AutoModel.from_pretrained("BAAI/bge-m3") tokenizer = AutoTokenizer.from_pretrained("BAAI/bge-m3") ``` - 输入文本生成向量: ```python inputs = tokenizer(texts, padding=True, return_tensors="pt") embeddings = model(**inputs).last_hidden_state.mean(dim=1) ``` - **DeepSeek**(生成模型) 作用:基于检索结果生成高质量回答。 使用方式: - 通过 API 调用(如 DeepSeek-API)或本地部署模型: ```python from transformers import AutoModelForCausalLM, AutoTokenizer model = AutoModelForCausalLM.from_pretrained("deepseek-ai/deepseek-llm-7b") tokenizer = AutoTokenizer.from_pretrained("deepseek-ai/deepseek-llm-7b") ``` #### 2. **向量数据库选择** 根据场景需求选择数据库: | 数据库 | 特点 | 适用场景 | |--------------|----------------------------------------------------------------------|-----------------------------| | **FAISS** | 轻量级、内存计算,适合中小规模数据;无需服务化部署。 | 本地快速验证、小规模应用 | | **Milvus** | 分布式、高扩展性,支持海量数据;提供 RESTful API SDK。 | 企业级生产环境、高并发场景 | | **Pinecone** | 全托管云服务,自动管理索引扩展;低运维成本。 | 云原生应用、快速搭建 | | **Chroma** | 轻量级、易集成,适合简单应用;支持本地内存模式。 | 原型开发、小规模实验 | **推荐组合**: - **快速验证**:BGE-M3 + FAISS/Chroma - **生产环境**:BGE-M3 + Milvus/Pinecone #### 3. **系统集成流程** 1. **数据预处理**:将文档切分(chunking),使用 BGE-M3 生成向量。 2. **向量入库**:将向量元数据存入数据库(如 Milvus)。 3. **检索逻辑**:用户提问时,用 BGE-M3 编码问题,检索 Top-K 相关文档。 4. **生成回答**:将检索结果作为上下文,输入 DeepSeek 生成最终答案。 ```python # 示例代码框架 query = "用户问题" query_embedding = bge_m3.encode(query) # 生成查询向量 results = vector_db.search(query_embedding, top_k=5) # 检索 context = "\n".join(results) answer = deepseek.generate(f"基于以下上下文回答:{context}\n问题:{query}") ``` --- ### **二、关键优化点** 1. **Embedding 模型调优**: - 对 BGE-M3 进行领域适配微调(如使用 LoRA)。 - 调整文本分块策略(chunk size overlap)。 2. **检索增强策略**: - 混合检索:结合语义向量 + 关键词(BM25)提升召回率。 - 重排序(Rerank):对检索结果二次排序(如使用 BGE-M3 的 colbert 重排)。 3. **向量数据库配置**: - 索引类型:HNSW(高精度)或 IVF(快速检索)。 - 分片与副本:分布式部署提高吞吐量(Milvus 支持)。 --- ### **三、部署建议** - **轻量级方案**:Docker 部署 Milvus + FastAPI 封装服务。 - **云原生方案**:AWS/GCP 上使用 Pinecone + 异步调用 DeepSeek API。 - **性能监控**:跟踪检索延迟(P99)、召回率(Recall@K)生成质量(ROUGE)。 --- ### **四、常见问题** - **延迟高**:优化索引参数(如 HNSW 的 `ef_search`)、使用 GPU 加速 Embedding。 - **数据更新**:支持增量更新索引(Milvus 支持动态数据插入)。 - **多模态支持**:BGE-M3 可扩展为图像/文本混合检索(需适配多模态编码)。 通过合理选择工具链优化流程,可以构建高性能的 DeepSeek + BGE-M3 RAG 系统。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

灵海之森

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值