RAGatouille

声称最先进的文档检索方法,只需几行代码。

动机

RAGatouille的目标是缩小信息检索文献与日常生产检索使用之间日益扩大的差距。 后期交互检索器(late interaction retrievers),几乎任何零样本任务上都比密集嵌入更好,至少在测试应用程序到应用程序时是这样. 然而在实际项目中开始使用ColBERT并不是特别顺利。 许多好的IR框架,如Terrier或Anserini,不适合Python日常工作流程。

RAGatouille的目的是帮助简化训练并使用ColBERT。 为此,还采取了一种尽可能避免重新实现的方法,以加快迭代。

如果一篇论文已经开源了它的代码,项目的目标是让RAGatouille成为通往它的门户,而不是尽可能地完全取代它。

代码哲学

在实践中,体现在RAGPrestrainedModel和RAGTrainer最终应该是在管道中利用ColBERT所需的一切。 添加到RAGatouille的所有内容都应该可以在这两个类中使用,这两个类别实际上只是底层模型和处理器之间的接口。

可重复使用的组件是另一个非常重要的方面。 RAGatouille旨在以这样的方式构建,即如果你愿意,每个核心组件,如我们的negative miners(目前用于密集检索的SimpleMiner)或data processors,都应该在主类之外可用。

最后,还有第三点相当重要:

不要重新发明轮子。

如果一个组件需要做某事,寻求以人们已经做的方式来做。 当需要更复杂的基于LLM的组件时,使用LlamaIndex来块化文档,使用instructor和pydantic来约束OpenAI调用,或使用DSPy!

后期交互(Late-Interaction)

基本概念很简单。 简而言之,我喜欢将ColBERT解释为一种嵌入方法,因为这使ColBERT如何以及为什么对NLP从业者有效变得显而易见:

就像单词袋一样,它适用于小信息单元,并将文档表示为它们的总和 就像嵌入一样,它在语义层面上起作用:事物的实际措辞方式并不重要,模型会学习意义。

以这种方式来看,现有的广泛使用的检索方法,以及它们的优缺点的快速概述:

BM25/基于关键字的稀疏检索

优点: 快速 稳定的性能 无需实际训练 直观

缺点: 需要精确匹配 不能利用任何语义信息,因此达到了性能上限

交叉编码器

优点: 性能很强 在很大程度上利用语义信息(“理解”否定形式,使“我爱苹果”和“我讨厌苹果”不相似,等等。) 缺点: 只能通过运行模型将查询与语料库中的每个文档进行比较来检索分数

密集检索/嵌入

优点: 快速 经过预培训后,整体表现良好 利用语义信息

缺点: 不理解否定形式 微调可能很费钱 需要数十亿个参数(e5-mistral)或数十亿个预训练示例才能达到最佳性能 通常概括得很差

泛化(Generalisation)