依据的用户查询意图在 RAG 应用程序使用“路由控制模式”可以帮助我们创建更强大的 RAG 应用程序。我们通常希望用户能够访问的数据可以来自各种来源,如报告、文档、图片、数据库和第三方系统。
对于基于业务的 RAG 应用程序,我们可能还希望用户能够与其它业务系统进行交互,例如:销售、订购和会计等。由于数据来源的多样性,信息的存储方式以及我们想要与之交互的方式也可能是多样的。一些数据可能存储在向量存储器中,一些存储在 SQL 数据库中,而一些可能需要通过 API 调用来访问,因为它存在于第三方系统中。
同样的数据可能也可以设置不同的向量存储,针对不同类型的查询进行优化。例如:可以设置一个向量存储用于回答摘要型问题,另一个用于回答特定的、有针对性的问题。我们可能还希望根据问题的性质,路由到不同的组件类型。例如:我们可能希望将查询传递给代理、向量存储器,或者直接传递给 LLM 进行处理,这完全取决于问题的性质。
我们甚至可能希望根据所问问题来定制提示词模板。
总的来说,有许多原因会导致我们希望改变并引导用户查询在应用程序中的流程。我们的应用程序要实现的业务场景越多,我们在整个应用程序中可能需要的“路由”要求也就越多。“路由器”本质上只是我们使用的 If/Else 语句,用于指导查询的控制流程。但有趣的是,它们需要根据自然语言输入做出决策。因此,我们寻求基于自然语言描述的离散输出。由于许多路由逻辑是基于使用 LLMs 或机器学习算法的,这些算法是非确定性的,我们无法保证“路由器”始终 100%做出正确的选择。此外,我们不太可能能够预测所有进入路由器的不同查询变体。然而,通过不断优化和测试,我们应该能够利用“路由器”来帮助创建更强大的 RAG 应用程序。
自然语言路由器
我们将在这里探讨一些常见的自然语言路由器,它们由一些不同的 RAG 和 LLM 框架和库实现。
LLM 补全路由器(LLM Completion Routers)
LLM 函数调用路由器(LLM Function Calling Routers)
语义路由器(Semantic Routers)
零样本分类路由器