什么是检索增强生成(Retrieval-Augmented Generation,RAG)

什么是RAG?

检索增强生成(Retrieval-Augmented Generation,RAG),是指为大模型提供外部知识源的概念。能够让大模型生成准确且符合上下文的答案,同时能够减少模型幻觉。

用最通俗的语言描述:在已有大模型的基础上,外挂一个知识库,让大模型学习这个知识库后,回答的内容与知识库更为相关,与实际业务场景更加贴切,符合我们的需求。

为什么要用RAG?

  • 模型知识局限性:现有主流大模型的训练集基本都是基于网络公开的数据,如ChatGPT最新数据截止至2021年。因此,对于一些实时性的、非公开的或离线的最新数据是无法获取到的,这部分知识也就无从具备。
  • 幻觉问题:AI模型的底层原理都是基于概率预测,其模型输出实质上是一系列概率运算,它有时候会一本正经地胡说八道,尤其是在大模型自身不具备某一方面的知识或不擅长的场景。而这种幻觉问题的区分是比较困难的,因为它要求使用者自身具备相应领域的知识。
  • 数据安全性:对于企业、机关单位等部门来说,数据安全至关重要,没有人愿意承担数据泄露的风险,将自身的私域数据上传第三方平台进行训练。这也导致完全依赖通用大模型自身能力的应用方案不得不在数据安全和效果方面进行取舍。

上述问题的存在,可以用RAG技术解决。大体结构如图所示。

RAG结构大致流程

完整的RAG应用流程主要包含两个阶段:

  • 数据准备阶段:数据提取——>文本分割——>向量化(embedding)——>数据入库

  • 应用阶段:用户提问——>数据检索(召回)——>注入Prompt——>LLM生成答案

数据准备阶段:

数据提取:

  • 数据加载:包括多格式数据加载、不同数据源获取等,根据数据自身情况,将数据处理为同一个范式。

  • 数据处理:包括数据过滤、压缩、格式化等。

  • 元数据获取:提取数据中关键信息,例如文件名、Title、时间等 。

文本分割:

文本分割主要考虑两个因素:1)embedding模型的Tokens限制情况;2)语义完整性对整体的检索效果的影响。一些常见的文本分割方式如下:

  • 句分割:以”句”的粒度进行切分,保留一个句子的完整语义。常见切分符包括:句号、感叹号、问号、换行符等。

  • 固定长度分割:根据embedding模型的token长度限制,将文本分割为固定长度(例如256/512个tokens),这种切分方式会损失很多语义信息,一般通过在头尾增加一定冗余量来缓解。

向量化(embedding)

向量化是一个将文本数据转化为向量矩阵的过程,该过程会直接影响到后续检索的效果。目前常见的embedding模型如表中所示,这些embedding模型基本能满足大部分需求,但对于特殊场景(例如涉及一些罕见专有词或字等)或者想进一步优化效果,则可以选择开源Embedding模型微调或直接训练适合自己场景的Embedding模型。

数据入库:

数据向量化后构建索引,并写入数据库的过程可以概述为数据入库过程,适用于RAG场景的数据库包括:FAISS、Chromadb、ES、milvus等。一般可以根据业务场景、硬件、性能需求等多因素综合考虑,选择合适的数据库。一般现有API多以Chromadb为主。

总结如图:

应用阶段

关键环节包括:数据检索、注入Prompt等。

数据检索

常见的数据检索方法包括:相似性检索、全文检索等,根据检索效果,一般可以选择多种检索方式融合,提升召回率。

  • 相似性检索:即计算查询向量与所有存储向量的相似性得分,返回得分高的记录。常见的相似性计算方法包括:余弦相似性、欧氏距离、曼哈顿距离等。
  • 全文检索:全文检索是一种比较经典的检索方式,在数据存入时,通过关键词构建倒排索引;在检索时,通过关键词进行全文检索,找到对应的记录。

Prompt注入

Prompt作为大模型的直接输入,是影响模型输出准确率的关键因素之一。在RAG场景中,Prompt一般包括任务描述、背景知识(检索得到)、任务指令(一般是用户提问)等,根据任务场景和大模型性能,也可以在Prompt中适当加入其他指令优化大模型的输出。Prompt的设计只有方法、没有语法,比较依赖于个人经验,在实际应用过程中,往往需要根据大模型的实际输出进行针对性的Prompt调优。

参考:

  1. 一文搞懂大模型RAG应用(附实践案例)
  2. 一文带你了解大模型的RAG(检索增强生成)

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

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

相关文章

第十四届蓝桥杯软件赛省赛C/C++ C组 思路讲解与参考代码

A. 求和&#xff1a; 问题描述 求 11 &#xff08;含&#xff09;至 2023040820230408 &#xff08;含&#xff09;中每个数的和。 思路&#xff1a;等差数列&#xff0c;d位1&#xff0c;Sn &#xff08;a1an&#xff09;*n/2; 参考代码&#xff1a; #include <iost…

动态规划-----背包类问题(0-1背包与完全背包)详解

目录 什么是背包问题&#xff1f; 动态规划问题的一般解决办法&#xff1a; 0-1背包问题&#xff1a; 0 - 1背包类问题 分割等和子集&#xff1a; 完全背包问题&#xff1a; 完全背包类问题 零钱兑换II: 什么是背包问题&#xff1f; 背包问题(Knapsack problem)是一种…

obspy安装

最近在安装obspy时经常&#xff0c;试了各种方法 conda install obspy pip install obspy 发现都没有办法&#xff0c;包括选择了很多镜像源。 C: \Users admin>conda config -add channels https://mirrors. sustech. edu. cn/anaconda/cloud/biocondal (base)C:\Users…

qtcreator的信号槽链接

在ui文件中简单创建一个信号槽连接并保存可以在ui_mainwindow.h下 class Ui_MainWindow 类 void setupUi(QMainWindow *MainWindow)函数 找到对应代码 QObject::connect(pushButton, SIGNAL(clicked()), MainWindow, SLOT(close())); 下拉&#xff0c;由于 class MainWind…

书生·浦语大模型实战营之全链路开源体系

书生浦语大模型实战营之全链路开源体系 为了推动大模型在更多行业落地开花&#xff0c;让开发者们更高效的学习大模型的开发与应用&#xff0c;上海人工智能实验室重磅推出书生浦语大模型实战营&#xff0c;为广大开发者搭建大模型学习和实践开发的平台&#xff0c;两周时间带…

按大小顺序输出任一三个数据(C语言)

一、运行结果&#xff1b; 二、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h>//实现比较函数&#xff1b; int Compare(int a, int b, int c) {//比较a,c的大小&#xff1b;if (a < c){//输出结果&#xff1b;printf("%d > %d &…

如何关闭win10防火墙,怎么关闭win10防火墙通知

Windows10系统自带了防火墙功能,可以有效阻止病毒软件入侵,一般情况下是默认开启的。但是有时候我们下载一些软件,或使用某些功能时,就需要提前将它关闭,以免防火墙阻止正常运作。那么如何关闭win10防火墙呢?网上介绍关于win10系统关闭防火墙的处理方法比较零散,这里小编…

共享办公室行业面临的最大挑战是什么,未来有哪些可能的发展方向

共享办公室行业虽然发展迅速&#xff0c;但也面临着一些挑战和需要解决的问题。咱们来聊聊这行业的最大挑战和未来可能的发展方向。 面临的最大挑战&#xff1a; 市场竞争加剧&#xff1a;随着共享办公室的火热&#xff0c;越来越多的玩家进入市场&#xff0c;竞争变得异常激烈…

安装部署MariaDB数据库管理系统

目录 一、初始化MariaDB服务 1、安装、启动数据库服务程序、将服务加入开机启动项中。 2、为保证数据库安全性和正常运转&#xff0c;需要对数据库程序进行初始化操作。 3、配置防火墙&#xff0c;放行对数据库服务程序的访问请求&#xff0c;允许管理员root能远程访问数据…

应用层协议之DNS协议

一.应用层协议的相关数据传输格式 1.文本字符串格式 应用层主要是自定义协议&#xff0c;以点外卖为例&#xff1a; 客户点开软件&#xff0c;就是应用程序和服务器之间进行网络通信交互。请求和响应可以如下设置 请求&#xff1a;用户信息&#xff0c;位置信息&#xff0c…

比KMP简单的Manacher

P3805 【模板】manacher - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) “没时间悼念KMP了&#xff0c;接下来上场的是Manacher&#xff01;” 什么是Manacher? 历史背景&#xff1a; 1975 年&#xff0c;一个叫 Manacher 的人发明了这个算法&#xff0c;所以叫Manacher 算…

【JavaWeb】Day28.SpringBootWeb请求响应——请求(一)

前言&#xff1a; 我们在开发web程序时呢&#xff0c;定义了一个控制器类Controller&#xff0c;请求会被部署在Tomcat中的Controller接收&#xff0c;然后Controller再给浏览器一个响应。 而在请求响应的过程中是遵循HTTP协议的。 但是&#xff0c;在Tomcat这类Web服务器中&a…

vivado JTAG 回退支持

JTAG 回退支持 基于 XVC 的调试解决方案可配合 AXI 主接口 &#xff08; 如 PCIe XDMA IP &#xff09; 一起使用。如果 AXI 主接口被挂起 &#xff0c; 或者无法正常 运作&#xff0c; 则无法在此类情况下进行调试。为了提供基于 JTAG 的回退调试途径 &#xff08; 与 X…

【Java多线程】8——CompletableFuture

8 CompletableFuture ⭐⭐⭐⭐⭐⭐ Github主页&#x1f449;https://github.com/A-BigTree 笔记仓库&#x1f449;https://github.com/A-BigTree/tree-learning-notes 个人主页&#x1f449;https://www.abigtree.top ⭐⭐⭐⭐⭐⭐ 如果可以&#xff0c;麻烦各位看官顺手点个s…

Native Instruments Kontakt 7 for Mac v7.9.0 专业音频采样

Native Instruments Kontakt 7是一款强大的软件采样器&#xff0c;它允许用户从各种来源采样音频并进行编辑和处理。它包含大量预设采样库&#xff0c;包括乐器、合成器、鼓组和声音效果等。此外&#xff0c;Kontakt 7还允许用户创建自己的采样库&#xff0c;以便根据自己的需要…

排列函数与组合函数

总实现&#xff1a; #include <iostream> using namespace std; long long CC(int a, int b)//求组合函数&#xff0c;a为C的下标&#xff0c;b为C上标&#xff0c;即:Ca!/(b!*(a-b)!) {int res 1; //记录结果for (int i a, j 1; j < b; i--, j){res * i / j;}r…

2025第四届CHWE出海网全球跨境电商展览会

2025第四届CHWE出海网全球跨境电商展览会 时间&#xff1a;2025年3月20-22日 地点&#xff1a;深圳会展中心&#xff08;福田&#xff09; 预订以上展会详询陆先生 I38&#xff08;前三位&#xff09; I82I&#xff08;中间四位&#xff09; 9I72&#xff08;后面四位&am…

数据结构(六)——图的遍历

6.3 图的遍历 6.3.1 图的广度优先遍历 ⼴度优先遍历&#xff08;Breadth-First-Search, BFS&#xff09;要点&#xff1a; 1. 找到与⼀个顶点相邻的所有顶点 2. 标记哪些顶点被访问过 3. 需要⼀个辅助队 FirstNeighbor(G,x)&#xff1a;求图G中顶点x的第⼀个邻接点&#xff…

小练习——if,switch语句,根据年份计算生肖

需求&#xff1a;根据用户输入的年份计算他是什么生肖 举例&#xff1a;输入2024年&#xff0c;控制台会显示你属龙 所用技术&#xff1a;控制台输入 Scanner if 语句 / switch语句 控制台输入 Java控制台输入的三种实现方法&#xff1a;使用标准输入对象System.in&#xff…

C语言预处理详解

前言 上篇博客我们总结了编译与链接&#xff0c;有说过编译里第一步是预处理&#xff0c;那本篇博客将对预处理进行进一步的详细的总结 个人主页&#xff1a;小张同学zkf 若有问题 评论区见 感兴趣就关注一下吧 目录 1. 预定义符号 2. #define 定义常量 3. #define定义宏 4…