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

相关文章

Java AOP面向切面编程的概念和实现方式

《JavaAOP面向切面编程的概念和实现方式》AOP是面向切面编程,通过动态代理将横切关注点(如日志、事务)与核心业务逻辑分离,提升代码复用性和可维护性,本文给大家介绍JavaAOP面向切面编程的概... 目录一、AOP 是什么?二、AOP 的核心概念与实现方式核心概念实现方式三、Spring AOP 的关

Java Instrumentation从概念到基本用法详解

《JavaInstrumentation从概念到基本用法详解》JavaInstrumentation是java.lang.instrument包提供的API,允许开发者在类被JVM加载时对其进行修改... 目录一、什么是 Java Instrumentation主要用途二、核心概念1. Java Agent

Kotlin 协程之Channel的概念和基本使用详解

《Kotlin协程之Channel的概念和基本使用详解》文章介绍协程在复杂场景中使用Channel进行数据传递与控制,涵盖创建参数、缓冲策略、操作方式及异常处理,适用于持续数据流、多协程协作等,需注... 目录前言launch / async 适合的场景Channel 的概念和基本使用概念Channel 的

redis-sentinel基础概念及部署流程

《redis-sentinel基础概念及部署流程》RedisSentinel是Redis的高可用解决方案,通过监控主从节点、自动故障转移、通知机制及配置提供,实现集群故障恢复与服务持续可用,核心组件包... 目录一. 引言二. 核心功能三. 核心组件四. 故障转移流程五. 服务部署六. sentinel部署

一文带你迅速搞懂路由器/交换机/光猫三者概念区别

《一文带你迅速搞懂路由器/交换机/光猫三者概念区别》讨论网络设备时,常提及路由器、交换机及光猫等词汇,日常生活、工作中,这些设备至关重要,居家上网、企业内部沟通乃至互联网冲浪皆无法脱离其影响力,本文将... 当谈论网络设备时,我们常常会听到路由器、交换机和光猫这几个名词。它们是构建现代网络基础设施的关键组成

MySQL 事务的概念及ACID属性和使用详解

《MySQL事务的概念及ACID属性和使用详解》MySQL通过多线程实现存储工作,因此在并发访问场景中,事务确保了数据操作的一致性和可靠性,下面通过本文给大家介绍MySQL事务的概念及ACID属性和... 目录一、什么是事务二、事务的属性及使用2.1 事务的 ACID 属性2.2 为什么存在事务2.3 事务

使用Python自动化生成PPT并结合LLM生成内容的代码解析

《使用Python自动化生成PPT并结合LLM生成内容的代码解析》PowerPoint是常用的文档工具,但手动设计和排版耗时耗力,本文将展示如何通过Python自动化提取PPT样式并生成新PPT,同时... 目录核心代码解析1. 提取 PPT 样式到 jsON关键步骤:代码片段:2. 应用 JSON 样式到

Python 迭代器和生成器概念及场景分析

《Python迭代器和生成器概念及场景分析》yield是Python中实现惰性计算和协程的核心工具,结合send()、throw()、close()等方法,能够构建高效、灵活的数据流和控制流模型,这... 目录迭代器的介绍自定义迭代器省略的迭代器生产器的介绍yield的普通用法yield的高级用法yidle

Redis存储的列表分页和检索的实现方法

《Redis存储的列表分页和检索的实现方法》在Redis中,列表(List)是一种有序的数据结构,通常用于存储一系列元素,由于列表是有序的,可以通过索引来访问元素,因此可以很方便地实现分页和检索功能,... 目录一、Redis 列表的基本操作二、分页实现三、检索实现3.1 方法 1:客户端过滤3.2 方法

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

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