【RAG 博客】RAG 应用中的 Routing
Blog:Routing 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 Routers
- LLM Function Calling Routers
- Semantic Routers
- Zero Shot Classification Routers
- Language 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 query,semantic_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 系统中可以发挥很大的作用,它可以将自然语言请求路由到你的应用程序的正确位置,以便尽可能地满足用户的查询需求。
相关文章:

【RAG 博客】RAG 应用中的 Routing
Blog:Routing in RAG-Driven Applications ⭐⭐⭐⭐ 根据用户的查询意图,在 RAG 程序内部使用 “Routing the control flow” 可以帮助我们构建更实用强大的 RAG 程序。路由模块的关键实现就是一个 Router,它根据 user query 的查询意图&…...

鸿蒙ArkUI:【编程范式:命令式->声明式】
命令式 简单讲就是需要开发用代码一步一步进行布局,这个过程需要开发全程参与。 开发前请熟悉鸿蒙开发指导文档:gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md点击或者复制转到。 Objective-C ObjectiveC 复制代码 UIView *cardView …...

【练习2】
1.汽水瓶 ps:注意涉及多个输入,我就说怎么老不对,无语~ #include <cmath> #include <iostream> using namespace std;int main() {int n;int num,flag,kp,temp;while (cin>>n) {flag1;num0;temp0;kpn;while (flag1) {if(kp<2){if(…...

oracle 新_多种块大小的支持9i
oracle 新_多种块大小的支持 conn sys/sys as sysdba SHOW PARAMETER CACHE ALTER SYSTEM SET DB_CACHE_SIZE16M; ALTER SYSTEM SET DB_4K_CACHE_SIZE8M; CREATE TABLESPACE K4 DATAFILE F:\ORACLE\ORADATA\ZL9\K4.DBF SIZE 2M BLOCKSIZE 4K; CREATE TABLE SCOTT.A1 TABLESP…...

Collections工具类
类java.util.Collections提供了对Set、List、Map进行排序、填充、查找元素的辅助方法。 方法名说明void sort(List)对List容器内的元素排序,排序规则是升序void shuffle(List)对List容器内的元素进行随机排列void reverse(List)对List容器内的元素进行逆序排列void…...

java-函数式编程-jdk
背景 函数式接口很简单,但是不是每一个函数式接口都需要我们自己来写jdk 根据 有无参数,有无返回值,参数的个数和类型,返回值的类型 提前定义了一些通用的函数式接口 IntPredicate 参数:有一个,类型是int类…...

qiankun实现微前端,vue3为主应用,分别引入vue2和vue3微应用
1、vue3主应用配置 1、安装 qiankun yarn add qiankun # 或者 npm i qiankun -S2、在主应用中注册微应用 import { registerMicroApps, start } from "qiankun" const apps [{ name: vue2App, // 应用名称 xs_yiqing_vue2entry: //localhost:8080, // vue 应用…...

写了 1000 条 Prompt 之后,我总结出了这 9 个框架【建议收藏】
如果你对于写 Prompt 有点无从下手,那么,本文将为你带来 9 个快速编写 Prompt 的框架,你可以根据自己的需求,选择任意一个框架,填入指定的内容,即可以得到一段高效的 Prompt,让 LLM 给你准确满意…...

事件代理 浅谈
事件代理是一种将事件处理委托给父元素或祖先元素来管理的技术。当子元素触发特定事件时,该事件不会直接在子元素上进行处理,而是会冒泡到父元素或祖先元素,并在那里进行处理。这样做的好处是可以减少事件处理函数的数量,提高性能…...

一对多在线教育系统,疫情后,在线教育有哪些变革?
疫情期间,全面开展的在线教育经历了从不适应到认可投入并常态化的发展过程。如何发挥在线教学优势,深度融合线上与线下教育,将在线教育作为育人方式变革动力,提升育人服务水平,是复学复课后学校教育教学面临的关键问题…...

RabbitMQ(安装配置以及与SpringBoot整合)
文章目录 1.基本介绍2.Linux下安装配置RabbitMQ1.安装erlang环境1.将文件上传到/opt目录下2.进入/opt目录下,然后安装 2.安装RabbitMQ1.进入/opt目录,安装所需依赖2.安装MQ 3.基本配置1.启动MQ2.查看MQ状态3.安装web管理插件4.安装web管理插件超时的解决…...

JUC下的BlockingQueue详解
BlockingQueue是Java并发包(java.util.concurrent)中提供的一个接口,它扩展了Queue接口,增加了阻塞功能。这意味着当队列满时尝试入队操作,或者队列空时尝试出队操作,线程会进入等待状态,直到队列状态允许操作继续。这…...

ChatGPT理论分析
ChatGPT "ChatGPT"是一个基于GPT(Generative Pre-trained Transformer)架构的对话系统。GPT 是一个由OpenAI 开发的自然语言处理(NLP)模型,它使用深度学习来生成文本。以下是对ChatGPT进行理论分析的几个主…...

算法提高之魔板
算法提高之魔板 核心思想:最短路模型 将所有状态存入队列 更新步数 同时记录前驱状态 #include <iostream>#include <cstring>#include <algorithm>#include <unordered_map>#include <queue>using namespace std;string start&qu…...

服务器内存占用不足会怎么样,解决方案
在当今数据驱动的时代,服务器对于我们的工作和生活起着举足轻重的作用。而在众多影响服务器性能的关键因素当中,内存扮演着极其重要的角色。 服务器内存,也称RAM(Random Access Memory),是服务器核心硬件部…...

elasticsearch文档读写原理大致分析一下
文档写简介 客户端通过hash选择一个node发送请求,专业术语叫做协调节点 协调节点会对document进行路由,将请求转发给对应的primary shard primary shard在处理完数据后,会将document 同步到所有replica shard 协调节点将处理结果返回给…...

1 开发环境
开发环境(platformio python arduino框架)的搭建可以参考b站upESP32超详细教程-使用VSCode(基于Arduino框架)哔哩哔哩bilibili 这里推荐离线安装esp32库文件,要不然要等很久(b站教程很多) 搭…...

云视频,也称为视频云服务,是一种基于云计算技术理念的视频流媒体服务
云视频,也称为视频云服务,是一种基于云计算技术理念的视频流媒体服务。它基于云计算商业模式,为视频网络平台服务提供强大的支持。在云平台上,所有的视频供应商、代理商、策划服务商、制作商、行业协会、管理机构、行业媒体和法律…...

[Vision Board创客营]--使用openmv识别阿尼亚
文章目录 [Vision Board创客营]使用openmv识别阿尼亚介绍环境搭建训练模型上传图片生成模型 使用结语 [Vision Board创客营]使用openmv识别阿尼亚 🚀🚀五一和女朋友去看了《间谍过家家 代号:白》,入坑二刺螈(QQ头像也换…...

【Linux:lesson1】的基本指令
🎁个人主页:我们的五年 🔍系列专栏:Linux课程学习 🌷追光的人,终会万丈光芒 🎉欢迎大家点赞👍评论📝收藏⭐文章 目录 🚗打开Xshell,登陆root…...

20240511日记
今天工作内容: 1.二期2号机EAP测试 2.二期开门机器暂停(停轴,停流水线电机),关闭门后继续功能测试 3.针点位偏移还需要调整,未进行大批量验证是否偏移(S3模板点位测试,两台机各焊…...

蓝桥杯成绩已出
蓝桥杯的成绩早就已经出来了,虽然没有十分惊艳 ,但是对于最终的结果我是心满意足的,感谢各位的陪伴,关于蓝桥杯的刷题笔记我已经坚持更新了49篇,但是现在即将会告别一段落,人生即将进入下一个规划。我们一起…...

.kat6.l6st6r勒索病毒数据怎么处理|数据解密恢复
导言: 在数字时代的洪流中,网络安全领域的新挑战层出不穷。近期,.kat6.l6st6r勒索病毒的出现再次打破了传统安全防护的界限。这种新型勒索病毒不仅具有高超的加密技术,更以其独特的传播方式和隐蔽性,给全球用户带来了…...

Spring Batch 是什么?主要用于什么场景?
Spring Batch是一个开源的、基于Spring框架的批量处理框架,它提供了一系列用于批量数据处理的工具和API。Spring Batch的主要目标是简化和标准化批量数据的处理过程,使得开发者可以更加专注于业务逻辑的实现,而不是批量处理的复杂性。 Sprin…...

SQL-慢查询的定位及优化
定位慢查询sql 启用慢查询日志: 确保MySQL实例已经启用了慢查询日志功能。可以通过以下命令查看是否启用: SHOW VARIABLES LIKE slow_query_log;如果未启用,可以通过以下命令启用: SET GLOBAL slow_query_log ON;配置慢查询日志&…...

练习题(2024/5/11)
1逆波兰表达式求值 给你一个字符串数组 tokens ,表示一个根据 逆波兰表示法 表示的算术表达式。 请你计算该表达式。返回一个表示表达式值的整数。 注意: 有效的算符为 、-、* 和 / 。每个操作数(运算对象)都可以是一个整数或…...

linux系统服务器中常见故障及排查方法
目录 故障1:系统无响应 故障2:网络连接问题 故障3:文件系统错误 故障4:软件包依赖问题 故障5:用户权限问题 故障6:服务无法正常工作 故障7:磁盘空间不足 故障8:内存不足 故障…...

产品人生(5):从“敏捷开发”到“四化时间管理法”
人生如产品,产品映人生,借鉴产品思维,快速提升软技能! 在互联网的敏捷开发实践中,经常会用到“流程化、模板化、清单化、不断优化”的思想来提升开发的效率和产品质量,并确保团队能够快速响应市场变化。大…...

超级好看的html网站维护源码
源码介绍 好看的html网站维护源码,源码由HTMLCSSJS组成,记事本打开源码文件可以进行内容文字之类的修改,双击html文件可以本地运行效果,也可以上传到服务器里面, 源码截图 源码下载 好看的html网站维护源码...

从零开始搭建Springboot项目脚手架2:配置文件、返回值、日志等
1、多个环境与配置文件 2、统一返回值 返回值包括两种场景:正常controller的返回、异常发生之后返回 正常controller的返回:通过在controller的默认返回Response实现 异常发生之后返回:通过全局异常处理统一捕获返回 首先创建类StatusCode…...