大家早上好!我是 Louis-Francois,Towards AI 的联合创始人兼 CTO,今天我们将深入探讨可能是目前最好的检索增强生成(RAG)堆栈 —— 感谢 Wang 等人(2024)的精彩研究。这项研究为构建最优的 RAG 系统提供了宝贵的见解,我在这里为你解析其中的奥秘。
那么,什么才是真正顶级的 RAG 系统呢?当然是它的组件!我们来看看这些最佳组件及其工作方式,这样你也可以打造顶级的 RAG 系统,最后还有一个多模态的彩蛋。
查询分类
Query Classification
我们先从 查询分类 开始。并非所有查询都需要检索 —— 因为大语言模型有时已经知道答案。例如,如果你问“梅西是谁?”大语言模型就已经可以回答你了,不需要检索!
Wang 等人创建了 15 个任务类别,确定查询是否提供了足够的信息,或者是否需要检索。他们训练了一个二分类器来区分任务,标注“足够”的任务为无需检索,标注“不足够”的任务为需要检索。在这张图片中,黄色表示不需要检索,红色表示需要去检索一些文档!
分块处理
Chunking
接下来是 分块处理。这里的挑战在于为你的数据找到最佳的分块大小。太长了?你会增加不必要的噪声和成本。太短了?你会错过上下文信息。
Wang 等人发现,分块大小在 256 到 512 个 token 之间效果最佳。但请记住,这取决于数据类型——因此务必运行你的评估!专业提示:使用 small2big(搜索时从小块开始,然后生成时使用较大块),或者尝试 滑动窗口 以在分块之间重叠 token。
元数据和混合搜索
Metadata & Hybrid Search
利用你的元数据!添加标题、关键词,甚至是假设性问题。然后配合 混合搜索,它结合了向量搜索(用于语义匹配)和经典的 BM25 关键字搜索,你的系统将会表现得非常出色。
HyDE(生成伪文档以增强检索)虽然很酷,结果也更好,但效率极低。目前还是坚持使用混合搜索吧——它在平衡性能上更佳,尤其适合原型设计。
嵌入模型
Embedding Model
选择合适的 嵌入模型 就像找到一双合适的鞋子。你不会穿足球鞋去打网球。FlagEmbedding 的 LLM-Embedder 是本研究中最适合的——在性能和尺寸之间取得了良好的平衡。不大也不小——正好合适。
注意,他们只测试了开源模型,所以 Cohere 和 OpenAI 的模型不在考虑范围内。否则的话,Cohere 可能是你的最佳选择。
向量数据库
Vector Database
现在来看看数据库。对于长期使用,Milvus 是他们首选的向量数据库。它是开源的,可靠性强,是保持你的检索系统顺畅运行的绝佳选择。我还在下面的描述中提供了链接。
查询转换
Query Transformation
在检索之前,你必须先 转换 用户的查询!无论是通过 查询重写 以提高清晰度,还是 查询分解 将复杂问题拆解为更小的问题,并对每个子问题进行检索,甚至是生成伪文档(如 HyDE 所做的那样)并在检索过程中使用它们——这一步对提高准确性至关重要。请记住,更多的转换会增加延迟,特别是 HyDE。
重排
Reranking
现在我们来谈谈 重排。一旦你检索到了文档,你需要确保最相关的文档排在最前面,这就是重排的作用。
在这项研究中,monoT5 是在性能和效率之间表现最好的选项。它微调了 T5 模型,根据文档与查询的相关性重新排序,确保最佳匹配结果排在首位。RankLLaMA 整体性能最佳,但 TILDEv2 速度最快。如果你感兴趣,论文中有更多相关信息。
文档重新打包
Document Repacking
在重新排序之后,你需要进行一些 文档重新打包 。Wang 等人推荐使用“逆向”方法,即将文档按相关性升序排列。 Liu 等人 (2024) 发现这种将相关信息放在开头或结尾的方法可以提升性能。重新打包优化了在重新排序过程之后,信息如何呈现给大语言模型,以帮助模型更好地理解提供的信息顺序,而不是仅仅依据理论上的相关性顺序。
总结
Summarization
然后,在调用大语言模型之前,你需要通过 总结 来去除冗余信息。发送给大语言模型的长提示代价高昂且往往不必要。总结可以帮助删除冗余或不必要的信息,进而减少成本。
你可以使用像 Recomp 这样的工具进行抽取式压缩来选择有用的句子,或通过生成式压缩来整合多个文档中的信息。但是,如果速度是你的优先考虑因素,你可以考虑跳过这一步。
微调生成器
Fine-tuning the Generator
最后,是否应该为你使用的 生成 大语言模型进行微调?绝对应该!用相关和随机文档的混合数据进行微调可以提升生成器处理无关信息的能力。这使模型更加健壮,并有助于提供更好的整体回复。尽管论文中没有提供确切的比例,但结果非常明确:微调是值得的!当然,这也取决于你的具体领域。
多模态
Multimodalities
处理图片时?实现 多模态 检索。对于文本到图片的任务,查询数据库中的相似图片可以加快过程。在图片到文本的任务中,匹配相似图片可以检索到准确的、预存的描述。关键在于根植于真实且经过验证的信息。
结论
简而言之,Wang 等人的这篇论文为我们提供了构建高效 RAG 系统的可靠蓝图。不过请记住,这只是一篇论文,未涵盖 RAG 流水线的所有方面。例如,论文并未探索检索器与生成器的联合训练,而这可能释放更多潜力。此外,论文也未深入探讨由于成本问题而未研究的分块技术,但这是一个值得探索的方向。
我强烈推荐查看完整论文以获取更多信息。
一如既往,感谢阅读。如果你觉得这次解析有帮助,或有任何意见,请在评论区告诉我,我们下次见!
参考文献
Building LLMs for Production: https://amzn.to/4bqYU9b
Wang 等人,2024 (论文参考): https://arxiv.org/abs/2407.01219
LLM-Embedder (嵌入模型): https://github.com/FlagOpen/FlagEmbedding/tree/master/FlagEmbedding/llm_embedder
Milvus (向量数据库): https://milvus.io/
Liu 等人,2024 (文档重新打包): https://arxiv.org/abs/2307.03172
Recomp (总结工具): https://github.com/carriex/recomp