RAG技术之Router

Router有什么用?

在RAG应用中,Router可以帮助我们基于用户的查询意图来决定使用何种数据类型或数据源,比如是否需要进行语义检索、是否需要进行text2sql查询,是否需要用function call来进行API调用。

在这里插入图片描述

Router也可以根据用户的查询意图来决定使用何种组件类型,比如是否可以用agent来解决用户的问题,是否需要用到向量数据库来进行上下文信息补充,是否直接用LLM来回答用户的问题。

在这里插入图片描述

Route也可以让我们根据问题意图来使用不同的prompt 模板。

在这里插入图片描述

总之,我们使用Router来帮助我们决定query如何被处理和响应。(注:上面的图片都来自于参考资料1)

Router如何实现

基于LLM的Router

鉴于LLM强大的语义理解能力,让LLM作为Router来决定一个query的意图是什么。

  • LLM comletion router,在prompt中给LLM定义一些选项,让LLM选择与问题最相关的选项。

Llamaindex里的prompt如下:

# single select, LLMSingleSelector类默认使用这个prompt
DEFAULT_SINGLE_SELECT_PROMPT_TMPL = ("Some choices are given below. It is provided in a numbered list ""(1 to {num_choices}), ""where each item in the list corresponds to a summary.\n""---------------------\n""{context_list}""\n---------------------\n""Using only the choices above and not prior knowledge, return ""the choice that is most relevant to the question: '{query_str}'\n"
)# multiple select, LLMMultiSelector类默认使用这个prompt
DEFAULT_MULTI_SELECT_PROMPT_TMPL = ("Some choices are given below. It is provided in a numbered ""list (1 to {num_choices}), ""where each item in the list corresponds to a summary.\n""---------------------\n""{context_list}""\n---------------------\n""Using only the choices above and not prior knowledge, return the top choices ""(no more than {max_outputs}, but only select what is needed) that ""are most relevant to the question: '{query_str}'\n"
)
  • LLM Function router: 利用LLM的function call能力,也就是定义一些处理不同意图的function,让LLM将用户query输出function调用参数。LlamaIndex的pandatic Router 就是基于此来实现的。

Semantic Router

Semantic router: 基于语义相似度的Router。其主要思路是将每一类问题意图给出一些示例问法后并用embedding编码,在routing时编码问题后用语义相似度来决定与问题最相关的意图。

semantic-router是一个开源的Semantic router(安装:pip install -qU semantic-router)。其使用示例如下:

import os
from getpass import getpass
from semantic_router.encoders import CohereEncoder, OpenAIEncoder
from semantic_router import Route
from semantic_router.layer import RouteLayeros.environ["OPENAI_API_KEY"] = os.getenv("OPENAI_API_KEY") or getpass("Enter OpenAI API Key: "
)## 定义名为politics的Route,以及其对应的一些描述
politics = Route(name="politics",utterances=["isn't politics the best thing ever","why don't you tell me about your political opinions","don't you just love the president","don't you just hate the president","they're going to destroy this country!","they will save the country!",],
)
## 定义名为politics的Route,以及其对应的一些描述
chitchat = Route(name="chitchat",utterances=["how's the weather today?","how are things going?","lovely weather today","the weather is horrendous","let's go to the chippy",],
)# 当前route汇总
routes = [politics, chitchat]
# embedding编码器
encoder = OpenAIEncoder()## 定义Router层,在这一步会将routes中对应的描述(utterances)都向量编码并存储下来
rl = RouteLayer(encoder=encoder, routes=routes)## 对查询做判断属于哪一个Route.
## 实现逻辑: 用query与定义好的问句进行相似度计算,返回与query最相似的top 5个预先定义的问法,并对其根据Route进行分组,取分组分数之和最大(组内分数的聚合策略可选:sum/max/mean)的Route作为候选Route,如果这些匹配的问法里存在大于指定阈值的问法,则将该Route作为匹配Route返回,否则返回空。
rl("don't you love politics?")
# RouteChoice(name='politics', function_call=None, similarity_score=None)## 对查询做判断属于哪些Route.
## 实现逻辑: 用query与定义好的问句进行相似度计算,返回与query最相似的top 5个预先定义的问法,并对其根据Route进行分组,返回全部分数大于指定阈值的组,否则返回空。
rl.retrieve_multiple_routes("Hi! How are you doing in politics??")
#[RouteChoice(name='politics', function_call=None, similarity_score=0.8595844842560181),
# RouteChoice(name='chitchat', function_call=None, similarity_score=0.8356704527362284)]#######
######## dynamic route 可以定义 function_schema, 利用LLM的function call 能力进行函数解析 #######
from datetime import datetime
from zoneinfo import ZoneInfodef get_time(timezone: str) -> str:"""Finds the current time in a specific timezone.:param timezone: The timezone to find the current time in, shouldbe a valid timezone from the IANA Time Zone Database like"America/New_York" or "Europe/London". Do NOT put the placename itself like "rome", or "new york", you must providethe IANA format.:type timezone: str:return: The current time in the specified timezone."""now = datetime.now(ZoneInfo(timezone))return now.strftime("%H:%M")
from semantic_router.llms.openai import get_schemas_openaischemas = get_schemas_openai([get_time])time_route = Route(name="get_time",utterances=["what is the time in new york city?","what is the time in london?","I live in Rome, what time is it?",],function_schemas=schemas,
)
# 添加新定义的route
rl.add(time_route)
# 因为定义的get_time包含function_schemas,所以会在通过相似度计算得到匹配的route之后,用LLM的function call功能来返回待调用的函数参数
response = rl("what is the time in new york city?")
response
# RouteChoice(name='get_time', function_call=[{'function_name': 'get_time', 'arguments': {'timezone': 'America/New_York'}}], similarity_score=None)### 除了向量比较相似性外,还可以与关键词比较一起进行混合匹配,将两者的分数用alpha分配后相加
import os
from semantic_router.encoders import CohereEncoder, BM25Encoder, TfidfEncoder
from getpass import getpassdense_encoder = CohereEncoder()
# sparse_encoder = BM25Encoder()
sparse_encoder = TfidfEncoder()
from semantic_router.hybrid_layer import HybridRouteLayerdl = HybridRouteLayer(encoder=dense_encoder, sparse_encoder=sparse_encoder, routes=routes
)
dl("don't you love politics?")## RouteLayer的evaluate函数计算将问题正确分类的准确度
## RouteLayer的fit函数输入少量的标注数据,在max_iter次数内,每次随机为Route选取一个阈值,将准确率最高的阈值作为拟合出的阈值。

基于文本分类的Router

既然Router是在做类似意图分类的工作,我们可以使用文本分类模型来当Router。如果没有足够的语料来训练的话,可以先选Zero-shot text classfication模型来当做Router, haystack(source code)实现了用zero-shot分类模型来作为Router。

参考资料

  1. blog:Routing in RAG-Driven Applications
  2. LLamaindex router文档
  3. Langchain router文档
  4. Haystack router文档

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/51267.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

麦田物语第十五天

系列文章目录 麦田物语第十五天 文章目录 系列文章目录一、构建游戏的时间系统二、时间系统 UI 制作总结 一、构建游戏的时间系统 在该游戏中我们要构建年月日天时分秒等时间的概念,从而实现季节的更替,昼夜的更替等(不同的季节可以播种不同…

qt总结--翻金币案例

完成了一个小项目的在qt5.15.2环境下的运行,并使用NSIS editNSIS打包完成.有待改进之处:增加计时功能,随机且能通关功能,过关后选择下一关功能.打包后仅仅有安装包有图标 安装后应用图标并未改变 在qt .pro中有待改进对qt的基本操作和帮助文档有了基本的认识.对C制作小游戏有了…

YOLO5项目目录最强解析

YOLO5项目目录解析 YOLOv5 项目目录下的文件和目录的结构,以下是对每个目录和文件的解释: 目录 📁 .github: 存放 GitHub 相关配置和文件,如 GitHub Actions 工作流文件、Issue 模板等,用于自动化构建和持续集成等功…

MYSQL 第五次作业

一、第五次作业 二、建立触发器 在订单表中增加订单数量后,商品表的商品数量同步减少对应的商品订单出数量;客户取消订单时恢复商品表对应商品的数量;当客户修改订单时,商品表对应商品的数量同步更新。 3、存储 DELIMITER $$ CREA…

USB 2.0 协议专栏之 USB 2.0 连接与枚举(二)

前言:本篇博客为手把手教学的 USB 2.0 协议栈类精品博客,该专栏博客侧重针对 USB 2.0 协议进行讲解。本篇博客将针对 USB 2.0 中的连接与枚举进行教学,USB 的枚举过程是 USB 协议中至关重要的一环,也是嵌入式工程师必须掌握的内容…

Python层内层外多图布局图基分析

🎯要点 🎯多层图和多路复用图结构模型 | 🎯图结构变换、读写图、聚类系数、可视化、同构、图基分析 | 🎯稀疏网络边数和节点数线性扩展 | 🎯耦合边的生成和惰性评估 | 🎯层内布局计算、多层网络绘图、层间…

基于深度学习网络的USB摄像头实时视频采集与水果识别matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 (完整程序运行后无水印) 将usb摄像头对准一个播放不同水果图片的显示器,然后进行识别,识别结果如下: 本课题中…

Vue3--

一、pinia (集中式状态(数据)管理) 1、准备一个效果 2、存储读取数据 3、修改数据三种方式 4、storeToRefs 5、getters 当state中的数据,需要经过处理后在使用时,可以使用getters配置 6、$subscribe的使用…

mqtt:测试eclipse paho qos=1的数据重发的功能

# 测试程序 【pom.xml】 <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>2.3.12.RELEASE</version></dependency><dependency…

Unity横版动作游戏 -瓦片地形和动画瓦片

(规则瓦片)瓦片地形和动画瓦片 准备阶段 在Tilemap中创建一个新的文件夹起名叫做Rule Tile&#xff0c;创建一个Rule Tile&#xff0c;用来设置瓦片地形&#xff0c;我们将用他来绘制地形图&#xff0c;类似于Godot中的瓦片地形。 这里给他取名为了Ground 1&#xff0c;用于创…

PVE环境中调整虚拟机磁盘大小

我的希望将PVE中的虚拟机磁盘调整一下&#xff0c;增加20GB。在查询了一些资料后&#xff0c;做一下总结教程。 环境是 PVE8.2.2 版本&#xff0c;虚拟机系统是centos7.9.2009-minimal&#xff0c; 安装系统时划分磁盘分区方式是默认分区方式&#xff08;不同分区方式下&#…

pinia安装及简介

pinia简介 基本特点 轻量级&#xff1a;Pinia相比于传统的Vuex&#xff0c;体积更小&#xff0c;性能更好&#xff0c;只有大约1KB左右。 简化API&#xff1a;Pinia简化了状态管理库的使用方法&#xff0c;抛弃了Vuex中的mutations&#xff0c;只保留了state、getters和actions…

WHAT - 一个 Github 仓库的 License 如何解读

目录 一、背景二、解读许可证说明的作用常见的开源许可证类型使用他人代码仓库时需要注意的事项结论 实践作为开发者1. 选择许可证类型2. 在 README 文件中编写许可证信息 作为使用者1. 确定权限2. 了解和遵守条款 总结 一、背景 我们经常在一些 Github 仓库里看到 License 部…

探索 `pyjwt`:Python 中的 JWT 处理专家

文章目录 探索 pyjwt&#xff1a;Python 中的 JWT 处理专家简介&#xff1a;为何选择 pyjwt&#xff1f;什么是 pyjwt&#xff1f;安装 pyjwtpyjwt 的基本使用1. 编码JWT2. 解码JWT3. 验证签名4. 过期时间5. 自定义头部 场景应用场景一&#xff1a;用户登录场景二&#xff1a;A…

使用标量函数实现 EF Core 的实用方法

一.介绍 在构建应用程序时&#xff0c;您可能使用标量函数在数据库端实现一些逻辑。在 SQL 中&#xff0c;标量函数是一种对单个值或少量输入值进行操作并始终返回单个值作为输出的函数。这些函数本质上是可重复使用的代码块&#xff0c;用于对数据执行计算或操作。 以下是标…

doccano安装与使用

1.安装 &#xff08;1&#xff09;创建虚拟环境 conda create -n doccano conda activate doccano &#xff08;2&#xff09;安装doccano pip install doccano &#xff08;3&#xff09;doccano初始化 doccano init doccano createuser --username admin --password pa…

chk是什么文件格式 chk文件怎么恢复正常 chkdsk文件损坏怎么修复

在使用电脑和移动存储设备时&#xff0c;有时我们会发现磁盘中出现了大量的chk文件。这些chk文件无法打开&#xff0c;也无法得知其原本内容。那么&#xff0c;这些chk文件是什么呢&#xff1f;又该如何将chk文件恢复正常呢&#xff1f; chk文件是什么&#xff1f; 在我们查看…

【前端 12】js事件绑定

JavaScript 事件绑定 在Web开发中&#xff0c;事件绑定是实现用户与网页交互的重要机制。JavaScript 提供了多种方式来绑定和处理事件&#xff0c;使得开发者能够灵活地控制网页的行为。本文将详细介绍JavaScript中事件绑定的两种主要方式&#xff0c;并通过实例演示如何应用这…

Python+Pytest+Allure+Yaml+Pymysql+Jenkins+GitLab运行原理

PythonPytestAllureYamlPymysqlJenkinsGitLab运行原理逻辑及调用关系 GitLab代码仓&#xff1a; Jenkins工作空间&#xff1a; 代码&#xff1a; 测试报告展示&#xff1a;

<Python><paddle>基于python使用百度paddleocr实现车牌识别

前言 paddleocr是百度飞桨的一个文字识别库&#xff0c;准确度非常高&#xff0c;基于其文字识别的基础&#xff0c;将其用于车牌识别。这个识别的准确度是相当高的。 环境配置 系统&#xff1a;windows 平台&#xff1a;visual studio code 语言&#xff1a;python 库&#…