LLM概念梳理(二):检索增强RAG

2024-08-22 15:44
文章标签 概念 检索 llm 增强 梳理 rag

本文主要是介绍LLM概念梳理(二):检索增强RAG,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

非常感谢RAG(检索增强生成)技术详解:基于垂直领域专有数据的 Chatbots 是如何实现的,这篇文章对 RAG 技术进行了详细的描述。我根据自己的理解,并且按照代码思路重新进行整理。

RAG 技术看似神奇,其本质是结合了检索和生成两个子任务的一种系统工程,其中每个子任务有明确的技术原理支撑。检索模型充当“图书馆员”,扫描大型数据库以获取相关信息,生成模型充当“作家”,将这些信息合成为与任务更相关的文本。它用途广泛,适用于实时新闻摘要、自动化客户服务和复杂研究任务等多种领域。

具体来说,首先,对知识库进行索引,使用加载器从知识库中获取文档并分割成文档片段,经过嵌入后得到向量数据库;然后是检索,通过相似性算法匹配与用户输入相关的文档片段;最后是生成,通过检索到的文档片段和 system prompt 进行检索增强。

RAG流程图

RAG代码实现

from langchain_community.document_loaders import DirectoryLoader
from langchain.indexes import VectorstoreIndexCreatorloader = DirectoryLoader('../', glob="**/*.txt")
index = VectorstoreIndexCreator().from_loaders([loader])
index.query("你觉得黑神话·悟空怎么样?")

零、嵌入

当我们和 chatbot 进行对话时,用的是自然语言,那系统又该如何理解这些自然语言呢?在 LLM 的世界中,任何一段人类语言都可以用数字向量来表示(Embedding Machine),而这个向量就是嵌入。

嵌入

通过 Embedding Machine,自然语言将会变成向量。如果在一个向量空间中表示所有的语言,当两个点越相近,那么他们就越相似。

向量空间

嵌入和语义近似是搜索的核心原理,它为检索步骤提供了动力。

一、索引

为知识库创建索引的过程就是为知识库建立一个对应关系,方便用户读取到。分为两个高层次的步骤:加载分割,最终目的是:得到向量数据库

向量数据库

1. 加载

加载(Loader)就是对知识库进行处理并获取其内容。这是一个很复杂的步骤,它需要将知识库中不同格式的数据,统一成一个输出格式,并输出一个列表数据。比如:如果知识库是一个文档站点,则加载器需要抓取每个页面的内容,然后将HTML格式化为可用的文本;如果是PDF或Google Drive,则需要不同加载器。

2. 分割

分割(Splitter)就是将将知识库中提取出的知识分割成适合嵌入搜索的片段大小。

在第一步中,我们知道了如何将自然语言转换为 LLM 可以理解的向量。而加载的目的就是为了将格式统一,便于转化为向量数据。那为什么需要分割器呢?原因在于:加载的列表数据中,每个文档中包含的知识越多,越考验语义近似算法的性能,相似性计算难以保证。为了让用户问题的主题与文档中的文本相吻合,便有了分割器,即将单个文档分割成适合检索的文档片段。

注意:当我们希望LLM在回答问题时引用其来源的场景,格式保持一致十分非常重要。

3. 向量数据库

最后,将文档片段经过 Embedding Machine后,保存到向量数据库中。

二、检索

检索这一步,是在嵌入和索引的基础上,在向量空间中,找到与查询嵌入相关的文档片段嵌入。通过相似度算法计算相关性,通常使用余弦距离进行计算。

检索

三、生成

通过上面几步,我们成功检索出了与输入查询相关的文档片段。加下来,将输入查询和检索到的文档片段一起送入 LLM 中,得到的就是检索增强后生成的回复。

生成

同时,我们需要注意,在使用 LLM 时,我们需要提供 system prompt 作为自定义指令,它会为 LLM 提供整体指导。对于RAG来说,可以描述为:“嘿,AI,我们将给你一些东西阅读。阅读后回答我们的问题,好吗?谢谢。

一旦有了 system prompt 检索到的文档片段,我们就只需将它们与用户输入查询一起发送给LLM即可。

Prompt

参考文献:
RAG(检索增强生成)技术详解:基于垂直领域专有数据的Chatbots是如何实现的
LangChain学习笔记:文档加载器
索增强生成 (RAG)的原理——传统检索+LLM生成相结合
RAG 2.0架构详解:构建端到端检索增强生成系统

这篇关于LLM概念梳理(二):检索增强RAG的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1096698

相关文章

【VUE】跨域问题的概念,以及解决方法。

目录 1.跨域概念 2.解决方法 2.1 配置网络请求代理 2.2 使用@CrossOrigin 注解 2.3 通过配置文件实现跨域 2.4 添加 CorsWebFilter 来解决跨域问题 1.跨域概念 跨域问题是由于浏览器实施了同源策略,该策略要求请求的域名、协议和端口必须与提供资源的服务相同。如果不相同,则需要服务器显式地允许这种跨域请求。一般在springbo

【MRI基础】TR 和 TE 时间概念

重复时间 (TR) 磁共振成像 (MRI) 中的 TR(重复时间,repetition time)是施加于同一切片的连续脉冲序列之间的时间间隔。具体而言,TR 是施加一个 RF(射频)脉冲与施加下一个 RF 脉冲之间的持续时间。TR 以毫秒 (ms) 为单位,主要控制后续脉冲之前的纵向弛豫程度(T1 弛豫),使其成为显著影响 MRI 中的图像对比度和信号特性的重要参数。 回声时间 (TE)

梳理2024年,螺丝钉们爱用的3款剪辑软件

这年头,视频到处都是,就跟天上的星星一样数不清。不管你是公司里的新面孔,还是职场上的老狐狸,学会怎么剪视频,就好比找到了赢的秘诀。不管是给上司汇报工作,展示你的产品,还是自己搞点小视频记录生活,只要是剪辑得漂亮,肯定能一下子吸引大家的目光,让人记得你。咱们今天就来侃侃现在超火的三款视频剪辑工具,尤其是PR剪辑,你肯定听说过,这货在剪辑界可是大名鼎鼎,用它剪视频,既专业又麻利。 NO1. 福昕轻松

[论文笔记]LLM.int8(): 8-bit Matrix Multiplication for Transformers at Scale

引言 今天带来第一篇量化论文LLM.int8(): 8-bit Matrix Multiplication for Transformers at Scale笔记。 为了简单,下文中以翻译的口吻记录,比如替换"作者"为"我们"。 大语言模型已被广泛采用,但推理时需要大量的GPU内存。我们开发了一种Int8矩阵乘法的过程,用于Transformer中的前馈和注意力投影层,这可以将推理所需

计算机网络基础概念 交换机、路由器、网关、TBOX

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、VLAN是什么?二 、交换机三、路由器四、网关五、TBOXTelematics BOX,简称车载T-BOX,车联网系统包含四部分,主机、车载T-BOX、手机APP及后台系统。主机主要用于车内的影音娱乐,以及车辆信息显示;车载T-BOX主要用于和后台系统/手机APP通信,实现手机APP的车辆信息显示与控

01 Docker概念和部署

目录 1.1 Docker 概述 1.1.1 Docker 的优势 1.1.2 镜像 1.1.3 容器 1.1.4 仓库 1.2 安装 Docker 1.2.1 配置和安装依赖环境 1.3镜像操作 1.3.1 搜索镜像 1.3.2 获取镜像 1.3.3 查看镜像 1.3.4 给镜像重命名 1.3.5 存储,载入镜像和删除镜像 1.4 Doecker容器操作 1.4

【机器学习-一-基础概念篇】

机器学习 定义分类算法 应用 定义 机器学习最早是被Arthur Samuel 提出的一个概念,指计算机无需明确编程即可学习的研究领域。1950年他发明的跳棋程序,这个人机对弈游戏让他的声名鹊起,机器学习这个概念才进入大众的是视线。 在这个跳棋程序里,他编程了一种算法,这个程序与Arthur下了数万次跳棋,计算机逐渐学会了下在哪里有更大的可能会赢得比赛,哪里会输,通过这种方法,最

【吊打面试官系列-Redis面试题】说说 Redis 哈希槽的概念?

大家好,我是锋哥。今天分享关于 【说说 Redis 哈希槽的概念?】面试题,希望对大家有帮助; 说说 Redis 哈希槽的概念? Redis 集群没有使用一致性 hash,而是引入了哈希槽的概念,Redis 集群有 16384 个哈希槽,每个 key 通过 CRC16 校验后对 16384 取模来决定放置哪个槽, 集群的每个节点负责一部分 hash 槽。

LLM系列 | 38:解读阿里开源语音多模态模型Qwen2-Audio

引言 模型概述 模型架构 训练方法 性能评估 实战演示 总结 引言 金山挂月窥禅径,沙鸟听经恋法门。 小伙伴们好,我是微信公众号《小窗幽记机器学习》的小编:卖铁观音的小男孩,今天这篇小作文主要是介绍阿里巴巴的语音多模态大模型Qwen2-Audio。近日,阿里巴巴Qwen团队发布了最新的大规模音频-语言模型Qwen2-Audio及其技术报告。该模型在音频理解和多模态交互

AI辅助编程里的 Atom Group 的概念和使用

背景 在我们实际的开发当中,一个需求往往会涉及到多个文件修改,而需求也往往有相似性。 举个例子,我经常需要在 auto-coder中需要添加命令行参数,通常是这样的: /coding 添加一个新的命令行参数 --chat_model 默认值为空 实际上这个需求涉及到以下文件列表: /Users/allwefantasy/projects/auto-coder/src/autocoder/auto