检索增强内容生成(RAG)1·RAG及其技术的概述

🌈 个人主页:十二月的猫-CSDN博客
🔥 系列专栏: 🏀深度学习_十二月的猫的博客-CSDN博客

💪🏻 十二月的寒冬阻挡不了春天的脚步,十二点的黑夜遮蔽不住黎明的曙光 

目录

1. 前言

2. 什么是检索增强生成

3. RAG技术的核心难点

3.1 加载

3.2 切片

3.3 量化

3.4 检索

4. 总结


1. 前言

有一个名为 LangChain 的流行开源库,它可以创建聊天机器人,其中包括用 3 行代码对任何网站/文档进行问答。这是 LangChain 文档中的一个示例

网站/文档问答本质:

  1. 理解问题
  2. 根据问题内容在网站/文档中检索信息
  3. 将其中和问题相关的信息输出
from langchain.document_loaders import WebBaseLoader
from langchain.indexes import VectorstoreIndexCreator

loader = WebBaseLoader("http://www.paulgraham.com/greatwork.html")
index = VectorstoreIndexCreator().from_loaders([loader])
index.query("What should I work on?")

它输出特定于 Paul Graham 文章(greatwork)的答案:
The work you choose should ideally have three qualities: it should be something you have a natural aptitude for, something you have a deep interest in, and something that offers scope to do great work. If you're unsure, you could start by working on your own projects that seem excitingly ambitious to you. It's also beneficial to be curious, try lots of things, meet lots of people, read lots of books, and ask lots of questions. When in doubt, optimize for interestingness. It's okay to guess and be wrong sometimes, as this can lead to discovering what you're truly good at or interested in.

注意:如果您有兴趣,可以尝试 根据 Paul Graham 的文章构建的聊天机器人


第一次运行它时感觉就像纯粹的魔法。这到底是如何工作的?
答案是一个称为检索增强生成(Retrieval Augmented Generation)的过程,简称 RAG

这个名字顾名思义有两层含义:1、检索;2、增强生成

检索:RAG技术的本质就是根据问题在所提供的文档中检索出相关的信息

增强生成:RAG技术服务于生成式LLM,用来提高大语言模型的输出精度,因此是增强生成

2. 什么是检索增强生成

检索增强生成是用从其他地方检索到的附加信息来补充用户输入到聊天 GPT 等大型语言模型(LLM)的过程。然后,LLM 可以使用该信息来增强其生成的响应

上图展示了RAG的工作原理:

  1. 得到数据。例如得到“How do I do <something>?”问题以及加载相关文档
  2. 检索步骤。接受用户问题并从知识库中搜索可能回答该问题的最相关内容
  3. 融合输入LLM。将检索得到的相关内容和问题一起输入给大语言模型,得到最终结果

下图展示融合输入LLM模型的步骤:

 

RAG作用性分析:

  • 起到类似于微调技术的功能。通过输入相关领域知识,让LLM的回答更具有相关邻域的专业性,而不是一个通用的回答
  • 修正/补全问题。由于有时候使用者的问题会存在一定的问题,通过将问题和文档共同输入给LLM模型,可以提高模型的鲁棒性

3. RAG技术的核心难点

已知如下步骤:

  1. 得到问题。例如得到“How do I do <something>?”问题以及加载相关文档
  2. 检索步骤。接受用户问题并从知识库中搜索可能回答该问题的最相关内容
  3. 融合输入LLM。将检索得到的相关内容和问题一起输入给大语言模型,得到最终结果

其中最核心且关键的部分在于 如何检索相似内容

  1. 加载————利用LangChain中的加载器将文档加载入
  2. 切片————将文档切成多个切片,检索输出以切片为单位
  3. 量化————将语义型句子(问题和文档)量化为数学数据(向量)
  4. 检索————将问题向量和文档向量进行比较,选出相似度高的切片

特别说明:

LangChain 是一个用于构建语言模型应用的开源框架。其主要目标之一是简化和增强与大型语言模型(LLMs)进行交互的过程。它提供了多种工具和组件,帮助开发者更高效地构建和优化自然语言处理应用

3.1 加载

加载需要依赖于LangChain中的Loader(加载器)来实现,将页面放入Loader从而得到页面完整的文档数据。如下图:

加载器是一个基础设施,它可以访问我的文档,找出可用的页面,然后拉取每个页面。加载程序完成后,它将输出单独的文档 —— 网站上的每个页面都有一个文档。

装载机内部发生了很多事情!我们需要抓取所有页面,抓取每个页面的内容,然后将 HTML 格式化为可用的文本。

LangChain Loader:
1、内置装载机是 LangChain 最有用的部件之一。它们提供了一长串内置加载器,可用于从 Microsoft Word 文档到整个 Notion 站点的任何内容中提取内容。
2、LangChain 加载器的界面与上面描述的完全相同。输入一个“知识库”,出来一个“文档”列表。

3.2 切片

切片需要依赖LangChain中的Splitter(切片器)来实现。事实上切片器属于更大的一个工具类别————文档转换器,它能够实现对文档的各种操作。

分割文档是一门完整的艺术,例如:每个切片的大小、切片的重复程度、如何切片(按标题?)等问题都是我们需要思考并实验的

因为分割的文档过大会导致每个知识片段不够具体,从而使得LLM获得的信息更冗杂,更易出现模型幻觉、浪费资源等问题

同时分割的文档过小会导致文档切片与切片之间的关联度丢失,使得原本文章的部分语义因着切割丢失,从而降低了模型对文档的理解程度

LangChain 中的分片器:
1、在 LangChain 中,拆分器属于一个更大的类别,称为“文档转换器”(Document Transformer)。除了提供各种分割文档的策略之外,他们还提供删除冗余内容、翻译、添加元数据等工具。我们在这里只关注拆分器,因为它们代表了绝大多数文档转换。

3.3 量化

假设通过上面两个步骤,我们已经得到很多网页知识库制作成的文档的切片————Document Snippets。

下一步我们要思考的就是如何将Document Snippets这种语义型文字转化为数字型向量存储。

这一步用到的技术就是由OpenAi提供的OpenAIEmbeddings接口,利用这个接口能够将语义文字转化为向量。

然后,将文档和文档向量两者共同存入向量数据库,从而得到索引知识库

创建索引知识库完整流程如下:

总结:

  • 加载、切片和量化三者的最终目的就是得到————索引知识库
  • 这个索引知识库将是我们进行检索匹配的核心部分
  • 后续就是将问题和索引知识库匹配,从而拿出索引知识库中与问题相匹配的部分,作为提示词输入给LLM大模型

3.4 检索

检索的本质:将问题所转化成的问题向量和文档切片所转化成的文档向量进行相似性比较,拿出文档切片中和问题向量最相似的切片。

相似性比较:大部分时候,我们认为两个向量的距离越近、方向越相似,说明两个向量对应的语句相似性越高。

相似度比较算法:

  • 余弦相似度:衡量两个向量之间的角度,相似度越高,意味着这两个向量的方向越一致。
  • 欧几里得距离:计算两个向量之间的真实空间距离,距离越小,表明相似性越高。

1、向量数据库会根据其底层的存储方式(索引如何创建、向量如何表示等)自行决定使用哪种相似度比较算法(一般都是余弦相似度算法,但是细节优化上可能不同)

2、向量数据库有: FAISS 矢量数据库、Chroma向量数据库、 LanceDB 矢量数据库等

如下图: 

4. 总结

最后,我们可以完善 RAG 整体的流程。它看起来是这样的:

  1. 首先,我们索引我们的知识库。我们获取知识并使用加载器将其转换为单独的文档,然后使用拆分器将其转换为一口大小的块或片段。一旦我们有了这些,我们就把它们传递给嵌入机,嵌入机将它们转换成可用于语义搜索的向量。我们将这些嵌入及其文本片段保存在我们的矢量数据库中。
  2. 接下来是检索。它从问题开始,然后通过相同的嵌入机发送并传递到我们的矢量数据库以确定最接近的匹配片段,我们将用它来回答问题。
  3. 最后,增强答案生成。我们获取知识片段,将它们与自定义系统提示和我们的问题一起格式化,最后得到我们上下文特定的答案。

如果想要学习更多深度学习的知识,大家可以点个关注并订阅,持续学习、天天进步

你的点赞就是我更新的动力,如果觉得对你有帮助,辛苦友友点个赞,收个藏呀~~~

  • 11
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

十二月的猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值