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

news2024/9/20 21:16:59

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

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

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

RAG流程图

RAG代码实现

from langchain_community.document_loaders import DirectoryLoader
from langchain.indexes import VectorstoreIndexCreator

loader = 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架构详解:构建端到端检索增强生成系统

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2024.8.22(Docker)

一、回顾 高并发集群 eleme后端登录模块 1、数据库 1.主从复制(高可用) 2.传统的主从复制 3.gtids事务型的主从复制 4.注意 (1)server_id唯一 (2)8.x版本需要get_ssl_pub_key (3)5.x不需要 (4…

ts枚举类型校验,提示枚举信息

ts 类型验证,提示枚举信息 const eventTypeList [MOUSE_MOVE, // 鼠标移动LEFT_CLICK // 左键单击// MOUSE_OUT, ] as consttype EventTypeList typeof eventTypeList[number]

FST(Finite State Transducer)

有限状态转换器(Finite State Transducer,简称FST)是一种计算模型,它是有限状态自动机(Finite State Automaton,简称FSA)的扩展。FSA是一种理论计算模型,用于表示和处理正则语言&…

苹果iOS / iPadOS 18 beta 7版本发布,或将是最后一个iOS / iPadOS 18beta版本

今日苹果公司向 iPhone 和 iPad 用户推送了 iOS/iPadOS 18 开发者预览版 Beta 7 更新(内部版本号:22A5346a),本次更新距离上次发布 Beta/RC 间隔 8 天。 值得注意的是,本次更新版本号以a结尾,意味着如果不…

国密算法SSL证书:守护网络安全的利器

国密算法SSL证书是基于中国自主研发的密码算法标准生成的安全套接层证书,主要用于保护网站和应用程序的数据传输安全。该证书采用SM2椭圆曲线公钥密码算法、SM3密码哈希函数和SM4对称密钥加密算法,确保数据传输过程中的机密性、完整性和抗攻击性。 国密…

KKView远程Microsoft Remote Desktop

Microsoft Remote Desktop:高效稳定的远程连接解决方案 在当今这个信息化、网络化的时代,远程桌面工具成为了许多用户进行远程办公、学习及技术支持的重要工具。其中,Microsoft Remote Desktop以其高效稳定的连接性能、强大的跨平台支持及出…

学校每年比用的招生简章在线制作平台!

每年招生季节,各大中小学及高校都会面临一个重要的任务:更新和发布招生简章。这不仅是一份简单的招生说明,它更是学校向外界展示自身特色、招生政策和培养目标的重要窗口。随着信息技术的发展,传统的纸质招生简章逐渐演变为在线制…

通过拖拽添加dom和一些属性

将图片通过拖拽添加到指定位置 <template><div class"draggle-box"><imgclass"draggle-source"src"/assets/bg/cat.jpg"dragstart"handleDragStart($event, 图片)"/><divclass"draggle-target"dragove…

嵌入式学习——(Linux高级编程——线程控制)

线程的互斥 一、互斥的重要性 在多线程编程中&#xff0c;互斥机制至关重要。当多个线程同时访问临界资源时&#xff0c;如果没有有效的互斥控制&#xff0c;可能会导致数据不一致、资源竞争等问题。通过互斥锁&#xff0c;可以确保在任何时刻只有一个线程能够访问临界资源&am…

Axure RP 9高手速成秘籍:解锁终极快捷键,设计效率飙升10倍!

Axure RP 9作为一款功能强大的原型设计工具&#xff0c;提供了丰富的快捷键来加速设计流程。以下是一份详尽的Axure RP 9快捷键大全&#xff0c;旨在帮助用户更高效地完成设计工作。 一、文件操作 新建&#xff1a;Ctrl N&#xff08;Windows&#xff09;/ Command N&#…

【LLM大模型】本地玩转多模态Llama3

一般开源的LLM&#xff0c;例如Llama3和Qwen2等&#xff0c;只支持文本的输入&#xff0c;只能理解文本的内容&#xff0c;实现基于文本的逻辑推理和意图识别。 但是一些Chatbot&#xff0c;例如GPT-4V&#xff0c;就是拥有视觉能力&#xff0c;能够理解图片内容&#xff0c;能…

【LeetCode Cookbook(C++ 描述)】一刷二叉搜索树

目录 LeetCode #700&#xff1a;Search in a Binary Search Tree 二叉搜索树中的搜索递归法迭代法 LeetCode #98&#xff1a;Validate Binary Search Tree 验证二叉搜索树递归法迭代法 LeetCode #530&#xff1a;Minimum Absolute Difference in BST 二叉搜索树的最小绝对差递归…

在IEDA里打包Maven项目记录

之前在网上查找到的方式发现比较繁琐&#xff0c;所以把自己的解决办法记录一下分享给兄弟们 <plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-shade-plugin</artifactId><version>3.2.4</vers…

KT来袭,打造沉浸式体验的聚合性web3应用平台

随着步入 2024&#xff0c;漫长的区块链熊市即将接近尾声。纵观产业发展&#xff0c;逆流而上往往会是彰显品牌市场影响力和技术实力的最佳证明。在这次周期中&#xff0c;一个名为KT的web3.0聚合平台吸引了市场关注&#xff0c;无论在市场层面还是技术层面&#xff0c;都广泛赢…

【计算机三级-数据库技术】数据库后台编程技术

内容提要 1、掌握存储过程的定义与使用 2、掌握用户定义函数的创建与使用 3、掌握触发器的定义与使用 4、掌握游标的定义与使用 第一节 存储过程 使用T-SQL语言编写&#xff0c;有两种方式存储&#xff1a; 在客户端存储代码通过客户端程序或SQL命令向DBMS发出操作请求&…

JavaScript中设置器和获取器

在JavaScript中&#xff0c;setters 和 getters 是对象属性的特殊方法&#xff0c;用于定义如何访问和设置对象的属性。这些方法使得可以在对对象属性执行读取或写入操作时添加自定义逻辑。 举例 首先我们定义一个类似之前银行家的一个对象 const account {owner: ITshare,…

【Redis】数据结构和内部编码

数据结构和内部编码 type 命令实际返回的就是当前键的数据结构类型&#xff0c;它们分别是&#xff1a;string&#xff08;字符串&#xff09;、list&#xff08;列表&#xff09;、hash&#xff08;哈希&#xff09;、set&#xff08;集合&#xff09;、zset&#xff08;有序集…

模拟笔试 - 卡码网周赛第三十一期(23年百度笔试真题)

难度适中&#xff0c;动态规划出现的比例还是比较高的&#xff0c;要好好掌握&#xff0c;二分查找的点也是比较灵活的。&#xff08;A卷和B卷第一道题是一样的&#xff09; 题目一&#xff1a;讨厌鬼的组合帖子 思路&#xff1a;这个题算是一个还不错的题&#xff1b; 本质就…

ES 支持乐观锁吗?如何实现的?

本篇主要介绍一下Elasticsearch的并发控制和乐观锁的实现原理&#xff0c;列举常见的电商场景&#xff0c;关系型数据库的并发控制、ES的并发控制实践。 并发场景 不论是关系型数据库的应用&#xff0c;还是使用Elasticsearch做搜索加速的场景&#xff0c;只要有数据更新&…

Java导出分类到Excel

需求 在一般需求中点击导出按钮可以把所有的分类导出到Excel文件中。 技术方案 使用EasyExcel实现Excel的导出操作。 https://github.com/alibaba/easyexcel https://easyexcel.opensource.alibaba.com/docs/current/quickstart/write#%E7%A4%BA%E4%BE%8B%E4%BB%A3%E7%A0%81…