当前位置:   article > 正文

大模型RAG问答技术架构及核心模块回顾:从Embedding、prompt-embedding到Reranker

大模型 range

来自:老刘说NLP

回顾这一周,我们主要围绕模型缝合RAG召回阶段的embedding优化,并由此延伸的关于instruction任务数据集的一些数据增强开源工作,这些工作都是微调RAG展开。

而对于RAG而言,23年已经出现了很多工作,草台班子有了一堆,架构也初步走通,24年应该会围绕搜索增强做更多的优化工作,因此我们今天来系统回顾下RAG中的模块,包括一些架构,文本嵌入embedding等,供大家一起参考。

一、从RAG的整体架构及开源两阶段RAG项目说起

我们在之前的文章《也读大模型RAG问答技术综述及评估思路:兼看UHGEval幻觉评估数据集的构建细节》(https://mp.weixin.qq.com/s/PiTWDht3rOTwXE2vN5p6PQ)中对《Retrieval-Augmented Generation for Large Language Models: A Survey》(https://arxiv.org/pdf/2312.10997) 进行了介绍,其对于增强大家对RAG的基本理论认知有一定的帮助。

例如,该工作将RAG分成navie RAG, Advanced RAG以及Modular RAG,

4bc6c21ac7f4e008318b6e3d9019c732.png

而另一个文章:https://blog.llamaindex.ai/a-cheat-sheet-and-some-recipes-for-building-advanced-rag-803a9d94c41b又整理了个图,在圈子里火了起来。

Motivation 与 Basic RAG

2db5324929a7418c1f0aebfd7f4a2a60.png

Advanced RAG

a5b5806cdefa896c37aaaba68fc22306.png1d13731a8267ef75ef6d1f28d6f55009.png

感兴趣的可以去看看,而最近也有开源一个涵盖到reranker阶段的RAG开源项目QAnything

QAnything (Question and Answer based on Anything) 致力于支持任意格式文件或数据库的本地知识库问答系统,支持PDF,Word(doc/docx),PPT,Markdown,Eml,TXT,图片(jpg,png等),网页链接等。

5fc646456df7bbb0deb0071b63c80d58.png

地址:https://github.com/netease-youdao/QAnything

QAnything使用两阶段检索范式,其提到,知识库数据量大的场景下两阶段优势非常明显,如果只用一阶段embedding检索,随着数据量增大会出现检索退化的问题,二阶段rerank重排后能实现准确率稳定增长,即数据越多,效果越好。

二、再看RAG中的embedding模型

本周,也出现了一些新的文本嵌入模型和RAG项目,例如NetEase Youdao开源了其嵌入项目BCEmbedding以及问答系统QAnything。

EmbeddingModel用于生成语义向量,在语义搜索和问答中起着关键作用,EmbeddingModel支持中文和英文。

EmbeddingModel通常用于粗排,因为其可以预先对文本进行向量表示,并预先建立索引,在真实场景下只需要检索计算相似度即可,很快速,并且各个文本计算相似度可以

  1. from BCEmbedding import EmbeddingModel
  2. # list of sentences
  3. sentences = ['sentence_0''sentence_1', ...]
  4. # init embedding model
  5. model = EmbeddingModel(model_name_or_path="maidalun1020/bce-embedding-base_v1")
  6. # extract embeddings
  7. embeddings = model.encode(sentences)

不过EmbeddingModel并为考虑文本之间的交互,并且不同的场景下,相似度阈值并不好控制。

1、BCEmbedding

BCEmbedding(BCEmbedding: Bilingual and Crosslingual Embedding for RAG)是由网易有道开发的双语和跨语种语义表征算法模型库,其中包含EmbeddingModel和RerankerModel两类基础模型。

实际上,与此相对应的更早的模型,有智源开放的BGE模型。

4d44c758e9331751d6c72bb7f4674d66.png

地址:https://github.com/netease-youdao/BCEmbedding

2、BGEEmbedding

BGEEmbedding是一个通用向量模型,基于retroma 对模型进行预训练,再用对比学习在大规模成对数据上训练模型,地址:https://github.com/FlagOpen/FlagEmbedding/tree/master/FlagEmbedding/baai_general_embedding

c979db4c2ef9aa8fd8cc6c91055584bf.png

3、效果对比

可以在https://github.com/netease-youdao/BCEmbedding中找到embedding侧的对比结果。

其采用基于MTEB的语义表征评估基准(https://github.com/embeddings-benchmark/mteb)。

b574595200754a5f8abeaf7511dc458a.png

二、再看带有prompt的向量化embedding

知乎文章《https://zhuanlan.zhihu.com/p/661867062》针对这块有了个不错的总结【感兴趣的可以进一步看看】,其提到,在大模型微调这块,有个hard prompt tuning的方式,在进行多任务微调的时候,给不同的任务的input前边都加入固定模式的文字,让模型学会,看到某一段文字之后,就知道要做什么任务了,有助于提高下游不同任务的效果。

911f5a7f24c49595b5ab2b7bca50eb0c.png

举一反三,都是语言模型,当然也可以在向量化模型上用这个trick了,也就是做不同的任务时,分别给不同任务的query和key加上不同的prompt之后在做向量化,因此,母亲也出现了许多很有意思的idea。

1、TART

《Task-aware Retrieval with Instructions》(https://arxiv.org/pdf/2211.09260.pdf)是在2022年很早期的一个工作,该工作目标是利用多任务指令调整技术开发一种通用的任务感知检索系统,该系统可以按照人类编写的指令为给定查询找到最佳文档,首次大规模收集了约40个带指令的数据集(BERRI,Bank of Explicit RetRieval Instructions),并介绍了在带指令的BERRI上训练的多任务检索系统TART(TAsk-aware ReTriever),TART展示了通过指令适应新检索任务的可行性。

148d0c4bc6ac891669a07c5b9aea0828.png

2、instructor

我们在之前的文章《引入任务Instruction指令的句子向量化方案:Instructor的实现思路及训练数据集构造方案》(https://mp.weixin.qq.com/s/qIh07eU8_lYL2gBVzTFzKA)** 中有介绍到instructor的方案,其在每个query上,加上了指令信息,并一次来计算对比学习loss:

26da6d9c9d8136f0825fd485ed05648e.png

这种思路引入了适配特定instruction任务的嵌入方案,这与instruction微调美妙结合。

对应的工作《One Embedder, Any Task: Instruction-Finetuned Text Embeddings》(https://arxiv.org/abs/2212.09741)这一工作,提出了INSTRUCTOR(Instruction-based Omnifarious Representations)的思路,是一种根据任务说明计算文本嵌入的新方法:每个文本输入会与解释用例的说明(如任务和领域描述)一起进行嵌入。

在具体实现上,该工作通过构造330种不同任务的说明,并在这种多任务上对INSTRUCTOR进行了对比损失训练,这个和当前大模型的instruction tuning工作很像。

项目地址:https://instructor-embedding.github.io

3、基于合成任务优化embedding

而最近的另一个工作,《Improving Text Embeddings with Large Language Models》(https://arxiv.org/abs/2401.00368) 这一工作,利用LLM为近100种语言的文本嵌入任务生成多样化的合成数据,在合成数据上使用标准对比损失对开源模型LLM进行微调,得到更好的嵌入表示。

f278f5e70ef5e4e055de9f2a179ff30c.png

具体思路上,用了两步提示策略:首先提示LLMs对候选任务库进行头脑风暴,然后提示LLMs从任务库中生成以给定任务为条件的数据。为了涵盖各种应用场景,为每种任务类型设计了多个提示模板,并将不同模板生成的数据结合起来,以提高多样性。对于文本嵌入模型,选择微调功能强大的开源LLM,而不是BERT式的小型模型。

4、LLM Embedder

LLM-Embedder《Retrieve Anything To Augment Large Language Models》(https://arxiv.org/abs/2310.07554),也就是BGE2。其实,其在第一个版本的时候,就已经引入了instruction的思想,做向量化召回时候只将召回任务分成两类:对称检索(相似句匹配)和非对称检索(QA匹配),如果做是QA匹配,需要在Q进行向量化时候,加入前缀:“为这个句子生成表示(for s2p(short query to long passage) retrieval task, each short query should start with an instruction ),不同版本的模型对应的prompt如下:

ff2cb1e163f9c9b5e35b776e45f627bb.png

例如使用BGE模型时,源代码可以为:

  1. from sentence_transformers import SentenceTransformer
  2. queries = ['query_1''query_2']
  3. passages = ["样例文档-1""样例文档-2"]
  4. instruction = "为这个句子生成表示以用于检索相关文章:"
  5. model = SentenceTransformer('BAAI/bge-large-zh-v1.5')
  6. q_embeddings = model.encode([instruction+q for q in queries], normalize_embeddings=True)
  7. p_embeddings = model.encode(passages, normalize_embeddings=True)
  8. scores = q_embeddings @ p_embeddings.T

在具体实现上,BGE2根据LLM的反馈进行微调,支持大型语言模型的检索增强需求,包括知识检索、记忆检索、示例检索和工具检索,在具体实现上,在6个任务上进行了微调:问题回答、对话搜索、长对话、长文本建模、上下文学习和工具学习。

8ed45f7982dbf7a7f0baf8fc25965054.png

对应的prompt如下:

  1. INSTRUCTIONS = {
  2.     "qa": {
  3.         "query""Represent this query for retrieving relevant documents: ",
  4.         "key""Represent this document for retrieval: ",
  5.     },
  6.     "icl": {
  7.         "query""Convert this example into vector to look for useful examples: ",
  8.         "key""Convert this example into vector for retrieval: ",
  9.     },
  10.     "chat": {
  11.         "query""Embed this dialogue to find useful historical dialogues: ",
  12.         "key""Embed this historical dialogue for retrieval: ",
  13.     },
  14.     "lrlm": {
  15.         "query""Embed this text chunk for finding useful historical chunks: ",
  16.         "key""Embed this historical text chunk for retrieval: ",
  17.     },
  18.     "tool": {
  19.         "query""Transform this user request for fetching helpful tool descriptions: ",
  20.         "key""Transform this tool description for retrieval: "
  21.     },
  22.     "convsearch": {
  23.         "query""Encode this query and context for searching relevant passages: ",
  24.         "key""Encode this passage for retrieval: ",
  25.     },
  26. }

其在具体实现上很有意思,重点在于基于大语言模型反馈的奖励机制、知识蒸馏的稳定化以及明确指示的多任务微调。具体的:

在基于大语言模型反馈的奖励机制方面,

LLM的期望输出表示为

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/132524
推荐阅读
相关标签