微信扫码
添加专属顾问
我要投稿
掌握AI时代的信息检索技术,RAG模型终极指南来袭! 核心内容: 1. RAG模型基础:信息检索与文本向量化 2. RAG工作流程:从文档编码到大模型生成 3. 信息检索技术发展:从统计匹配到深度学习模型
凡事预则立,不立则废,学习 AI 也不例外。过去,我已经分享了不少关于RAG(检索增强生成)的内容。
最近,越来越多新朋友加入,为了让大家快速上手,我特意整理了一份RAG关键知识总结,让你系统掌握信息检索、文本向量化以及 BGE-M3 embedding 的核心要点。
话不多说,干货开始!?
RAG (Retrieval-Augmented Generation,检索增强生成),是一种利用信息检索(Information Retrieval) 技术增强大模型生成效果(generation)的技术。RAG 在步骤上很简单。
embedding
),然后本文主要关注以上 1 & 2 步骤中的 embedding & retrieval 阶段。
信息检索的技术发展大致可分为三个阶段:
基于统计信息的关键字匹配(statistical keyword matching)
sparse embedding
—— embedding 向量的大部分字段都是 0;基于深度学习模型的上下文和语义理解,
dense embedding
—— embedding 向量的大部分字段都非零;所谓的“学习型”表示,组合上面两种的优点,称为 learned sparse embedding
下面分别来看。
1970s-2010s
)TF-IDF
、BM25
早期信息检索系统主要是基于统计信息 + 匹配关键词,算法包括,
BM25 (Best Matching), 1980s
probabilistic retrieval framework
developed in the 1970s and 1980s.bag-of-words
retrieval function that ranks a set of documents based on the query terms appearing in each document.分析语料库的词频和分布(term frequency and distribution), 作为评估文档的相关性(document relevance)的基础。
Word2Vec
(Google, 2013)2013 年,谷歌提出了 Word2Vec,
BERT
(Google, 2019)基于 transformer 的预训练(pretrain)语言模型 BERT 的出现,彻底颠覆了传统的信息检索范式。
BERT 严重依赖预训练数据集的领域知识(domain-specific knowledge), 预训练过程使 BERT 偏向于预训练数据的特征, 因此在领域外(Out-Of-Domain),例如没有见过的文本片段,表现就不行了。
解决方式之一是fine-tune
(精调/微调),但成本相对较高, 因为准备高质量数据集的成本是很高的。
另一方面,尽管传统 sparse embedding 在词汇不匹配问题时虽然也存在挑战, 但在领域外信息检索中,它们的表现却优于 BERT。 这是因为在这类算法中,未识别的术语不是靠“学习”,而是单纯靠“匹配”。
代表算法:BGE-M3。
根据以上描述,乍一看,这种 learned sparse embedding 与传统 sparse embedding 好像没太大区别, 但实际上二者有着本质不同,这种 embedding,
简单来说, vector embedding,或称向量表示,是一个单词或句子在高维向量空间中的数值表示。
对应上一节介绍的三个主要发展阶段,常见的有三种 embedding 类型:
非常适合关键词匹配任务(keyword-matching tasks)。
1x768
维度;所有维度都非零,包含语义理解,信息非常丰富,因此适用于 语义搜索任务(semantic search tasks)。
Multi-vector retrieval
用多个向量表示一段文本,可以看做是对 dense retrieval 的一种扩展 模型:ColBERT
结合了传统 sparse embedding 的精确度和 dense embedding 的语义丰富性,
这里主要介绍 BGE-M3 模型的原理。BGE-M3 建立在 BERT 之上,因此需要先回顾 BERT 的基本原理。
BERT
是如何工作的以输入 "Milvus is a vector database built for scalable similarity search"
为例,工作过程 [2]:
Fig. BERT dense embedding.
最终生成的 dense embedding 能够捕捉单个单词的含义及其在句子中的相互关系。
理解 BERT 是如何生成 dense embedding 之后,接下来看看基于 BERT dense embedding 的信息检索是如何工作的。
有了 dense embedding 之后,针对给定文本输入检索文档就很简单了,只需要再加一个最近邻之类的算法就行。
下面是两个句子的相似度判断,原理跟文档检索是一样的:
Fig. Similarity score based on BERT embedding. Image source
下面看个具体的 embedding & retrieval 模型:BGE-M3。
BGE-M3
(BERT-based learned sparse embedding)是如何工作的?BGE 是一系列 embedding 模型,扩展了 BERT 的能力。BGE-M3 是目前最新的一个,3 个 M 是强调的多个 multi-
能力:
还是前面例子提到的输入,
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].
$ 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 ]]
符合预期。
精调的目的是让正样本和负样本的分数差变大。
jsonl
格式,每行一个 sample;{"query": str, "pos": List[str], "neg":List[str]}
"neg": [""]
,写 "neg": []
会报错。"neg": []
也不行,必须得留着这个字段。query:用户问题;
pos:正样本列表,简单说就是期望给到用户的回答;不能为空,也就是说必须得有正样本;
neg:负样本列表,是避免给到用户的回答。
注意:
从 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
几个参数要特别注意下:
query & doc 最大长度BGE-M3 会分别针对 query 和 doc 初始化两个 tokenizer,以上两个参数其实对应
精调快慢取决于 GPU 算力、显存和参数配置,精调开始之后也会打印出预估的完成时间,还是比较准的。
还是用 4.1 的代码,稍微改一下,不要把 queries 和 docs 作为列表,而是针对每个 query 和 pos/neg 计算相似度得分。 然后针对测试集跑一下,看相似性分数是否有提升。
数据集质量可以的话,精调之后区分度肯定有提升。
如果是在 CPU 上跑模型(不用 GPU), 根据之前实际的 BERT 工程经验,转成 onnx 之后能快几倍,尤其是在 Intel CPU 上 (Intel 公司做了很多优化合并到社区库了)。
但 BGE-M3 官方没有转 onnx 文档,根据第三方的库能成功(稍微改点代码,从本地加载模型),效果待验证。
rerank
增强对 BGE-M3 的检索结果进行重排序rerank/reranker
是什么?rerank 的意思是“重新排序” —— 对 embedding model 检索得到的多个结果(对应多个分数), 重新计算它们的相似性分数,给出一个排名。这是一个可选模块, 用于对检索结果进行增强,把相似度最高的结果返回给用户。
reranker 也是一类计算相似度的模型,例如这个列表 里的都是 rerank/reranker 模型,
但它们的原理与 BGE-M3 这种 embedding model
有差异。
cross-encoder vs. bi-encoder
以两个句子的相似度检测为例,
Fig. bi-encoder embedding model vs. cross-encoder model. Image source
bi-encoder embedding model
, 简单说就是两个句子分别输入模型,得到各自的 embedding
, 然后根据 embedding vector 计算相似度;cross-encoder model
,直接得到结果; 如果对 BERT 的工作原理比较熟悉(见 BERT paper),就会明白这其实就是 BERT 判别两个句子 (next sentense prediction, NSP)任务的延伸。query
和 doc 列表 doc1/doc2/doc3/...
,[{doc1, score1}, {doc2, score2}, {doc3, score3}]
,其中 score1 >= score2 >= score3
,query
和 BGE-M3 的结果,用自己的模型重新计算 query
和 doc1/doc2/doc3
的相似度分数。这里可能有个疑问:step 2 不是已经检索出最相关的 N 个 doc 了吗? 为什么又要进入 step3,用另外一个完全不同的模型(reranker)再计算一种相似分呢?
简单来说,embdding 和 rerank 都是 NLP 中理解给定的两个句子(或文本片段)的关系的编码技术。 再参考刚才的图,
Fig. bi-encoder embedding model vs. cross-encoder model. Image source
cross-encoder
总结起来:embedding model 计算的相似度是粗粒度的,只能算粗排; reranker 对 embedding model 得到的若干结果再进行细排; 要体会和理解这种差异,还是要看基础 paper BERT:预训练深度双向 Transformers 做语言理解(Google,2019)。
本文整理了一些 BGE-M3 相关的 RAG 知识
53AI,企业落地大模型首选服务商
产品:场景落地咨询+大模型应用平台+行业解决方案
承诺:免费场景POC验证,效果验证后签署服务协议。零风险落地应用大模型,已交付160+中大型企业
2024-10-27
2024-09-04
2024-07-18
2024-05-05
2024-06-20
2024-06-13
2024-07-09
2024-07-09
2024-05-19
2024-07-07