静态班级网站,印象云笔记 wordpress,整合营销策略,网站设计的实例Blog#xff1a;Routing in RAG-Driven Applications ⭐⭐⭐⭐ 根据用户的查询意图#xff0c;在 RAG 程序内部使用 “Routing the control flow” 可以帮助我们构建更实用强大的 RAG 程序。路由模块的关键实现就是一个 Router#xff0c;它根据 user query 的查询意图… BlogRouting in RAG-Driven Applications ⭐⭐⭐⭐ 根据用户的查询意图在 RAG 程序内部使用 “Routing the control flow” 可以帮助我们构建更实用强大的 RAG 程序。路由模块的关键实现就是一个 Router它根据 user query 的查询意图来将该请求的处理转发到多个下游 handlers 之一。
1. 不同的应用场景
1.1 路由到 data source
用户想进行交互的数据可能有多种来源Query Router 可以用于根据 user query 路由到不同的 data source 1.2 路由到不同的 component
还可以根据问题的性质将 query 路由到不同的组件类型比如可能交给 Agent 处理、Vector Store 处理或者直接由 LLM 处理 1.3 路由到不同的 prompt template
可以根据 question 的不同来定制 prompt template 1.4 小结
Router 在本质上就是我们可以用于控制 query control flow 的 “if / else” 语句不过它的特点在于是基于自然语言输入来做出决策。
很多 routing 的逻辑都是基于 LLM 或者 ML 算法这些算法本质上是非确定性的所以我们无法保证 router 总是能做出 100% 正确的选择。此外我们也不太可能预测所有进入路由器的不同查询变体。但是通过采用最佳实践和进行一些测试我们可以使用路由器来帮助创建更强大的 RAG 应用程序。
2. Natural Language Routers
这里探讨一下由不同的第三方库所实现的 Natural Language Router
LLM Completion RoutersLLM Function Calling RoutersSemantic RoutersZero Shot Classification RoutersLanguage Classification Routers
2.1 LLM Completion Router
利用 LLM 的 Chat Completion 的功能以对话的形式要求 LLM 从 prompt 中提供的一组单词或 topics 中选择一个来作为 routing 的结果。如下图的示例程序所示 这种思路也是 LlamaIndex 的 LLM Selector router 的工作思路。
2.2 LLM Function Calling Router
这种方法利用 LLM 的 Function Calling 能力来选择 routing 的路线结果。在 LLM 函数调用中将不同的 routing 路线设置为具有相应描述的函数然后根据向 LLM 传递的 query它能够返回正确的函数即路线供我们使用。
这是 LlamaIndex 中的 Pydantic Router 的内部工作方式。
2.3 Semantic Router
这种路由器类型利用嵌入式表示和相似度搜索来选择最佳的 routing 方式。
每条路由都有一组与其相关联的示例查询这些查询会做 embedding 并作为 vector 存储。将新来的 query 也进行 embedding然后对其他来自 router 中的示例查询进行相似性搜索与 query 匹配度最相近的 routing 路线将被选中。
Python 库 semantic-router 就实现了这一点下图是官网的示例 embedding 模型可以选择 OpenAI 提供的 encoder其实也可以选用其他的 text embedding 模型。
由此对于一个 user querysemantic_router 就可以将其分为 politics 或者 chitchat 两者之一的 routing 结果。
2.4 Zero Shot Classification Router
Zero Shot Classification 是 NLP 的一类 task其中 model 在一组 labeled data 上训练后能够对来自以前未见过的类的新示例进行分类。
在这里我们的 router 可以利用 zero-shot classification 的 model 为一段 text 分配一个 label这个 label 是 router 预先定义的标签集。
Haystack 的 ZeroShotTextRouter 就是利用的 Hugging Face 的 zero shot 分类模型来实现的 routing。
2.5 Language Classification Router
这类 router 可以识别出查询语言的语言种类并根据语言种类对 query 进行路由。如果您的应用程序需要多语言解析能力那么这种路由器就非常有用。
比如 Haystack 的 TextClassificationRouter 就是利用了 python 的 langdetect 库实现的检索文本的语言该库本身使用朴素贝叶斯算法来检测语言种类。
2.6 Keyword Router
LlamaIndex 创始人的文章 Unifying LLM-powered QA Techniques with Routing Abstractions 中就提到了 keyword router它会尝试通过在查询和路由列表之间匹配关键字来选择路由。
这种关键词路由器可以由LLM语言模型或其他关键词匹配库来识别关键词。目前未找到相关实现。
2.7 Logical Routers
这些逻辑检查会针对变量进行比如字符串长度、文件名以及值的比较等用于处理如何路由查询。它们与编程中常用的 if/else 条件非常相似。
换句话说它们不是基于理解自然语言查询的意图而是基于现有的、离散的变量来做出选择。
比如来自 Haystack 的 ConditionalRouter 和 FileTypeRouter。
3. 结论
router 作为基本的构建块在 RAG 系统中可以发挥很大的作用它可以将自然语言请求路由到你的应用程序的正确位置以便尽可能地满足用户的查询需求。