大模型 RAG 终极指南:信息检索 + 文本向量化 + BGE-M3 实践全解析!

本文整理一些文本向量化(embedding)和信息检索的知识,它们是如今大模型生成文本时常用的技术 —— “增强检索生成”(RAG)—— 的基础。

img

RAG (Retrieval-Augmented Generation,检索增强生成),是一种利用信息检索(Information Retrieval) 技术增强大模型生成效果(generation)的技术。RAG 在步骤上很简单。

  1. 搭建高质量文档数据库

    • 对优质文档进行某种格式的转换(或称编码),例如基于 BERT 将文本段落转换成 数值格式的向量(这个过程称为 embedding),然后
    • 将这些 embeddings 存储到合适的数据库(例如 ES 或向量数据库);
  2. 针对用户输入进行数据库检索

    • 对用户输入的 query 进行相同的转换(embedding),然后
    • 利用最近邻等相似性算法,在文档库中寻找最相似的文本段落(与给定问题最相关的段落);
  3. 大模型生成返回给用户的内容

    • 将找到文本段落送到大模型,辅助生成最终的输出文本,返回给用户。

本文主要关注以上 1 & 2 步骤中的 embedding & retrieval 阶段。

1 信息检索(information retrieval)技术三大发展阶段

信息检索的技术发展大致可分为三个阶段:

  1. 基于统计信息关键字匹配(statistical keyword matching)

    • 是一种 sparse embedding —— embedding 向量的大部分字段都是 0;
  2. 基于深度学习模型的上下文和语义理解

    • 属于 dense embedding —— embedding 向量的大部分字段都非零;
  3. 所谓的“学习型”表示,组合上面两种的优点,称为 learned sparse embedding

    • 既有深度学习模型的上下文和语义理解能力;
    • 又具备稀疏表示的可解释性(interpretability of sparse representations)和低计算复杂度。

下面分别来看。

1.1 基于统计信息和关键词匹配(1970s-2010s

1.1.1 典型算法:TF-IDFBM25

早期信息检索系统主要是基于统计信息 + 匹配关键词,算法包括,

  • TF-IDF

    (term frequency - inverse document frequency), 1970s

  • BM25 (Best Matching), 1980s

    • based on the probabilistic retrieval framework developed in the 1970s and 1980s.
    • BM25 is a bag-of-words retrieval function that ranks a set of documents based on the query terms appearing in each document.

1.1.2 原理

分析语料库的词频和分布(term frequency and distribution), 作为评估文档的相关性(document relevance)的基础。

1.1.3 优缺点

  • 优点:方法简单,效果不错,所以使用很广泛。
  • 缺点:单纯根据词频等统计和关键字检索做判断,不理解语义。

1.2 基于深度学习和上下文语义

1.2.1 Word2Vec (Google, 2013)

2013 年,谷歌提出了 Word2Vec,

  • 首次尝试使用高维向量来表示单词,能分辨它们细微的语义差别;
  • 标志着向机器学习驱动的信息检索的转变。

1.2.2 BERT (Google, 2019)

基于 transformer 的预训练(pretrain)语言模型 BERT 的出现,彻底颠覆了传统的信息检索范式。

核心设计和优点
  1. transformer 的核心是 self-attention,

    • self-attention 能量化给定单词与句子中其他单词的关联性程度
    • 换句话说就是:能在上下文中分辨单词的含义;
  2. BERT 是双向(前向+后向)transformer,

    • 可以理解为在预训练时,每个句子正向读一遍,反向再读一遍;
    • 能更好地捕获句子的上下文语义(contextual semantics);
    • 最终输出是一个 dense vector,本质上是对语义的压缩;
  3. 基于 dense vector 描述,用最近邻算法就能对给定的 query 进行检索,强大且语义准确。

局限性:领域外(Out-of-Domain)信息检索效果差

BERT 严重依赖预训练数据集的领域知识(domain-specific knowledge), 预训练过程使 BERT 偏向于预训练数据的特征, 因此在领域外(Out-Of-Domain),例如没有见过的文本片段,表现就不行了。

解决方式之一是**fine-tune**(精调/微调),但成本相对较高, 因为准备高质量数据集的成本是很高的。

另一方面,尽管传统 sparse embedding 在词汇不匹配问题时虽然也存在挑战, 但在领域外信息检索中,它们的表现却优于 BERT。 这是因为在这类算法中,未识别的术语不是靠“学习”,而是单纯靠“匹配”。

1.3 学习型:组合前两种的优点

1.3.1 原理:传统 sparse vector 与上下文化信息的融合

  1. 先通过 BERT 等深度学习模型生成 dense embedding;
  2. 再引入额外的步骤对以上 dense embedding 进行稀疏化,得到一个 sparse embedding;

代表算法:BGE-M3。

1.3.2 与传统 sparse embedding 的区别

根据以上描述,乍一看,这种 learned sparse embedding 与传统 sparse embedding 好像没太大区别, 但实际上二者有着本质不同,这种 embedding,

  • 引入了 Token Importance Estimation;
  • 既保留了关键词搜索能力,又利用上下文信息,丰富了 embedding 的稀疏表示;
  • 能够辨别相邻或相关的 token 的重要性,即使这些 token 在文本中没有明确出现。

1.3.3 优点

  • 将稀疏表示与学习上下文结合,同时具备精确匹配和语义理解两大能力,在领域外场景有很强的泛化能力;
  • 与 dense embedding 相比更简洁,只保留了最核心的文本信息;
  • 固有的稀疏性使向量相似性搜索所需的计算资源极少;
  • 术语匹配特性还增强了可解释性,能够更精确地洞察底层的检索过程,提高了系统的透明度。

2 信息检索:三种 embedding 的对比

简单来说, vector embedding,或称向量表示,是一个单词或句子在高维向量空间中的数值表示

  • 高维空间:一个维度能代表一个特征或属性,高维意味着分辨率高,能区分细微的语义差异;
  • 数值表示:一个 embedding 一般就是一个浮点数数组,所以方便计算。

对应上一节介绍的三个主要发展阶段,常见的有三种 embedding 类型:

  1. traditional sparse embedding
  2. dense embedding
  3. learned sparse embedding

2.1 Sparse embedding (lexical matching)

  • 映射成一个高维(维度一般就是 vocabulary 空间大小)向量
  • 向量的大部分元素都是 0,非零值表明 token 在特定文档中的相对重要性,只为那些输入文本中出现过的 token 计算权重
  • 典型模型:BM25(对 TF-IDF 的改进)

非常适合关键词匹配任务(keyword-matching tasks)。

2.2 Dense embedding (e.g. BERT-based)

  • 映射到一个(相对低维)向量,所有维度都非零
  • 相比 sparse embedding 维度要低很多,例如基于 BERT 默认 1x768 维度;
  • 典型模型:BGE-v1.5

所有维度都非零,包含语义理解,信息非常丰富,因此适用于 语义搜索任务(semantic search tasks)。

Multi-vector retrieval

  • 用多个向量表示一段文本,可以看做是对 dense retrieval 的一种扩展
  • 模型:ColBERT

2.3 Learned sparse embedding

结合了传统 sparse embedding 的精确度和 dense embedding 的语义丰富性,

  • 可以通过深度学习模型“学习”相关 token 的重要性,即使是一些并未出现过的 token,
  • 生成的“学习型”稀疏表示,能有效捕捉 query 和 doc 中的关键词。

3 Embedding & retrieval 工作原理详解

这里主要介绍 BGE-M3 模型的原理。BGE-M3 建立在 BERT 之上,因此需要先回顾 BERT 的基本原理。

3.1 BERT 是如何工作的

3.1.1 理论基础

  • BERT 论文:BERT:预训练深度双向 Transformers 做语言理解(Google,2019)

  • BERT 基于 transformer,后者的核心是 self-attention

    • Transformer 是如何工作的:600 行 Python 代码实现 self-attention 和两类 Transformer(2019)
    • 什么是 GPT?Transformer 工作原理的动画展示(2024)

3.1.2 BERT dense embedding 工作流

以输入 "Milvus is a vector database built for scalable similarity search" 为例,工作过程 [2]:

img

Fig. BERT dense embedding.

img

最终生成的 dense embedding 能够捕捉单个单词的含义及其在句子中的相互关系。

理解 BERT 是如何生成 dense embedding 之后,接下来看看基于 BERT dense embedding 的信息检索是如何工作的。

3.2 基于 BERT dense embedding 的文档检索是如何工作的

有了 dense embedding 之后,针对给定文本输入检索文档就很简单了,只需要再加一个最近邻之类的算法就行。

下面是两个句子的相似度判断,原理跟文档检索是一样的:

img

Fig. Similarity score based on BERT embedding. Image source

下面看个具体的 embedding & retrieval 模型:BGE-M3。

3.3 BGE-M3(BERT-based learned sparse embedding)是如何工作的?

BGE 是一系列 embedding 模型,扩展了 BERT 的能力。BGE-M3 是目前最新的一个,3 个 M 是强调的多个 multi- 能力:

  • Multi-Functionality
  • Multi-Linguisticity
  • Multi-Granularity

3.3.1 设计 & 特点

img

3.3.2 BGE-M3 生成 learned sparse embedding 的过程

还是前面例子提到的输入,

  1. 先走 BERT dense embedding 的流程,
  2. 最后加一个 linear 层,得到 learned sparse embedding。

img

Fig. BGE-M3 learned sparse embedding. Image source

In M3-Embedding, the [CLS] embedding is used for dense retrieval, while embeddings from other tokens are used for sparse retrieval and multi-vector retrieval [3].

4 BGE-M3 实战

4.1 相似度判断(检索)

$ pip install FlagEmbedding peft sentencepiece

来自官方的代码,稍作修改:

from FlagEmbeddingimportBGEM3FlagModel

model=BGEM3FlagModel('/root/bge-m3',use_fp16=True)

queries=["What is BGE M3?",
           "Defination of BM25"]
docs=["BGE M3 is an embedding model supporting dense retrieval, lexical matching and multi-vector interaction.",
        "BM25 is a bag-of-words retrieval function that ranks a set of documents based on the query terms appearing in each document"]

query_embeddings=model.encode(queries,batch_size=12,max_length=8192,)['dense_vecs']
docs_embeddings=model.encode(docs)['dense_vecs']
similarity=query_embeddings@docs_embeddings.T
print(similarity)

这个例子是两个问题,分别去匹配两个答案,看彼此之间的相似度(四种组合),运行结果:

[[0.626  0.348 ]
 [0.3499 0.678 ]]
  • 问题 1 和答案 1 相似度是 0.6265
  • 问题 2 和答案 2 相似度是 0.678
  • 问题 1 和答案 2,以及问题 2 和答案 1,相似度只有 0.3x

符合预期。

4.2 精调(fine-tune)

精调的目的是让正样本和负样本的分数差变大。

4.2.1 官方文档

  1. fine-tune the dense embedding
  2. fine-tune all embedding function of m3 (dense, sparse and colbert)

4.2.2 训练数据格式及要求

  1. 文件为 jsonl 格式,每行一个 sample;

    • 例子:toy_train_data/toy_train_data1.jsonl
  2. 每个 sample 的格式:{"query": str, "pos": List[str], "neg":List[str]}

    • 空要写成 "neg": [""],写 "neg": [] 会报错。
    • 另外为空时试过删掉 "neg": [] 也不行,必须得留着这个字段。
    • query:用户问题;
  • pos:正样本列表,简单说就是期望给到用户的回答;不能为空,也就是说必须得有正样本;
  • neg:负样本列表,是避免给到用户的回答。

注意:

  1. 不是标准 json 格式,所以 python 直接导出一个 json 文件作为训练数据集是不行的。
  2. sample 不能分行,一个 sample 一行。

4.2.3 精调命令及参数配置

从 huggingface 或国内的 modelscope 下载 BGE-M3 模型,

$ git lfs install
$ git clone https://www.modelscope.cn/Xorbits/bge-m3.git

精调命令:

$ cat sft.sh
#!/bin/bash

num_gpus=1
output_dir=/root/bge-sft-output
model_path=/root/bge-m3
train_data=/data/share/bge-dataset
batch_size=2
query_max_len=128    # max 8192
passage_max_len=1024 # max 8192

torchrun --nproc_per_node$num_gpus\
    -m FlagEmbedding.BGE_M3.run \
    --output_dir$output_dir\
    --model_name_or_path$model_path\
    --train_data$train_data\
    --learning_rate 1e-5 \
    --fp16\
    --num_train_epochs 5 \
    --per_device_train_batch_size$batch_size\
    --dataloader_drop_last True \
    --normlized True \
    --temperature 0.02 \
    --query_max_len$query_max_len\
    --passage_max_len$passage_max_len\
    --train_group_size 2 \
    --negatives_cross_device\
    --logging_steps 10 \
    --same_task_within_batch True \
    --save_steps 10000 \
    --unified_finetuning True \
    --use_self_distill True

几个参数要特别注意下:

  1. query & doc 最大长度BGE-M3 会分别针对 query 和 doc 初始化两个 tokenizer,以上两个参数其实对应

    img

精调快慢取决于 GPU 算力、显存和参数配置,精调开始之后也会打印出预估的完成时间,还是比较准的。

4.2.4 测试精调之后的效果

还是用 4.1 的代码,稍微改一下,不要把 queries 和 docs 作为列表,而是针对每个 query 和 pos/neg 计算相似度得分。 然后针对测试集跑一下,看相似性分数是否有提升。

数据集质量可以的话,精调之后区分度肯定有提升。

4.3 CPU 运行速度优化:将模型转 onnx 格式

如果是在 CPU 上跑模型(不用 GPU), 根据之前实际的 BERT 工程经验,转成 onnx 之后能快几倍,尤其是在 Intel CPU 上 (Intel 公司做了很多优化合并到社区库了)。

但 BGE-M3 官方没有转 onnx 文档,根据第三方的库能成功(稍微改点代码,从本地加载模型),效果待验证。

5 rerank增强对 BGE-M3 的检索结果进行重排序

5.1 rerank/reranker 是什么?

rerank 的意思是“重新排序” —— 对 embedding model 检索得到的多个结果(对应多个分数), 重新计算它们的相似性分数,给出一个排名。这是一个可选模块, 用于对检索结果进行增强,把相似度最高的结果返回给用户。

5.1.1 另一种相似度模型

reranker 也是一类计算相似度的模型,例如这个列表 里的都是 rerank/reranker 模型,

  1. bge-reranker-v2-m3:与 bge-m3 配套的 reranker
  2. bge-reranker-v2-gemma:与 google gemma-2b 配套的 reranker

但它们的原理与 BGE-M3 这种 embedding model 有差异。

5.1.2 与 BGE-M3 等模型的差异:cross-encoder vs. bi-encoder

以两个句子的相似度检测为例,

img

Fig. bi-encoder embedding model vs. cross-encoder model. Image source

  • BGE-M3 属于左边那种,所谓的 bi-encoder embedding model, 简单说就是两个句子分别输入模型,得到各自的 embedding, 然后根据 embedding vector 计算相似度;
  • reranker 属于右边那种,所谓的 cross-encoder model,直接得到结果; 如果对 BERT 的工作原理比较熟悉(见 BERT paper),就会明白这其实就是 BERT 判别两个句子 (next sentense prediction, NSP)任务的延伸。

5.2 embedding 和 reranker 工作流

  1. 用户输入 query 和 doc 列表 doc1/doc2/doc3/...
  2. BGE-M3 计算相似分,返回 topN,例如 [{doc1, score1}, {doc2, score2}, {doc3, score3}],其中 score1 >= score2 >= score3
  3. reranker 接受 query 和 BGE-M3 的结果,用自己的模型重新计算 querydoc1/doc2/doc3 的相似度分数。

5.3 BGE-M3 得到相似分之后,为什么要通过 reranker 再计算一遍?

这里可能有个疑问:step 2 不是已经检索出最相关的 N 个 doc 了吗? 为什么又要进入 step3,用另外一个完全不同的模型(reranker)再计算一种相似分呢?

简单来说,embdding 和 rerank 都是 NLP 中理解给定的两个句子(或文本片段)的关系的编码技术。 再参考刚才的图,

img

Fig. bi-encoder embedding model vs. cross-encoder model. Image source

  • bi-encoder

    • 分别对两个句子进行编码,得到两个独立的 embedding,再计算相似度。
    • 速度快,准确性相对低。
  • cross-encoder

    • 同时对两个句子编码,输出一个相似度分数;也可以换句话说,把两个句子合成一个句子编码,所以两个句子是彼此依赖的

    • 速度慢,准确性高

总结起来:embedding model 计算的相似度是粗粒度的,只能算粗排; reranker 对 embedding model 得到的若干结果再进行细排; 要体会和理解这种差异,还是要看基础 paper BERT:预训练深度双向 Transformers 做语言理解(Google,2019)。

如何学习大模型 AI ?

由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。

但是具体到个人,只能说是:

“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。

这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。

我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。

我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

在这里插入图片描述

第一阶段(10天):初阶应用

该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。

  • 大模型 AI 能干什么?
  • 大模型是怎样获得「智能」的?
  • 用好 AI 的核心心法
  • 大模型应用业务架构
  • 大模型应用技术架构
  • 代码示例:向 GPT-3.5 灌入新知识
  • 提示工程的意义和核心思想
  • Prompt 典型构成
  • 指令调优方法论
  • 思维链和思维树
  • Prompt 攻击和防范

第二阶段(30天):高阶应用

该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。

  • 为什么要做 RAG
  • 搭建一个简单的 ChatPDF
  • 检索的基础概念
  • 什么是向量表示(Embeddings)
  • 向量数据库与向量检索
  • 基于向量检索的 RAG
  • 搭建 RAG 系统的扩展知识
  • 混合检索与 RAG-Fusion 简介
  • 向量模型本地部署

第三阶段(30天):模型训练

恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。

到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?

  • 为什么要做 RAG
  • 什么是模型
  • 什么是模型训练
  • 求解器 & 损失函数简介
  • 小实验2:手写一个简单的神经网络并训练它
  • 什么是训练/预训练/微调/轻量化微调
  • Transformer结构简介
  • 轻量化微调
  • 实验数据集的构建

第四阶段(20天):商业闭环

对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。

  • 硬件选型
  • 带你了解全球大模型
  • 使用国产大模型服务
  • 搭建 OpenAI 代理
  • 热身:基于阿里云 PAI 部署 Stable Diffusion
  • 在本地计算机运行大模型
  • 大模型的私有化部署
  • 基于 vLLM 部署大模型
  • 案例:如何优雅地在阿里云私有部署开源大模型
  • 部署一套开源 LLM 项目
  • 内容安全
  • 互联网信息服务算法备案

学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。

如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。

这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

在这里插入图片描述

<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
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值