检索增强生成RAG系列5--RAG提升之路由(routing)

在系列3和系列4我讲了关于一个基本流程下,RAG的提高准确率的关键点,那么接下来,我们再次讲解2个方面,这2个方面可能与RAG的准确率有关系,但是更多的它们是有其它用途。本期先来讲解RAG路由。

目录

  • 1 基本思想
  • 2 Logical routing
    • 2.1 基本思想
    • 2.2 代码演示
  • 3 Semantic routing
    • 3.1 基本思想
    • 3.2 代码演示

1 基本思想

说起路由我们最熟悉不过,无论是代码中通过switch语句或者网络中通过网关等方式,我们可以实现代码逻辑或者一个请求去分发到不同的模块或者服务中。那么RAG的路由又有什么不一样。
我们知道传统的路由可能是通过匹配字符串内容相同的模式去分发的,但是RAG路由是通过大模型语义去做匹配,也就是通过理解请求或者查询的字符串的语义去匹配对应的分发

在这里插入图片描述

RAG routing某种程度上可以提高RAG的准确率,但是其更大的功能是提升整个RAG系统的功能性。因为通过语义理解之后,后面的操作可能是通过不同路由到不同数据源、或者调用API工具、甚至是其它Agent等等,这样你的RAG就更为丰富,因此RAG routing的作用如下:

  • 增加RAG系统功能丰富度。你可以增加多种数据库查询、可以增加多种API、可以增加多个Agent等等,常见于搜索助手、客服系统、问答系统等等
  • 解耦RAG与其它系统。其实路由一般都有解耦的作用,你可以一个模块一个模块的上线,比如开始你的搜索系统只是一个文本搜索,后面慢慢可以增加图片生成、语言生成、翻译等功能,而且是以模块化方式
  • 提高RAG准确度。这个前面已经提到过,如果你的RAG只是一个基于某个数据库检索后生成答案,有可能你的数据库知识有限,搜索不到相关信息,这是你可能需要去网上找其他资料等等,这样可能能更好提高你的RAG准确度

一般来说,基于语义理解的RAG routing分为2种不同实现模式:

  • Logical routing:使用大模型对问题进行推理,通过理解的内容并选择更合适的方式。
  • Semantic routing:将问题和一组prompt向量化,让后计算其相似性选择合适的prompt。

2 Logical routing

2.1 基本思想

这是一种基于大模型的推理能力,将你要查询的问题进行逻辑推理,最终选择选项中最为接近的答案,当然有可能答案中并不存在,那么我们可以设置一些兜底方案,比如直接回答不知道。步骤如下:

  • 让大模型对问题进行语义分析,选出对应选项
  • 通过选项,进入路由引擎,对其进行路由选择最终操作

在这里插入图片描述

2.2 代码演示

这里只是简单演示以下流程,通过一个prompt,让大模型分析问题语义,给出路由的选项,然后再通过路由函数进行选择最终操作。其中prompt和路由函数在实际应用中就是更为复杂或者使用路由引擎来代替。

前置条件

  • 这里采用智谱AI的API接口,因此可以先去申请一个API KEY(当然你使用其它模型也可以,目前智谱AI的GLM4送token,就拿它来试验吧)
from langchain_openai import ChatOpenAI
from langchain_core.runnables import RunnableLambda
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser


# 前置工作:创建llm
llm = ChatOpenAI(
    temperature=0.01,
    model="glm-4",
    openai_api_key="你的API KEY",
    openai_api_base="https://open.bigmodel.cn/api/paas/v4/"
)

# 第一步:通过大模型进行对问题的语义分析,将结果返回出来
system = """根据用户的问题,将其分类为:'python代码问题'、'java代码问题'、'js代码问题'。如果无法分类,则直接回答不知道。

问题:{question}
输出格式直接返回选项内容
"""
prompt = ChatPromptTemplate.from_messages(
    [
        ("system", system),
        ("human", "{question}"),
    ]
)
router = prompt | llm | StrOutputParser()
question = """为什么下面这段代码报错,错误信息是System.out.printIn找不到

public class HelloWorld {
    public static void main(String[] args) {
		System.out.printIn("Hello World");
	}
}

"""
response = router.invoke({"question": question})
print(response)


# 第二步:根据返回结果,进行router选择,这里是将前面第一步也串联起来
def route_fun(result):
    if "python代码问题" in result:
        return "由python文档库查询"
    elif "java代码问题" in result:
        return "由java文档库查询"
    elif "js代码问题" in result:
        return "由js文档库查询"
    else:
        return "无法识别"


final_chain = router | RunnableLambda(route_fun)
print(final_chain.invoke({"question": question}))

3 Semantic routing

3.1 基本思想

这个方法是将问题和一组prompt向量化,让后计算其相似性选择合适的prompt。其实在前面问题优化中,问题在向量数据库中查询最接近答案的方式是一样的,只不过将向量数据库和相似度用于路由选择。步骤如下:

  • 将问题和一组事先准备好的prompt向量化
  • 对其问题与prompt直接计算相似度,取最相似的一个

在这里插入图片描述

3.2 代码演示

这里使用m3e-base的embedding模型将一组prompt向量化,再将查询问题向量化,计算其相似度,获得相似度最高的结果。

前置条件

  • 下载m3e-base的embedding模型
from langchain.utils.math import cosine_similarity
from langchain_core.prompts import PromptTemplate
from langchain_core.runnables import RunnableLambda, RunnablePassthrough
from langchain_huggingface import HuggingFaceEmbeddings


# 前置工作:初始化embeddings模型
encode_kwargs = {"normalize_embeddings": False}
model_kwargs = {"device": "cuda:0"}
embeddings = HuggingFaceEmbeddings(
    model_name='/root/autodl-tmp/model/AI-ModelScope/m3e-base',  # 换成自己的embedding模型路径
    model_kwargs=model_kwargs,
    encode_kwargs=encode_kwargs
)

# 第一步:将一组prompt进行向量化
search_template = """你是一个智能搜索机器人。
你可以通过搜索互联网内容结果并总结出最终答案。但搜索无结果是,请回答不知道

这里有一个问题:
{question}"""

picture_template = """你是一个图片生成机器人。
你很擅长将文本内容生成图片。

这里有一个问题:
{question}"""
prompt_templates = [search_template, picture_template]
prompt_embeddings = embeddings.embed_documents(prompt_templates)


# 第二步,计算相似度
def similarity_fun(question_temp):
    # 将问题向量化
    query_embedding = embeddings.embed_query(question_temp["question"])
    # 计算相似度
    similarity = cosine_similarity([query_embedding], prompt_embeddings)[0]
    most_similar = prompt_templates[similarity.argmax()]
    # 选择结果
    print("使用 搜索Agent" if most_similar == search_template else "使用 文生图Agent")
    return PromptTemplate.from_template(most_similar)


chain = (
    {"question": RunnablePassthrough()}
    | RunnableLambda(similarity_fun)
)

print(chain.invoke("请生成一种80年代中国的照片"))

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux基础 - LNMP 架构部署动态网站环境

目录 零. 简介 一. 部署 二. 安装 Nginx 三. 安装MySQL 四. 安装PHP 五. 配置网站目录 六. 测试环境 零. 简介 LNMP 是指 Linux Nginx MySQL PHP 这一组合架构,用于部署动态网站环境。 Linux 作为操作系统,提供了稳定、安全和高效的基础平台。…

Swift 中强大的 Key Paths(键路径)机制趣谈(上)

概览 小伙伴们可能不知道:在 Swift 语言中隐藏着大量看似“其貌不扬”实则却让秃头码农们“高世骇俗”,堪称卧虎藏龙的各种秘技。 其中,有一枚“不起眼”的小家伙称之为键路径(Key Paths)。如若将其善加利用&#xff…

MYSQL函数进阶详解:案例解析(第19天)

系列文章目录 一、MySQL的函数(重点) 二、MySQL的窗口函数(重点) 三、MySQL的视图(熟悉) 四、MySQL的事务(熟悉) 文章目录 系列文章目录前言一、MySQL的函数1. 聚合函数2. group_c…

Linux基础 - MariaDB 数据库管理系统

目录 零. 简介 一. 安装 二. 基本使用 1. 设置root密码 2. 创建库 3. 创建表 4.添加数据 5. 查看数据 三. 管理表单及数据 四. 数据库的备份及恢复 零. 简介 MariaDB 是一种流行的开源数据库管理系统,它是 MySQL 的一个分支。 MariaDB 保留了与 MySQL 的…

HarmonyOS APP应用开发项目- MCA助手(Day01持续更新中~)

简言: gitee地址:https://gitee.com/whltaoin_admin/money-controller-app.git端云一体化开发在线文档:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/agc-harmonyos-clouddev-view-0000001700053733-V5 注&#xff1…

激光粒度分析仪校准步骤详解:提升测量精度的秘诀

在材料科学、环境监测、医药研发等众多领域,激光粒度分析仪以其高精度、高效率的测量性能,成为了不可或缺的测试工具。然而,为了保持其测量结果的准确性和可靠性,定期校准是不可或缺的步骤。 接下来,佰德将为您详细介…

可视化低代码平台之:RayData光启元的震撼作品。

RayData家的可视化作品,贝格前端工场是经常碰到,制作十分的精良,业内很有影响力。他们也有自己的低代码平台,分为了桌面版和网页版,本期分享一下他们的作品。

【单片机毕业设计选题24043】-可旋转式电视支架控制系统设计与实现

系统功能: 系统操作说明: 上电后OLED显示 “欢迎使用电视支架系统请稍后”,两秒后进入正常界面显示 第一页面第一行显示 Mode:Key, 第二行显示 TV:Middle 短按B5按键可控制步进电机左转, 第二行显示 TV:Left 后正常显示 TV:…

六、资产安全—信息分级资产管理与隐私保护练习题(CISSP)

六、资产安全—信息分级资产管理与隐私保护(CISSP): 六、资产安全—信息分级资产管理与隐私保护(C

语义检索-BAAI Embedding语义向量模型深度解析:微调Cross-Encoder以提升语义检索精度

语义检索-BAAI Embedding语义向量模型深度解析:微调Cross-Encoder以提升语义检索精度 语义向量模型(Embedding Model)已经被广泛应用于搜索、推荐、数据挖掘等重要领域。在大模型时代,它更是用于解决幻觉问题、知识时效问题、超长文本问题等各种大模型本身制约或不足的必要…

【Python】已解决:ModuleNotFoundError: No module named ‘pyhanlp’

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例五、注意事项 已解决:ModuleNotFoundError: No module named ‘pyhanlp’ 一、分析问题背景 在使用Python进行自然语言处理时,有时我们可能会用到pyhanlp这个库,它是一个基于J…

煤矿安全大模型:微调internlm2模型实现针对煤矿事故和煤矿安全知识的智能问答

煤矿安全大模型————矿途智护者 使用煤矿历史事故案例,事故处理报告、安全规程规章制度、技术文档、煤矿从业人员入职考试题库等数据,微调internlm2模型实现针对煤矿事故和煤矿安全知识的智能问答。 本项目简介: 近年来,国家对煤矿安全生产的重视程度不断提升。为了确…

STM32 中断编程入门

目录 一、中断系统 1、中断的原理 2、中断类型 外部中断 定时器中断 DMA中断 3、中断处理函数 中断标志位清除 中断服务程序退出 二、实际应用 中断控制LED 任务要求 代码示例 中断控制串口通信 任务要求1 代码示例 任务要求2 代码示例 总结 学习目标&…

【第三版 系统集成项目管理工程师】第5 章 软件工程

持续更新。。。。。。。。。。。。。。。 【第三版】第五章 软件工程 5.1软件工程定义练习 5.2软件需求5.2.1雾求的层次1.业务需求-P2032.用户需求-P2033.系统需求-P203 5.2.2质量功能部署 P2035.2.3需求获取 P2045.2.4需求分析1.结构化分析-P2042.面向对象分析-P207 5.2.5号求…

第二证券:可转债基础知识?想玩可转债一定要搞懂的交易规则!

可转债,全称是“可转化公司债券”,是上市公司为了融资,向社会公众所发行的一种债券,具有股票和债券的双重特点,投资者可以选择按照发行时约定的价格将债券转化成公司一般股票,也可作为债券持有到期后收取本…

格式化选NTFS还是exFAT 格式化NTFS后Mac不能用怎么办 移动硬盘格式化ntfs和exfat的区别

面对硬盘、U盘或移动硬盘的格式化决策,NTFS与exFAT作为主流的文件系统,用户在选择时可以根据它们的不同特点来选择适用场景。下面我们来看看格式化选NTFS还是exFAT,格式化NTFS后Mac不能用怎么办的相关内容。 一、格式化选NTFS还是exFAT 在数…

DevOps认证是什么?DevOps工具介绍

DevOps 这个词是由Development(开发) 和 Operations(运维)组合起来的,你可以把它理解成为一种让开发团队和运维团队紧密合作的方法。 DevOps从2009年诞生到现在已经14年多了,一开始大家还在摸索&#xff0…

Webpack: 插件架构之Hook体系

概述 Webpack 之所以能够应对 Web 场景下极度复杂、多样的构建需求,关键就在于其健壮、扩展性极强的插件架构,而插件架构的精髓又在于其灵活多变的 Hook 体系,可以说,只有真正掌握 Hook 底层设计与实现逻辑,深入理解不…

Git新仓库创建流程

平时需要创建新仓库,老要去查代码特别烦,在此写下流程方便备用. 1.创建新的云仓库 无论使用GitHub还是Gitee,首先要创建一个云仓库,这里就直接用国内的gitee做演示了,githup老挂加速器太烦,偷个懒. 我这里创建的是一个空仓库&…

SAP 表字段调整,表维护生成器调整

表维护生成器->已生成的对象->更改->专家模式
最新文章