RAG基础功能优化、以及RAG架构优化

RAG基础功能优化

对RAG的基础功能优化,我们要从RAG的流程入手[1],可以在每个阶段做相应的场景优化。

图片

从RAG的工作流程看,能优化的模块有:文档块切分、文本嵌入模型、提示工程优化、大模型迭代。下面针对每个模块分别做说明:

  • 文档块切分:设置适当的块间重叠、多粒度文档块切分、基于语义的文档切分、文档块摘要。

  • 文本嵌入模型:基于新语料微调嵌入模型、动态表征。

  • 提示工程优化:优化模板增加提示词约束、提示词改写。

  • 大模型迭代:基于正反馈微调模型、量化感知训练、提供大context window的推理模型。

此外,还可对query召回的文档块集合进行处理,比如:元数据过滤[7]、重排序减少文档块数量[2]。

RAG架构优化

2.1 Vector+KG RAG

经典的RAG架构中,context增强只用到了向量数据库。这种方法有一些缺点,比如无法获取长程关联知识[3]、信息密度低(尤其当LLM context window较小时不友好)。

图片

图2 跨chunk的关联知识向量库无法获取

那此题是否可解?答案是肯定的。一个比较好的方案是增加一路与向量库平行的KG(知识图谱)上下文增强策略。其技术架构图大致如下[4]:

图片

图3 基于KG+VS进行上下文增强

图3中query进行KG增强是通过NL2Cypher模块实现的。根据我的实践,我们可用更简单的图采样技术来进行KG上下文增强。具体流程是:根据query抽取实体,然后把实体作为种子节点对图进行采样(必要时,可把KG中节点和query中实体先向量化,通过向量相似度设置种子节点),然后把获取的子图转换成文本片段,从而达到上下文增强的效果。

LangChain官网提供了一个通过Graph对RAG应用进行增强的DevOps的例子,感兴趣的读者可以详细研究[5]。

2.2 Self-RAG

经典的RAG架构中(包括KG进行上下文增强),对召回的上下文无差别地与query进行合并,然后访问大模型输出应答。但有时召回的上下文可能与query无关或者矛盾,此时就应舍弃这个上下文,尤其当大模型上下文窗口较小时非常必要(目前4k的窗口比较常见)。

那有解决办法吗?答案又是肯定的,一个较好的解决方案是Self-RAG技术。由于篇幅所限,此处介绍其推理过程,训练过程需要借助GPT4进行辅助打标,就不展开说了。详细过程可参考我对Self-RAG的总结[6]。

图片

图4 RAG vs Self-RAG

如图4所示,右侧就是Self-RAG的工作流程。首先,根据query判断是否需要检索。如果需要,才检索若干passage,然后经一系列处理生成若干next segment候选。最后,对这些候选segment进行排序,生成最终的next segment。

Self-RAG的推理过程相对训练较简单,其算法内容如下:

图片

图5 Self-RAG推理算法

2.3 多向量检索器多模态RAG

本小节涉及三种工作模式[7],具体为:

  • 半结构化RAG(文本+表格)

  • 多模态RAG(文本+表格+图片)

  • 私有化多模态RAG(文本+表格+图片)

1)半结构化RAG(文本+表格)

图片

图6 半结构化RAG

此模式要同时处理文本与表格数据。其核心流程梳理如下[8]:

  1. 将原始文档进行版面分析(基于Unstructured工具[9]),生成原始文本 和 原始表格。

  2. 原始文本和原始表格经summary LLM处理,生成文本summary和表格summary。

  3. 用同一个embedding模型把文本summary和表格summary向量化,并存入多向量检索器。

  4. 多向量检索器存入文本/表格embedding的同时,也会存入相应的summary和raw data。

  5. 用户query向量化后,用ANN检索召回raw text和raw table。

  6. 根据query+raw text+raw table构造完整prompt,访问LLM生成最终结果。

2)多模态RAG(文本+表格+图片)

对多模态RAG而言,有三种技术路线[10],见下图:

图片

图7 多模态RAG

如图7所示,对多模态RAG而言有三种技术路线,如下我们做个简要说明:

  • 选项1:对文本和表格生成summary,然后应用多模态embedding模型把文本/表格summary、原始图片转化成embedding存入多向量检索器。对话时,根据query召回原始文本/表格/图像。然后将其喂给多模态LLM生成应答结果。

  • 选项2:首先应用多模态大模型(GPT4-V、LLaVA、FUYU-8b)生成图片summary。然后对文本/表格/图片summary进行向量化存入多向量检索器中。当生成应答的多模态大模型不具备时,可根据query召回原始文本/表格+图片summary。

  • 选项3:前置阶段同选项2相同。对话时,根据query召回原始文本/表格/图片。构造完整Prompt,访问多模态大模型生成应答结果。

3)私有化多模态RAG(文本+表格+图片)

如果数据安全是重要考量,那就需要把RAG流水线进行本地部署。比如可用LLaVA-7b生成图片摘要,Chroma作为向量数据库,Nomic's GPT4All作为开源嵌入模型,多向量检索器,Ollama.ai中的LLaMA2-13b-chat用于生成应答[11]。

参考资料

  1. Chatbots | ️ Langchain

  2. Rerankers and Two-Stage Retrieval | Pinecone

  3. Custom Retriever combining KG Index and VectorStore Index

  4. Enhanced QA Integrating Unstructured Knowledge Graph Using Neo4j and LangChain

  5. https://blog.langchain.dev/using-a-knowledge-graph-to-implement-a-devops-rag-application/

  6. AI pursuer:揭秘Self-RAG技术内幕

  7. Multi-Vector Retriever for RAG on tables, text, and images:Multi-Vector Retriever for RAG on tables, text, and images

  8. https://github.com/langchain-ai/langchain/blob/master/cookbook/Semi_Structured_RAG.ipynb?ref=blog.langchain.dev

  9. Unstructured | The Unstructured Data ETL for Your LLM

  10. https://github.com/langchain-ai/langchain/blob/master/cookbook/Semi_structured_and_multi_modal_RAG.ipynb?ref=blog.langchain.dev

  11. https://github.com/langchain-ai/langchain/blob/master/cookbook/Semi_structured_multi_modal_RAG_LLaMA2.ipynb?ref=blog.langchain.dev

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

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

相关文章

【C++】vector的使用及模拟实现

目录 一、vector的介绍及使用1.1 介绍vector1.2 vector的使用1.2.1 构造1.2.2 遍历访问1.2.3 容量空间1.2.4 增删查改 二、vector的模拟实现2.1 成员变量2.2 迭代器相关函数2.3 构造-析构-赋值重载2.3.1 无参构造2.3.2 有参构造12.3.3 有参构造22.3.4 拷贝构造2.3.5 赋值重载2.…

【线路图】 DC-DC升压恒压控制驱动芯片 2.8-40V AP8100

说明 AP8100 是一款外围电路简单的 BOOST 升压恒压控 制驱动芯片,适用于 2.8-40V 输入电压范围的升压恒 压电源应用领域,启动电压可以低至 2.5V 。 芯片会根据负载的大小自动切换 PWM , PFM 和 BURST 模式以提高各个负载端的…

【U盘修复】

U盘当成重装系统的U盘启动器之后,可能会从128G显示为 32 G,并且Windows自带的分区工具不管用,其实并不是U盘坏了,此时你需要将此U盘的所有分区删除,然后创建新的分区。 推荐使用的一款分区(Partition&…

02-python的基础语法-01python字面量/注释/数据类型/数据类型转换

字面量 在代码中,被写下来的固定的值,被称为字面量。 python中哪些值是可以被写出来的呢?又该如何写呢? 字符串:又称文本,是由任意数量的字符如中文,英文,各类符号,数字组成。 这…

一文解析 Copycat Dex与 Bitcat Dex的区别

Copycat Dex和 Bitcat Dex都带一个 Cat 并且都是衍生品协议,很多人都会误认为这两个是同一个项目,实际不然。它们是面向两个不同赛道、不同资产类型的衍生品项目。 Copycat Dex和 Bitcat Dex都是衍生品 DEX,它们最本质的区别主要在于&#xf…

前后端跨域问题

告别烦恼,彻底解决跨域问题的终极指南-chrome的安全进阶之路_chrom 强制跨域-CSDN博客

Linux内核架构和工作原理详解(二)

Linux内核体系结构简析简析 图1 Linux系统层次结构 最上面是用户(或应用程序)空间。这是用户应用程序执行的地方。用户空间之下是内核空间,Linux 内核正是位于这里。GNU C Library (glibc)也在这里。它提供了连接内核…

软件测试要学习的基础知识——白盒测试

白盒测试是通过检查软件内部的逻辑结构,对软件中的逻辑路径进行覆盖测试,以确定实际运行状态与预期状态是否一致。 白盒测试又被称为: 透明盒测试 结构化测试 逻辑驱动测试 基于代码的测试 白盒测试的常用技术分类 一、静态分析&#x…

LLM之LangChain(二)| LangChain中的Agent

在本文中,我们将讨论LangChain中的Agent及其各种类型。但在深入研究Agent之前,让我们先了解一下什么是LangChain和Agent。 一、什么是LangChain? LangChain是一种功能强大的自动化工具,可用于各种任务,它提供了可用于…

【AIGC】智能革命的动物寓言——颠覆性的智慧之美

AIGC动物提示词绘画技巧 利用AIGC(Artificial Intelligence Generated Content,人工智能生成内容)技术进行绘画创作时,可以结合上述关键信息来设计和绘制不同风格的角色。具体步骤和讲解如下: 输入关键信息与风格设定…

C语言——详解字符函数和字符串数组(上)

目录 一、strlen的使用和模拟实现 1.strlen()函数的介绍 2.strlen()函数的具体使用 3.strlen函数的注意事项 4.strlen函数的模拟实现 二、strcpy的使用和模拟实现 1.strcpy()函数的介绍 2.strcpy()函数的具体使用 3.strcpy()函数的注意事项 4.strcpy函数的模拟实现 …

数据库概述、部署MySQL服务、必备命令 、密码管理、安装图形软件、SELECT语法 、筛选条件

1 案例1:构建MySQL服务器 1.1 问题 在IP地址192.168.88.50主机和192.168.88.51主机上部署mysql服务练习必备命令的使用 1.2 方案 准备2台虚拟机,要求如下: 1.3 步骤 实现此案例需要按照如下步骤进行。 步骤一:安装软件 命令…

2024.1.16 网络编程 作业

思维导图 练习题 1.基于UDP的TFTP文件传输&#xff0c;实现文件下载上传 #include <myhead.h>int main(int argc, char const *argv[]) {// 创建套接字UDP通信int sockfd socket(AF_INET, SOCK_DGRAM, 0);if (-1 sockfd){perror("socket error");return -1…

Qt-UI界面无法输入名字

在UI界面“在这里输入”&#xff0c;直接双击填写名称&#xff0c;无论是中文还是英文都没有反应。解决方案&#xff1a; 双击“在这里输入之后”&#xff0c;在可编辑状态下&#xff0c;空格→enter键&#xff0c;然后在右下角属性框的title中直接填写中文或英文名&#xff0…

C#核心--思维导图

对应《C#--核心》&#xff08;http://t.csdnimg.cn/cpRbZ&#xff09;

SQL 语言详解

SQL 详解 我们通常可以将 SQL 分为四类&#xff0c;分别是 DDL&#xff08;数据定义语言&#xff09;、DML&#xff08;数据操作语言&#xff09;、DQL&#xff08;数据查询语言&#xff09;和 DCL&#xff08;数据控制语言&#xff09;。DDL 主要用于创建、删除、修改数据库中…

LeetCode刷题---反转链表II

LeetCode官方给出的解题思路 在需要反转的区间里&#xff0c;每遍历到一个节点&#xff0c;让这个新节点来到反转部分的起始位置。 使用了三指针的思想。 定义三个节点: curr&#xff1a;指向待反转区域的第一个节点 left&#xff1b; next&#xff1a;永远指向 curr 的下一个节…

uni-app的组件(一)

scroll-view 可滚动视图区域。用于区域滚动 <scroll-view scroll-y"true" :scroll-top"scrollTop" class"scroll-y" scroll"scroll"><view id"demo1" class"scroll-view-item bg-red">A</view>…

通过IDE和jar包运行时加载json配置文件

程序中使用了json配置文件&#xff0c;位置在$rootPath/src/main/resources/config.json, 调试时使用IDE&#xff0c;但运行时使用Jar包&#xff0c;加载config.json配置文件的代码如下&#xff1a; public ConfigParser(String configFileName) throws IOException {try{Inp…

C++ 图形界面学习效果及代码

#include <stdio.h> #include<conio.h> #include <stdlib.h> #include<graphics.h> #define WIDTH 800 #define HEIGHT 480 #define SIZE 20 int main() {const char* str "人生就是由欲望不满足而痛苦和满足之后无趣这两者所构成";const …
最新文章