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

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

图片怎么压缩得小一点?这八种免费图片压缩方法赶紧试试

在数字化时代,无论是工作还是日常生活中,图片的使用已变得不可或缺。然而,随着高分辨率图片的广泛应用,文件体积也随之增加,这不仅占用了大量存储空间,还可能导致传输和加载速度变慢。因此,如何…

干货:2024必备的四大PDF编辑器推荐!

面对PDF文件的编辑需求,你是否感到无从下手?那么,今天就为大家推荐几款实用的PDF编辑工具,让你轻松应对各种PDF编辑难题。 福昕PDF编辑器 链接:editor.foxitsoftware.cn 福昕PDF编辑器多功能专业级是我PDF编辑器。它…

python-docx 实现 Word 办公自动化

前言:当我们需要批量生成一些合同文件或者简历等。如果手工处理对于我们来说不仅工作量巨大,而且难免会出现一些问题。这个时候运用python处理word实现自动生成文件可极大的提高工作效率。 python-docx是python的第三方插件,用来处理word文件…

HTML 列表和容器元素——WEB开发系列10

HTML 提供了多种方式来组织和展示内容&#xff0c;其中包括无序列表、有序列表、分区元素 ​​<div>​​ 和内联元素 ​​<span>​​、以及如何使用 ​​<div>​​​ 进行布局和表格布局。 一、HTML 列表 1. 无序列表 (​​<ul>​​) 无序列表用于展…

JavaScript_11_练习:小米搜索框案例(焦点事件)

效果图 代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>练习&#xff1a;小米搜索框案例&#…

C语言基础(八)

1、标准库函数&#xff1a; 测试代码1&#xff1a; #include <stdio.h> // 标准库函数头文件导入 // 自定义函数 int add(int a, int b) { return a b; } // 声明回调函数类型 typedef void (*Callback)(int); // 调用回调函数的函数 void process(Callb…

MySQL中的EXPLAIN的详解

一、介绍 官网介绍&#xff1a; https://dev.mysql.com/doc/refman/5.7/en/explain-output.htmlhttps://dev.mysql.com/doc/refman/8.0/en/explain-output.htmlexplain&#xff08;执行计划&#xff09;&#xff0c;使用explain关键字可以模拟优化器执行sql查询语句&#xff…

QT 与 C++实现基于[ TCP ]的聊天室界面

TCP客户端 Widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTcpSocket> //客户端类 #include <QMessageBox> #include <QListWidgetItem> #include <QDebug>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } …

SpingBoot集成kafka发送读取消息

SpingBoot集成kafka开发 kafka的几个常见概念 1、springboot和kafka对应版本&#xff08;重要&#xff09;2、创建springboot项目&#xff0c;引入kafka依赖2.1、生产者EventProducer2.2、消费者EventConsumer2.3、启动生产者的方法SpringBoot01KafkaBaseApplication2.4、appli…

map与set容器初识:初步运用map与set

前言&#xff1a; 本文主要讲解的时对于map与set容器的初步使用&#xff0c;希望大家对map与set容器不熟悉的看了之后可以快速运用set与map到日常中来。&#xff08;本文适合对vector等基础容器有一定基础的同学&#xff09; 一、set与map容器常见接口 迭代器接口与以往的所…

12 程序控制语句:循环控制(while、do-while、for、多重嵌套循环、死循环)

目录 1 while 循环 1.1 基本语法 1.2 流程图 1.3 计数循环 1.3.1 实现原则 1.3.2 案例&#xff1a;循环输出语句 1.3.3 案例&#xff1a;循环输出数字 7~15 1.3.4 案例&#xff1a;倒序输出数字 56 ~ 43 1.3.5 案例&#xff1a;输出 10&#xff08;包括 10&…

使用 Go 语言将 Base64 编码转换为 PDF 文件

使用Go语言将PDF文件转换为Base64编码-CSDN博客文章浏览阅读104次&#xff0c;点赞2次&#xff0c;收藏5次。本文介绍了如何使用 Go 语言将 PDF 文件转换为 Base64 编码&#xff0c;并保存到文件中。https://blog.csdn.net/qq_45519030/article/details/141224319 在现代编程中…

【WebSocket】websocket学习【二】

1.需求&#xff1a;通过websocket实现在线聊天室 2.流程分析 3.消息格式 客户端 --> 服务端 {"toName":"张三","message":"你好"}服务端 --> 客户端 系统消息格式&#xff1a;{"system":true,"fromName"…

SQL注入(head、报错、盲注)

目录 【学习目标、重难点知识】 【学习目标】 【重难点知识】 1. 报错注入 1.1 那么什么是报错注入呢&#xff1f; 1.2 报错注入原理 extractvalue函数 updatexml函数 1.3 靶场解析 靶场练习 2. HEAD注入 2.1 相关全局变量 2.2 靶场解析 burp暴力破解 靶场练习 3…

Spring核心思想讲解之控制反转(IOC)

控制反转概述 控制反转实现方式 XML方式 方式一 方式二 方式三 注解方式 第一步 第二步 第三步 依赖注入&#xff08;DI&#xff09;实现方式 XML方式 手动注入 set注入 构造器注入 自动注入 set注入 构造方法注入 注解方式 方式一&#xff1a; 方式二&…

Transformer模型中的Position Embedding实现

引言 在自然语言处理&#xff08;NLP&#xff09;中&#xff0c;Transformer模型自2017年提出以来&#xff0c;已成为许多任务的基础架构&#xff0c;包括机器翻译、文本摘要和问答系统等。Transformer模型的核心之一是其处理序列数据的能力&#xff0c;而Position Embedding在…

python之matplotlib (1 介绍及基本用法)

介绍 matplotlib是Python中的一个绘图库&#xff0c;它提供了一个类似于 MATLAB 的绘图系统。使用matplotlib你可以生成图表、直方图、功率谱、条形图、错误图、散点图等。matplotlib广泛用于数据可视化领域&#xff0c;是 Python 中最著名的绘图库之一。 同样matplotlib的安…

Java数组怎么转List,Stream的基本方法使用教程

Stream流 Java 的 Stream 流操作是一种简洁而强大的处理集合数据的方式,允许对数据进行高效的操作,如过滤、映射、排序和聚合。Stream API 于 Java 8 引入,极大地简化了对集合(如 List、Set)等数据的处理。 一、创建 Stream 从集合创建: List<String> list = Ar…

NGINX 之 location 匹配优先级

章节 1 NGINX 的源码安装 2 NGINX 核心配置详解 3 NGINX 之 location 匹配优先级 4 NGINX 基础参数与功能 目录 1 location 基础语法 1.1 location 语法说明表 1.2 URI部分简单介绍 2 location 匹配优先级 2.1 URI匹配的规则与顺序 2.2 精确匹配(location /1.txt) 2.3 区…

Python个人收入影响因素模型构建:回归、决策树、梯度提升、岭回归

全文链接&#xff1a;https://tecdat.cn/?p37423 原文出处&#xff1a;拓端数据部落公众号 “你的命运早在出生那一刻起便被决定了。”这样无力的话语&#xff0c;无数次在年轻人的脑海中回响&#xff0c;尤其是在那些因地域差异而面临教育资源匮乏的年轻人中更为普遍。在中国…