要怎么制作网站,郑州专业网站建设,网站建设教学改进,麻章网站建设公司对于RAG而言#xff0c;2023年已经出现了很多工作#xff0c;草台班子有了一堆#xff0c;架构也初步走通#xff0c;2024年应该会围绕搜索增强做更多的优化工作。
因此我们今天来系统回顾下RAG中的模块#xff0c;包括一些架构#xff0c;文本嵌入embedding等#xff…对于RAG而言2023年已经出现了很多工作草台班子有了一堆架构也初步走通2024年应该会围绕搜索增强做更多的优化工作。
因此我们今天来系统回顾下RAG中的模块包括一些架构文本嵌入embedding等供大家一起参考。 如果你是实战派喜欢实操、技术交流的朋友文末有实战案例。 一、从RAG的整体架构及开源两阶段RAG项目说起
我们在之前的文章带你全面了解 RAG深入探讨其核心范式、关键技术及未来趋势中对Retrieval-Augmented Generation for Large Language Models: A Survey进行了介绍其对于增强大家对RAG的基本理论认知有一定的帮助。
例如该工作将RAG分成navie RAG, Advanced RAG以及Modular RAG 而另一个文章https://blog.llamaindex.ai/a-cheat-sheet-and-some-recipes-for-building-advanced-rag-803a9d94c41b又整理了个图在圈子里火了起来。
Motivation 与 Basic RAG Advanced RAG 感兴趣的可以去看看。
而最近也有开源一个涵盖到reranker阶段的RAG开源项目QAnything
QAnything (Question and Answer based on Anything) 致力于支持任意格式文件或数据库的本地知识库问答系统支持PDFWord(doc/docx)PPTMarkdownEmlTXT图片jpgpng等网页链接等。 地址https://github.com/netease-youdao/QAnything
QAnything使用两阶段检索范式其提到知识库数据量大的场景下两阶段优势非常明显如果只用一阶段embedding检索随着数据量增大会出现检索退化的问题二阶段rerank重排后能实现准确率稳定增长即数据越多效果越好。
二、再看RAG中的embedding模型
本周也出现了一些新的文本嵌入模型和RAG项目例如NetEase Youdao开源了其嵌入项目BCEmbedding以及问答系统QAnything。
EmbeddingModel用于生成语义向量在语义搜索和问答中起着关键作用EmbeddingModel支持中文和英文。
EmbeddingModel通常用于粗排因为其可以预先对文本进行向量表示并预先建立索引在真实场景下只需要检索计算相似度即可很快速并且各个文本计算相似度可以
from BCEmbedding import EmbeddingModel# list of sentences
sentences [sentence_0, sentence_1, ...]# init embedding model
model EmbeddingModel(model_name_or_pathmaidalun1020/bce-embedding-base_v1)# extract embeddingsembeddings model.encode(sentences)不过EmbeddingModel并为考虑文本之间的交互并且不同的场景下相似度阈值并不好控制。
1、BCEmbedding
BCEmbedding(BCEmbedding: Bilingual and Crosslingual Embedding for RAG)是由网易有道开发的双语和跨语种语义表征算法模型库其中包含EmbeddingModel和RerankerModel两类基础模型。
实际上与此相对应的更早的模型有智源开放的BGE模型。 地址https://github.com/netease-youdao/BCEmbedding
2、BGEEmbedding
BGEEmbedding是一个通用向量模型基于retroma 对模型进行预训练再用对比学习在大规模成对数据上训练模型地址https://github.com/FlagOpen/FlagEmbedding/tree/master/FlagEmbedding/baai_general_embedding 3、效果对比
可以在https://github.com/netease-youdao/BCEmbedding中找到embedding侧的对比结果。
其采用基于MTEB的语义表征评估基准https://github.com/embeddings-benchmark/mteb。 二、再看带有prompt的向量化embedding
知乎文章《https://zhuanlan.zhihu.com/p/661867062》针对这块有了个不错的总结【感兴趣的可以进一步看看】其提到在大模型微调这块有个hard prompt tuning的方式在进行多任务微调的时候给不同的任务的input前边都加入固定模式的文字让模型学会看到某一段文字之后就知道要做什么任务了有助于提高下游不同任务的效果。 举一反三都是语言模型当然也可以在向量化模型上用这个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展示了通过指令适应新检索任务的可行性。 2、instructor
我们在之前的文章《引入任务Instruction指令的句子向量化方案Instructor的实现思路及训练数据集构造方案》(https://mp.weixin.qq.com/s/qIh07eU8_lYL2gBVzTFzKA)** 中有介绍到instructor的方案其在每个query上加上了指令信息并一次来计算对比学习loss 这种思路引入了适配特定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进行微调得到更好的嵌入表示。 具体思路上用了两步提示策略首先提示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如下 例如使用BGE模型时源代码可以为
from sentence_transformers import SentenceTransformer
queries [query_1, query_2]
passages [样例文档-1, 样例文档-2]
instruction 为这个句子生成表示以用于检索相关文章model SentenceTransformer(BAAI/bge-large-zh-v1.5)
q_embeddings model.encode([instructionq for q in queries], normalize_embeddingsTrue)
p_embeddings model.encode(passages, normalize_embeddingsTrue)
scores q_embeddings p_embeddings.T在具体实现上BGE2根据LLM的反馈进行微调支持大型语言模型的检索增强需求包括知识检索、记忆检索、示例检索和工具检索在具体实现上在6个任务上进行了微调:问题回答、对话搜索、长对话、长文本建模、上下文学习和工具学习。 对应的prompt如下
INSTRUCTIONS {qa: {query: Represent this query for retrieving relevant documents: ,key: Represent this document for retrieval: ,},icl: {query: Convert this example into vector to look for useful examples: ,key: Convert this example into vector for retrieval: ,},chat: {query: Embed this dialogue to find useful historical dialogues: ,key: Embed this historical dialogue for retrieval: ,},lrlm: {query: Embed this text chunk for finding useful historical chunks: ,key: Embed this historical text chunk for retrieval: ,},tool: {query: Transform this user request for fetching helpful tool descriptions: ,key: Transform this tool description for retrieval: },convsearch: {query: Encode this query and context for searching relevant passages: ,key: Encode this passage for retrieval: ,},
}其在具体实现上很有意思重点在于基于大语言模型反馈的奖励机制、知识蒸馏的稳定化以及明确指示的多任务微调。具体的
在基于大语言模型反馈的奖励机制方面
LLM的期望输出表示为检索候选表示为候选的奖励表示为|由以下方程导出 表示期望输出的第个标记而LLM(|)表示在给定上下文的情况下LLM生成的可能性。换句话说如果一个检索候选导致期望输出的生成可能性更高那么将分配更高的奖励。
对于问答任务奖励计算为在给定一个单一候选段落的情况下生成答案的可能性对于指令调整任务奖励计算为在给定一个候选示例的情况下生成指定的输出的可能性。对于生成任务奖励计算为在给定一个候选历史块的情况下生成新内容的可能性。不过LLM奖励不适用于会话搜索和工具学习数据集因为在这些情况下没有对LLM输出的明确期望。
在损失函数方面使用对比学习的损失函数 在知识蒸馏方面通过最小化使用LLM的奖励计算的候选样本分布与由嵌入模型预测的分布之间的差距来提高模型性能通过计算KL散度以减小LLM的奖励的波动对蒸馏的负面影响 最后在训练数据方面 三、最后看关于RerankerModel精排模型
交叉编码器将对查询和答案实时计算相关性分数这比向量模型(即双编码器)更准确但比向量模型更耗时。因此它可以用来对嵌入模型返回的前k个文档重新排序。
不同于向量模型需要输出向量直接文本对输出相似度(因为交叉编码器在句子层面的任务上表现非常好但它存在一个“致命”缺点交交叉编码器不产生句子嵌入这个嵌入没有绝对意义)排序准确度更高可用于对向量召回结果的重新排序提升最终结果的相关性。 在技术实现上Query-Passage paire组成的正负样例一块送入模型训练目标是正样例的logits score大于batch内的负样例。 也就是说其通过句子对及表征其语义相似程度的基本事实标签可能是离散的类别标签或者是连续性的相似度数值来进行有监督训练。
这块的实现可以参考https://github.com/luyug/Reranker/tree/main
from BCEmbedding import RerankerModel
# your query and corresponding passages
query input_query
passages [passage_0, passage_1, ...]# init reranker model
model RerankerModel(model_name_or_pathmaidalun1020/bce-reranker-base_v1)# method 1: rerank passages
rerank_results model.rerank(query, passages)但是很现实的是交叉编码器在实际应用中的速度很慢所以通常都是作为精排出现关于rerank精排这块的对比实验可以查看《Agents大模型外挂检索优化》(https://zhuanlan.zhihu.com/p/657653570)有些结论很有意思
bge-reRank模型虽然是一个rank模型但其的score值还是较好的稳定在一个取值范围业务场景中可在自己的测评数据上找到的一个不错的score值来解决不应该召回的情况。
使用reRank可显著提升检索效果前提还是bge-reranker-large效果比较好。笔者对比阿里的通用reRank模型效果比检索还差了。
检索的候选多了效果上限会提高但ReRank效果可能会下降。
通过domain数据finetune可进一步提升检索效果为业务指标提升展现了一条康庄大道。
而进一步的在训练数据方面常用的数据包括
T2rankinghttps://huggingface.co/datasets/THUIR/T2Ranking
MMmarcohttps://github.com/unicamp-dl/mMARCO
dulreaderhttps://github.com/baidu/DuReader
Cmedqa-v2https://github.com/zhangsheng93/cMedQA2
nli-zhhttps://huggingface.co/datasets/shibing624/nli_zh
msmarcohttps://huggingface.co/datasets/sentence-transformers/embedding-training-data
nqhttps://huggingface.co/datasets/sentence-transformers/embedding-training-data
hotpotqahttps://huggingface.co/datasets/sentence-transformers/embedding-training-data
NLIhttps://github.com/princeton-nlp/SimCSE
Mr.TyDihttps://github.com/castorini/mr.tydi
1、youdao RerankerModel
RerankerModel擅长优化语义搜索结果和语义相关顺序精排支持中文英文日文和韩文。
地址https://github.com/netease-youdao/BCEmbedding
2、BGE Reranker
FlagEmbedding(https://github.com/FlagOpen/FlagEmbedding/)在检索增强llm领域做了许多开源工作Reranker Model也是其中的一个重点其在在多语言数据上训练了交叉编码器。 地址https://huggingface.co/BAAI/bge-reranker-large
3、模型对比效果
模型评测方面使用llamaindex进行测试可以从https://github.com/netease-youdao/BCEmbedding中找到对应的评测结果如下表所示 当然具体的数值还可以参考《Boosting RAG: Picking the Best Embedding Reranker models(https://blog.llamaindex.ai/boosting-rag-picking-the-best-embedding-reranker-models-42d079022e83)
总结
本文主要介绍了RAG系统中的一些有趣的话题包括从RAG的整体架构及开源两阶段RAG项目、带有prompt的向量化embedding、关于RerankerModel精排模型这些都在2024年开年这一周出现了很多有趣的工作。
搜索增强在24年会有很多工作大家可以多跟进。
通俗易懂讲解大模型系列 用通俗易懂的方式讲解在 Langchain 中建立一个多模态的 RAG 管道 用通俗易懂的方式讲解大模型 RAG 在 LangChain 中的应用实战 用通俗易懂的方式讲解一文讲清大模型 RAG 技术全流程 用通俗易懂的方式讲解如何提升大模型 Agent 的能力? 用通俗易懂的方式讲解使用 Mistral-7B 和 Langchain 搭建基于PDF文件的聊天机器人 用通俗易懂的方式讲解ChatGPT 开放的多模态的DALL-E 3功能好玩到停不下来 用通俗易懂的方式讲解结合检索和重排序模型改善大模型 RAG 效果明显 用通俗易懂的方式讲解基于扩散模型Diffusion,文生图 AnyText 的效果太棒了 用通俗易懂的方式讲解在 CPU 服务器上部署 ChatGLM3-6B 模型 用通俗易懂的方式讲解ChatGLM3-6B 功能原理解析 用通俗易懂的方式讲解使用 LangChain 和大模型生成海报文案 用通俗易懂的方式讲解一个强大的 LLM 微调工具 LLaMA Factory 用通俗易懂的方式讲解ChatGLM3-6B 部署指南 用通俗易懂的方式讲解LangChain Agent 原理解析 用通俗易懂的方式讲解HugggingFace 推理 API、推理端点和推理空间使用详解 用通俗易懂的方式讲解使用 LangChain 封装自定义的 LLM太棒了 用通俗易懂的方式讲解使用 FastChat 部署 LLM 的体验太爽了 用通俗易懂的方式讲解基于 Langchain 和 ChatChat 部署本地知识库问答系统 用通俗易懂的方式讲解使用 Docker 部署大模型的训练环境 用通俗易懂的方式讲解在 Ubuntu 22 上安装 CUDA、Nvidia 显卡驱动、PyTorch等大模型基础环境 用通俗易懂的方式讲解Llama2 部署讲解及试用方式 用通俗易懂的方式讲解LangChain 知识库检索常见问题及解决方案 用通俗易懂的方式讲解基于 LangChain 和 ChatGLM2 打造自有知识库问答系统 用通俗易懂的方式讲解代码大模型盘点及优劣分析 用通俗易懂的方式讲解Prompt 提示词在开发中的使用 用通俗易懂的方式讲解万字长文带你入门大模型
技术交流
技术要学会分享、交流不建议闭门造车。一个人可以走的很快、一堆人可以走的更远。
相关资料、数据、技术交流提升均可加我们的交流群获取群友已超过2000人添加时最好的备注方式为来源兴趣方向方便找到志同道合的朋友。 方式①、添加微信号mlc2060备注来自CSDN 技术交流 方式②、微信搜索公众号机器学习社区后台回复加群 参考文献
1、https://www.datagrand.com/blog/技术干货如何训练高性能语义表示模型-交叉.html
2、https://zhuanlan.zhihu.com/p/661867062
3、https://www.sbert.net/examples/applications/retrieve_rerank/README.html
4、https://blog.llamaindex.ai/a-cheat-sheet-and-some-recipes-for-building-advanced-rag-803a9d94c41b