RAG一文读懂!概念、场景、优势、对比微调与项目代码示例

本文结合“基于 ERNIE SDK+LangChain 搭建个人知识库”的代码示例,为您讲解 RAG 的相关概念。

01 概念

在2020年 Facebook AI Research(FAIR)团队发表一篇名为《Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks》的论文。这篇论文首次提出了 RAG 概念(目前大语言模型领域的一个重要概念),并对该概念进行详细介绍和解释。

image.png

此图是 FAIR 团队的方法概述。结合了一个预先训练的检索器(查询编码器+文档 Index),并进行端到端微调。对于查询 x,作者使用最大内积搜索(MIPS)查找前 K 个文档 zi 对于最终预测 y,并将 z 视为一个潜在变量,并在给定不同文献的 seq2seq 预测上进行边缘化。

RAG 模型结合了语言模型和信息检索技术。具体来说,当模型需要生成文本或者回答问题时,它会先从一个庞大的文档集合中检索出相关的信息,然后利用这些检索到的信息来指导文本的生成,从而提高预测的质量和准确性。

其中,“检索”、“利用”、“生成”是 RAG 的关键部分。那如何才能更直观地理解这三个部分呢?

举个简单的例子:

你正在写一篇关于小狗的文章,但你对小狗的知识有限。这时,你很可能会进行以下操作:

1.检索(Retrieval):首先,你打开电脑,输入关键词为“小狗”的搜索请求,在互联网上检索了大量的关于小狗的文章、博客和信息。

2.利用(Utilization):接下来,你会分析这些搜索结果,并提取其中的重要信息,包括狗狗的种类、行为习惯、饲养方式等等。你将这些信息整理成一个知识库,这个知识库就像一本百科全书,里面包含了各种关于小狗的知识点。

3.生成(Generation):现在,你需要写文章。在文章的开头,通过一个问题引入:“小狗的寿命有多长?”随后,便可以使用之前检索和整理的信息来回答问题,或者生成文章的段落。这一步不仅仅是简单地复制粘贴,而是根据上下文和语法规则生成自然流畅的文本。

image.png

其实上述“你”的工作流就是“RAG”的工作流,可以将“你”当作一个 RAG 模型,即“检索”、“利用”、“生成”。

了解了 RAG 的基本工作流之后,可能会思考:RAG 主要在什么场景下使用呢?

如果它们在这些场景中进行“检索”,“利用”和“生成”,具体的工作内容又是什么呢?

02 场景

RAG 技术可以在以下一些常见的自然语言处理任务中发挥作用:

1.问答系统(QA Systems):RAG 可以用于构建强大的问答系统,能够回答用户提出的各种问题。它能够通过检索大规模文档集合来提供准确的答案,无需针对每个问题进行特定训练。

2.文档生成和自动摘要(Document Generation and Automatic Summarization):RAG 可用于自动生成文章段落、文档或自动摘要,基于检索的知识来填充文本,使得生成的内容更具信息价值。

3.智能助手和虚拟代理(Intelligent Assistants and Virtual Agents):RAG 可以用于构建智能助手或虚拟代理,结合聊天记录回答用户的问题、提供信息和执行任务,无需进行特定任务微调。

4.信息检索(Information Retrieval):RAG 可以改进信息检索系统,使其更准确深刻。用户可以提出更具体的查询,不再局限于关键词匹配。

5.知识图谱填充(Knowledge Graph Population):RAG 可以用于填充知识图谱中的实体关系,通过检索文档来识别和添加新的知识点。

03 优势

以上是 RAG 一些常见的应用场景。明晰了 RAG 的应用范围后,可能会产生疑问:为什么这些场景需要使用 RAG,而不是进行微调或者通过其他方法来实现呢?

接下来,我们进一步了解 RAG 的优势。

以下为 RAG 的具体优势:

1.外部知识的利用:RAG 模型可以有效地利用外部知识库,它可以引用大量的信息,以提供更深入、准确且有价值的答案,这提高了生成文本的可靠性。

2.数据更新及时性:RAG 模型具备检索库的更新机制,可以实现知识的即时更新,无需重新训练模型。说明 RAG 模型可以提供与最新信息相关的回答,高度适配要求及时性的应用。

3.回复具有解释性:由于 RAG 模型的答案直接来自检索库,它的回复具有很强的可解释性,减少大模型的幻觉。用户可以核实答案的准确性,从信息来源中获取支持。

4.高度定制能力:RAG 模型可以根据特定领域的知识库和 prompt 进行定制,使其快速具备该领域的能力。说明 RAG 模型广泛适用于的领域和应用,比如虚拟伴侣、虚拟宠物等应用。

5.安全和隐私管理:RAG 模型可以通过限制知识库的权限来实现安全控制,确保敏感信息不被泄露,提高了数据安全性。

6.减少训练成本:RAG 模型在数据上具有很强的可拓展性,可以将大量数据直接更新到知识库,以实现模型的知识更新。这一过程的实现不需要重新训练模型,更经济实惠。

04 对比微调

接下来,通过对比 RAG 与微调,帮助大家根据具体的业务需求,选择合适的策略:

  • 任务特定 vs 通用性:微调通常是为特定任务进行优化,而RAG是通用的,可以用于多种任务。微调对于特定任务的完成效果好,但在通用性问题上不够灵活。

  • 知识引用 vs 学习:RAG 模型通过引用知识库来生成答案,而微调是通过学习任务特定的数据生成答案。RAG 的答案直接来自外部知识,更容易核实。

  • 即时性 vs 训练:RAG 模型可以实现即时的知识更新,无需重新训练,在及时性要求高的应用中占优势。微调通常需要重新训练模型,时间成本较高。

  • 可解释性 vs 难以解释性:RAG 的答案可解释性强,因为它们来自知识库。微调模型的内部学习可能难以解释。

  • 定制 vs 通用性:RAG 可以根据特定领域进行定制,而微调需要为每个任务进行特定微调,需要更多任务特定的数据。

结合上面的比较,我们可以清楚的看到 RAG 的优势在于通用性、知识引用、即时性和可解释性,而微调在特定任务上可能更适用,但同时需要更多的任务特定数据和训练。选择使用哪种方法,应根据具体的应用需求和任务来决定。

05 项目示例

那 RAG 具体怎么实现呢?

我们用一个简单的代码示例来举例:基于 ERNIE SDK 和 LangChain 搭建个人知识库。

▎安装ERNIE Bot

!pip install --upgrade erniebot
 测试embedding 
import erniebot
erniebot.api_type = "aistudio"
erniebot.access_token = "<你的token>"
response = erniebot.Embedding.create(
model="ernie-text-embedding",
input=[
    "我是百度公司开发的人工智能语言模型,我的中文名是文心一言,英文名是ERNIE-Bot,可以协助您完成范围广泛的任务并提供有关各种主题的信息,比如回答问题,提供定义和解释及建议。如果您有任何问题,请随时向我提问。" ])
print(response.get_result())

▎引入 Chromadb 向量数据库

!pip install chromadb

▎自定义嵌入函数

定义一个自定义的嵌入函数,用于将文本内容转换为嵌入向量。其中使用 ERNIE Bot 库来创建文本的嵌入,并且通过 Chromadb 库来管理这些嵌入向量。

import os
import erniebot
from typing import Dict, List, Optional 
import chromadb
from chromadb.api.types import Documents, EmbeddingFunction, Embeddings
def embed_query(content):
response = erniebot.embedding.create(
model="ernie-text-embedding",
input=[content])
result = response.get_result()
print(result)  
return result

class ErnieEmbeddingFunction(EmbeddingFunction): 
def __call__(self, input: Documents) -> Embeddings:
    embeddings = []
    for text in input:
        response = embed_query(text)
        try:
            embedding = response[0]   
            embeddings.append(embedding)
        except (IndexError, TypeError, KeyError) as e:
            print(f"Error processing text: {text}, Error: {e}")

    return embeddings
chroma_client = chromadb.Client()
 chroma_client = chromadb.PersistentClient(path="chromac") #数据保存硬盘位置 可选
collection = chroma_client.create_collection(name="demo", embedding_function=ErnieEmbeddingFunction())
print(collection)

▎导入数据集

选用课程内容作为知识库:

https://aistudio.baidu.com/datasetdetail/260836

▎文档切割

使用 LangChain 库来处理和分割文本文档

from langchain.text_splitter import CharacterTextSplitter
from langchain.vectorstores import Chroma
from langchain.document_loaders import TextLoader 
loader = TextLoader('./AI大课逐字稿.txt',encoding='utf-8')
documents = loader.load()
text_splitter = CharacterTextSplitter(chunk_size=600, chunk_overlap=20)
docs = text_splitter.split_documents(documents)
docs

▎Embedding 嵌入

将分割后的文档列表转换为嵌入向量,以便进行进一步的分析和处理。

import uuid
docs_list=[]
metadatas=[]
ids=[]
for item in docs:
docs_list.append(item.page_content)
metadatas.append({"source": "AI大课逐字稿"})
ids.append(str(uuid.uuid4())) 
collection.add(
documents=docs_list,
metadatas=metadatas,
ids=ids
)

▎检索

query = "讲师说见VC有两种错误的思维方式,分别是什么"

results = collection.query(
    query_texts=[query],
    n_results=2
) 
content=results['documents'][0]
[ ] 
prompt=f"""
用户问题:{query}
<context>
{content}
</context>
根据<context>里的知识点回答用户问题
"""
response = erniebot.ChatCompletion.create(model="ernie-4.0", messages=[{"role": "user", "content": prompt}])
print(response.get_result())
#讲师说见VC有两种错误的思维方式,分别是:
##1. 用过去的方式套今天的人工智能,比如比喻成OS。一旦比喻成操作系统,就得出结论全世界两套到三套,你觉得必然会被垄断、没有机会了,这种是典型的刻舟求剑。
#2. 人容易对已经成功的事委曲求全,对于创新的新生代创业者容易求全责备。特别是有些做VC容易犯这个错误,比如OpenAI做成了,已经证明了,是个傻子都能看到OpenAI做的很成功,我们容易对它顶礼膜拜,恨不得跪下。对创业者很多还不成形的想法,因为八字没有一撇,光看到了你的很多缺点,这种价值观是不对的,容易Miss掉一些有潜力的项目。

▎封装函数

包含了之前步骤中存储的文本嵌入向量。函数的目的是接收用户的查询,从数据库中检索相关信息,并生成一个回答。

def main(query):
    results = collection.query(
    query_texts=[query],
    n_results=2
)
    content=results['documents'][0]
    prompt=f"""
    用户问题:{query}
    <context>
    {content}
    </context>
    根据<context>里的知识点回答用户问题
    """
    response = erniebot.ChatCompletion.create(model="ernie-4.0", messages=[{"role": "user", "content": prompt}])
    return response.get_result()
query=input("请输入您要查询的问题:")
print(main(query))

代码地址:

https://aistudio.baidu.com/projectdetail/7431640

显然,RAG 的应用不仅仅满足于此,目前也诞生了各种 RAG 的高阶用法。

通过不断优化 RAG,使其具有更强大的信息理解能力,理解问题更加透彻,找到与问题高度匹配的信息后,生成更为精准的答案。比如针对“讲一下金毛犬的特点”这一指令,高级 RAG 模型可以理解这是一个关于小狗特定品种的问题,将从知识库中提取金毛犬的细节信息,如体格、性格、历史等,以对齐问题的颗粒度,提供详细的回答。

在优化 RAG 的过程中,也产生了一系列相关的方法。

在信息检索和搜索引擎优化领域,通过实施一系列策略可以显著提升检索系统的性能。索引优化通过提升数据粒度、优化索引结构、添加元数据信息、对齐优化和混合检索等方法,可以提高检索的准确性和效率。向量表征模型的优化通过微调和动态嵌入技术,增强了模型对特定领域或问题的理解能力。检索后处理策略如重排序和 Prompt 压缩,进一步提升了检索结果的相关性和用户满意度。递归检索和搜索引擎优化通过递归检索和子查询等技术,实现了更复杂和精确的检索需求。最后,RAG 评估通过独立评估和端到端评估方法,确保了检索系统在各个方面都能满足用户的需求。这些策略的实施,共同推动了检索技术的进步,为用户提供了更加高效和精准的信息服务。

具体参考下图:

image.png

除了以上5种方法,还有其他很多高级的 RAG 用法,大家可以针对感兴趣的部分自行查阅相关论文,进行学习了解。

——————END——————

推荐阅读

教不会你算我输系列 | 手把手教你HarmonyOS应用开发

揭秘百度数仓融合计算引擎

云上业务一键性能调优,应用程序性能诊断工具 Btune 上线

数据库运维工作量直接减少 50%,基于大模型构建智能问答系统的技术分享

百度智能云千帆 AppBuilder 构建 AI 原生应用开发新范式

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

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

相关文章

Midjourney绘图欣赏系列(九)

Midjourney介绍 Midjourney 是生成式人工智能的一个很好的例子&#xff0c;它根据文本提示创建图像。它与 Dall-E 和 Stable Diffusion 一起成为最流行的 AI 艺术创作工具之一。与竞争对手不同&#xff0c;Midjourney 是自筹资金且闭源的&#xff0c;因此确切了解其幕后内容尚不…

行业认可 | 海云安上榜《2024年网络与信息安全行业全景图》多个领域

近日&#xff0c;深圳市网络与信息安全行业协会正式发布《2024年网络与信息安全行业全景图》。海云安凭借过硬的技术实力及成熟的网络与信息安全产品及服务获得行业认可&#xff0c;入围6大类目共计17项细分领域。包括&#xff1a; 业务安全&#xff08;软硬件开发安全、人工智…

《vtk9 book》 官方web版 第3章 - 计算机图形基础 (5 / 5)

vtkProp的组件和其他类型 通常希望将演员收集到一个依赖于变换的层次结构中。例如&#xff0c;一个机器人手臂可以由刚性连接的链接表示&#xff0c;这些链接在肩关节、上臂、肘部、下臂、腕关节和手部等关节处连接在一起。在这种配置中&#xff0c;当肩关节旋转时&#xff0c;…

[C++]20.实现红黑树。

实现红黑树 一.基本概念&#xff1a;1.红黑树的概念&#xff1a;2.红黑树的性质&#xff1a; 二.实现红黑树&#xff1a;1.基本结构&#xff1a;2.插入节点的多种情况&#xff1a;1.叔叔存在且为红&#xff1a;2.叔叔不存在/存在且为黑(单旋变色)3.叔叔不存在/存在且为黑(多旋&…

Wi-Fi 6E简介:扩展Wi-Fi的频谱资源

一、Wi-Fi 6E是什么&#xff1f; Wi-Fi 6E是Wi-Fi 6的一个增强版本&#xff0c;其中的“E”代表“Extended”。它采用了相同的技术标准&#xff0c;但使用了更高的频段。Wi-Fi 6E在5 GHz频段之外引入了新的6 GHz频段&#xff0c;为用户提供了更多的可用频谱&#xff0c;以便提…

滑动窗口算法(1)

目录 基本概念 209.长度最小的子数组 一、题目描述 二、思路解析 三、代码 3.无重复字符的最长子串 一、题目描述 二、思路解析 三、代码 1004.最大连续1的个数 一、题目描述 二、思路解析 三、代码 1658.将x减到0的最小操作数 一、题目描述 二、思路解析 三、…

JSP-内置对象

Out对象 作用&#xff1a;用来给页面输出数据。 主要方法&#xff1a; Print(string) </br>换行 Println(string) 方法同上 <%page language"java" contentType"text/html;charsetUTF-8"%> <html><head><title>test.…

基于深度学习的图像去雨去雾

基于深度学习的图像去雨去雾 文末附有源码下载地址 b站视频地址&#xff1a; https://www.bilibili.com/video/BV1Jr421p7cT/ 基于深度学习的图像去雨去雾&#xff0c;使用的网络为unet&#xff0c; 网络代码&#xff1a; import torch import torch.nn as nn from torchsumm…

Prompt提示工程上手指南:基础原理及实践(二)-Prompt主流策略

前言 上篇文章将Prompt提示工程大体概念和具体工作流程阐述清楚了&#xff0c;我们知道Prompt工程是指人们向生成性人工智能&#xff08;AI&#xff09;服务输入提示以生成文本或图像的过程中&#xff0c;对这些提示进行精炼的过程。生成人工智能是一个根据人类和机器产生的数…

【Python】使用plt库绘制动态曲线图,并导出为GIF或MP4

一、绘制初始图像 正常使用plt进行绘图&#xff0c;这里举例一个正弦函数&#xff1a; 二、绘制动态图的每一帧 思路&#xff1a; 根据横坐标点数绘制每一帧画面每次在当前坐标处&#xff0c;绘制一个点和垂直的线&#xff0c;来表示当前点可以在点上加个坐标等样式来增加…

Gut Microbes | 新生儿微生物组研究的方法学挑战

摘要 新生儿出生后&#xff0c;肠道菌群的定植对新生儿的健康发育起着至关重要的作用&#xff0c;并影响其日后的健康和疾病。了解新生儿肠道菌群的发育以及其与新生儿宿主的相互作用是一个重要的研究领域。然而&#xff0c;该领域的研究必须解决影响研究方法设计和实施的一系…

【Java系列】OOM 时,JVM 堆栈信息保存和分析

一、前言 在日常开发中&#xff0c;即使代码写得再谨慎&#xff0c;免不了还是会发生各种意外的事件&#xff0c;比如服务器内存突然飙高&#xff0c;又或者发生内存溢出(OOM)。当发生这种情况时&#xff0c;我们怎么去排查&#xff0c;怎么去分析原因呢&#xff1f; 一般遇到…

展厅设计中灯光的要点都是什么

1、白炽灯 白炽灯也就是普通普通白炽灯泡白炽灯有显色性强&#xff0c;开灯即亮&#xff0c;明暗可调&#xff0c;结构简单&#xff0c;造价低等优点&#xff0c;但缺点是使用寿命短&#xff0c;光效较低展厅设计中常使用于走道和其他部位。 2、卤钨灯 充气白炽灯填充气体中含有…

代码随想录day20(1)二叉树:二叉树的最小深度(leetcode111)

题目要求&#xff1a;求出一棵二叉树的最小深度 思路&#xff1a;最小深度指的是从根节点到最近叶子节点的最短路径上的节点数量&#xff08;左右孩子必须都为空&#xff01;&#xff09;。思路类似于求二叉树的最大深度&#xff0c;仍然采用后序遍历&#xff0c;增加判断只有…

Docker启动安装nacos(踩过坑版)

1、Docker 拉取镜像 docker pull nacos/nacos-server:v2.1.0 2、创建宿主机挂载目录 mkdir -p /mydata/nacos/logs/ mkdir -p /mydata/nacos/conf/ 3、启动nacos并复制文件到宿主机&#xff0c;关闭容器 启动容器 docker run -p 8848:8848 --name nacos -d nacos/nacos-se…

通过Maven创建Web工程

通过Maven创建Web工程 方式一方式二 方式一 1.先创建一个Maven工程 2.把该Maven模块的pom文件里添加一个war 3.选中该Maven模块 点击项目架构 4.手动添加一个Web架构 方式二 1.也是new一个模块 但是直接配置好Web 2.这里就是我IDEA对Maven的设置 3.第一次创建 可能…

【C++】STL--String

这一节主要总结string类的常见接口&#xff0c;以及完成了string类的模拟实现。 目录 标准库的String类 string类常见接口 string类对象的常见构造 string析构函数&#xff1a;~string string类对象的容量操作 string类对象的访问及遍历操作 string类对象的修改操作 s…

jvm题库详解

1、JVM内存模型 注意&#xff1a;这个是基于jdk1.8之前的虚拟机&#xff0c;在jdk1.8后 已经没有方法区&#xff0c;一并合并到堆中的元空间了 JVM内存区域总共分为两种类型 线程私有区域&#xff1a;程序计数器、本地方法栈和虚拟机栈 线程共享区域&#xff1a;堆&#xff08…

让若依生成的service、mapper继承mybatisPlus的基类

前言&#xff1a;若依继承mybatisPlus后&#xff0c;生成代码都要手动去service、serviceImpl、mapper文件去继承mybatisplus的基类&#xff0c;繁琐死了。这里通过修改若依生成模版从而达到生成文件后直接使用mybatisPlus的方法。 一、首先找到若依生成模版文件位置&#xff…

顶顶通呼叫中心中间件-群集模式配置

文章目录 群集模式介绍联系我们配置流程群集模式下呼叫线路配置 群集模式介绍 在大规模的外呼或者呼入系统&#xff0c;比如整个系统需要1万并发&#xff0c;单机最高也就3000-5000并发&#xff0c;这时候就需要多机群集了。顶顶通呼叫中心中间件使用的是 redis 数据库&#x…
最新文章