RAG:检索增强生成技术概览

news2024/11/29 7:40:47

Why

将大模型应用于实际业务场景时会发现,通用的基础大模型基本无法满足我们的实际业务需求,主要有以下几方面原因:

  • 知识的局限性:大模型对于一些实时性的、非公开的或离线的数据是无法获取到的。
  • 幻觉问题:所有的AI模型的底层原理都是基于数学概率,其模型输出实质上是一系列数值运算,大模型也不例外,所以它有时候会一本正经地胡说八道,尤其是在大模型自身不具备某一方面的知识或不擅长的场景。而这种幻觉问题的区分是比较困难的,因为它要求使用者自身具备相应领域的知识。
  • 数据安全性:对于企业来说,数据安全至关重要,没有企业愿意承担数据泄露的风险,将自身的私域数据上传第三方平台进行训练。

RAG vs Fine-tuning

Fine-tuning(微调)是用一定量的数据集对LLM进行局部参数的调整,以期望LLM更加理解我们的业务逻辑,有更好的zero-shot能力。

RAG(检索增强生成)是把内部的文档数据先进行embedding,借助检索先获得大致的知识范围答案,再结合prompt给到LLM,让LLM生成最终的答案。

What:

RAG = LLM + 外部知识

RAG(Retrieval-Augmented Generation)检索增强生成就是通过检索获取相关的知识并将其融入Prompt,让大模型能够参考相应的知识从而给出合理回答。

image.png

Retrieval - 检索模型

旨在从一组给定的文档或知识库中检索相关信息。具体来说,将用户的查询 embedding,以便与向量数据库中的其他上下文信息进行比对。通过这种相似性搜索,可以找到向量数据库中最匹配的前 k 个数据。

检索的核心分为如下两部分:

  • 索引:嵌入(Embeddings),将知识库转换为可搜索/查询的内容。
  • 查询:从搜索内容中提取最相关的、最佳知识片段。

Augmented - 增强

将用户的查询和检索到的额外信息一起嵌入到一个预设的提示模板中。

Generate - 生成模型

最终,检索增强 prompt 被输入到 LLM 中。

Piepline

1. 提取数据阶段

image.png Ingestion stage of a RAG pipeline

1.1 数据清洗

在进行以下任何步骤之前,确保数据符合以下标准:

  • clean:应用一些常见的自然语言处理基础数据清理技术,例如确保所有特殊字符都被正确编码。
  • correct:确保信息一致且事实准确,以避免相互矛盾的信息混淆 LLM。

1.3 Chunking

一个需要考虑的因素是分块技术的选择。例如,在[LangChain]中,不同的文本拆分器会根据不同的逻辑来拆分文档,例如按字符、标记等。这取决于您所拥有的数据类型。例如,如果你的输入数据是代码,与Markdown文件相比,你需要使用不同的分块技术。

理想的分块长度(chunk_size)取决于你的用例:如果你的用例是问答,可能需要较短的具体分块,但如果用例是摘要,可能需要较长的分块。此外,如果分块太短,可能不会包含足够的上下文。另一方面,如果分块太长,可能会包含过多无关的信息。

此外,还需要考虑在分块之间引入一些额外上下文的 “滚动窗口”(overlap)

1.4 Embedding models - LLM

  1. 通常,生成 embedding 的维度越高,embedding 的精度就越高。

    [MTEB Leaderboard - a Hugging Face Space by mteb]中文文本嵌入模型比较

  2. LlamaIndex 的实验显示,微调 embedding models [5–10%]

1.5 Metadata

给向量嵌入添加 metadata 标注 可以在后续的搜索结果处理中发挥重要作用,如进行元数据筛选。比如,可以加入诸如日期、章节或小节的引用等额外信息。

1.6 Multi-indexing

在 metadata ****无法充分区分不同上下文类型的情况下,可以考虑尝试多重索引技术。比如,针对不同文档类型采用不同的索引策略。注意,这样做需要在数据检索时加入索引路由机制。

对于表:可以提取每个表,生成适合检索的表摘要,但将原始表返回到LLM进行答案合成。

image.png

1.7 Indexing algorithms

向量数据库和索引库通常采用近似最近邻 (ANN) 搜索方法,而不是传统的 k-最近邻 (kNN) 搜索。ANN 算法通过近似计算来定位最近邻,因此可能在精确度上稍逊于 kNN 算法。

2. 推理阶段 (Retrieval & Generation)

image.png Inference stage of a RAG pipeline

2.1 Retrieval

2.1.1 Query transformations - LLM

[query transformation techniques]

  • Rephrasing: 使用 LLM 重新措辞 query 并再次尝试。query 的措辞会直接影响搜索结果。

  • 假设性文档嵌入 (HyDE) :使用 LLM 生成假设性响应(答案)。该答案用于搜索查询。

  • 子查询:将复杂查询分解为子问题。

  • 假设性问题:为每个分块生成一个问题,对问题向量执行查询搜索,然后在检索后路由到原始文本分块。

  • Step-back prompting | multi-query: 利用大模型生成多个query 来检索,然后筛选。

[Query Transform Cookbook - LlamaIndex]

2.1.2 Retrieval parameters | Hybrid search

[Hybrid search]

The first consideration is whether semantic search will be sufficient for your use case or if you want to experiment with hybrid search.

在选择混合搜索时,需要研究如何在稀疏和密集检索方法之间进行有效的权重分配 [1, 4, 9]。这就涉及到调整 alpha 参数,该参数负责平衡基于语义的搜索(alpha = 1)和基于关键词的搜索(稀疏)(alpha = 0)的重要性。

image.png [Improving Retrieval Performance in RAG Pipelines with Hybrid Search]

如何通过混合搜索在 RAG 流程中提升检索性能

混合搜索也可以是将检索实体关系的知识图技术与 vector search 相结合。

不同的搜索系统各自擅长揭示文本(段落、句子、单词)中的各种微妙联系,包括精确关系、语义关系、主题关系、结构关系、实体关系、时间关系和事件关系。可以说,没有一种单一的搜索模式适用于所有情况。混合搜索通过整合多个搜索系统,在各种搜索技术之间实现了互补。

2.1.3 Advanced retrieval strategies

基本思想是,用于检索的块不一定是用于生成的相同块。理想情况下,应该嵌入更小的数据块来进行检索,但同时检索更广泛的上下文。The concept here is to retrieve smaller chunks for better search quality, but add up surrounding context for LLM to reason upon.

  • Sentence-window retrieval: 在检索时,不只是找到相关的单个句子,而是要获取该句子前后的相关句子。

  • Auto-merging retrieval(aka Parent Document Retriever): 文档按树状结构组织。在查询时,可以把若干个小的、相关的数据块合并成一个更大的上下文。

    文档被分割成层次化的块结构,最小的叶子块被送至索引。在检索时,我们会找出 k 个叶子块,如果存在 n 个块都指向同一父块,我们就用这个父块替换它们,并把它送给 LLM 用于生成答案。

2.1.4 查询构建

自然语言的 query 需要转换为检索的查询语法。

image.png

文本到 Metadata Filter

配备 Metadata Filter 的向量存储使结构化查询能够过滤嵌入式非结构化文档。self-query retriever可以使用向量存储中元数据字段的规范,使用元数据过滤器将自然语言转换为这些结构化查询。

文本到 SQL

相当多的工作集中在将自然语言翻译成SQL请求上。通过向LLM提供自然语言问题以及相关表格信息,可以轻松完成从文本到SQL的转换。开源LLM可以轻松完成此类任务。

文本到 Cypher

  • 向量存储很容易处理非结构化数据,但它们不理解向量之间的关系。
  • SQL数据库可以对关系进行建模,但模式更改可能具有破坏性且成本高昂。

知识图谱可以通过对数据之间的关系进行建模和扩展关系类型来应对这些挑战。对于具有难以以表格形式表示的多对多关系或层次结构的数据,它们也是比较适合的。

Re-ranking models - LLM

image.png

使用重排序模型时,可能需要重新调整搜索结果的数量(re-rank 输入),以及想要输入到大语言模型的经过重排序的结果数量(re-rank 输出)。

嵌入模型 一样,可能需要尝试针对特定应用场景对重排序模型进行微调

re-rank 是增强现有搜索系统的辅助工具。它最大的优势在于不仅提供了一种简单和低复杂度的方法来改善搜索结果,而且还允许用户将语义相关性集成到现有的搜索系统中,而无需进行重大基础设施修改。

Query Routing - LLM

是指在接收到用户的查询后,由大语言模型决定接下来的操作步骤。常见的做法包括概述查询内容、对特定数据索引进行搜索,或尝试多个不同的处理方法,并将这些方法的结果合成一个答案。

选择特定路由的过程是通过大语言模型来实现的,其结果按照预定义的格式返回,以指导查询到达指定的索引。如果是涉及到关联操作,这些查询还可能被发送到子链或其他智能体。

2.2 Generation

2.2.1 LLMs - LLM

与嵌入模型或重新排序模型一样,你可能希望尝试根据你的特定用例对 LLM 进行微调,以合并特定的措辞或语气。

2.2.2 Prompt engineering

Please base your answer only on the search results and nothing else!

Very important! Your answer MUST be grounded in the search results provided. 
Please explain why your answer is grounded in the search results!

此外,在提示中使用少样本示例可以提高完成任务的质量。

输入到提示中的上下文数量是一个需要你进行实验的参数。

Chat Engine

It is solved by query compression technique, taking chat context into account along with the user query.

  • ContextChatEngine: 检索与用户查询相关的上下文,然后将其与内存缓冲区中的聊天历史一起发送到LLM。 (query → context) + history → answer
  • CondensePlusContextMode: <(query + history) → new query> + context → answer

image.png

Response synthesiser

基于初始查询和检索到的所有上下文生成response。

  1. 将所有获取到的 contexts(超过某个相关性阈值)与查询一起连接并一次性输入到LLM中。
  2. 通过逐步将检索到的 contexts 分块发送到LLM,迭代地完善答案。
  3. 将检索到的内容总结成符合 prompt 的形式。
  4. 基于不同的 contexts 生成多个答案,然后将它们连接或总结。

在这里插入图片描述

大模型&AI产品经理如何学习

求大家的点赞和收藏,我花2万买的大模型学习资料免费共享给你们,来看看有哪些东西。

1.学习路线图

在这里插入图片描述

第一阶段: 从大模型系统设计入手,讲解大模型的主要方法;

第二阶段: 在通过大模型提示词工程从Prompts角度入手更好发挥模型的作用;

第三阶段: 大模型平台应用开发借助阿里云PAI平台构建电商领域虚拟试衣系统;

第四阶段: 大模型知识库应用开发以LangChain框架为例,构建物流行业咨询智能问答系统;

第五阶段: 大模型微调开发借助以大健康、新零售、新媒体领域构建适合当前领域大模型;

第六阶段: 以SD多模态大模型为主,搭建了文生图小程序案例;

第七阶段: 以大模型平台应用与开发为主,通过星火大模型,文心大模型等成熟大模型构建大模型行业应用。

2.视频教程

网上虽然也有很多的学习资源,但基本上都残缺不全的,这是我自己整理的大模型视频教程,上面路线图的每一个知识点,我都有配套的视频讲解。

在这里插入图片描述

在这里插入图片描述

(都打包成一块的了,不能一一展开,总共300多集)

因篇幅有限,仅展示部分资料,需要点击下方图片前往获取

3.技术文档和电子书

这里主要整理了大模型相关PDF书籍、行业报告、文档,有几百本,都是目前行业最新的。
在这里插入图片描述

4.LLM面试题和面经合集

这里主要整理了行业目前最新的大模型面试题和各种大厂offer面经合集。
在这里插入图片描述

👉学会后的收获:👈
• 基于大模型全栈工程实现(前端、后端、产品经理、设计、数据分析等),通过这门课可获得不同能力;

• 能够利用大模型解决相关实际项目需求: 大数据时代,越来越多的企业和机构需要处理海量数据,利用大模型技术可以更好地处理这些数据,提高数据分析和决策的准确性。因此,掌握大模型应用开发技能,可以让程序员更好地应对实际项目需求;

• 基于大模型和企业数据AI应用开发,实现大模型理论、掌握GPU算力、硬件、LangChain开发框架和项目实战技能, 学会Fine-tuning垂直训练大模型(数据准备、数据蒸馏、大模型部署)一站式掌握;

• 能够完成时下热门大模型垂直领域模型训练能力,提高程序员的编码能力: 大模型应用开发需要掌握机器学习算法、深度学习框架等技术,这些技术的掌握可以提高程序员的编码能力和分析能力,让程序员更加熟练地编写高质量的代码。
在这里插入图片描述

1.AI大模型学习路线图
2.100套AI大模型商业化落地方案
3.100集大模型视频教程
4.200本大模型PDF书籍
5.LLM面试题合集
6.AI产品经理资源合集

👉获取方式:
😝有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费】🆓

在这里插入图片描述

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

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

相关文章

【Python游戏开发】贪吃蛇游戏demo拓展

拓展上一项目【Python游戏开发】贪吃蛇 实现穿墙效果 # 检测游戏是否结束 def check_gameover():global finished# 移除蛇头位置超过窗口判断for n in range(len(body) - 1):if(body[n].x snake_head.x and body[n].y snake_head.y):finished True # 状态检测 def ch…

嘴尚绝卤味:健康美味的双重奏

在当今快节奏的生活中&#xff0c;人们对美食的追求不再仅仅停留于味蕾的满足&#xff0c;更加注重食物的健康与营养。在这一背景下&#xff0c;"嘴尚绝卤味"以其独特的健康理念与精湛的制作工艺&#xff0c;成为了市场上备受瞩目的卤味品牌。本文将从"嘴尚绝卤…

Linux运维01:VMware创建虚拟机

视频链接&#xff1a;05.新建VM虚拟机_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1nW411L7xm/?p14&spm_id_from333.880.my_history.page.click&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5 1.点击“创建虚拟机” 2.选择“自定义&#xff08;高级&#xff0…

15分钟学 Python 第41天:Python 爬虫入门(六)第二篇

Day41&#xff1a;Python爬取猫眼电影网站的电影信息 1. 项目背景 在本项目中&#xff0c;我们将使用 Python 爬虫技术从猫眼电影网站抓取电影信息。猫眼电影是一个知名的电影信息平台&#xff0c;提供了丰富的电影相关数据。通过这个练习&#xff0c;您将深入学习如何抓取动…

小白必看一文彻底搞懂 Transformer(图解+手撕)

Transformers 亮相以来彻底改变了深度学习模型。 今天&#xff0c;我们将揭示 Transformers 背后的核心概念&#xff1a;注意力机制、编码器-解码器架构、多头注意力等等。 通过 Python 代码片段&#xff0c;让你深入了解其原理。 技术交流群 前沿技术资讯、算法交流、求职…

用IMX6UL开发板编写按键输入实验

在之前我们都是讲解如何使用IMX6UL的GPIO输出控制等功能&#xff0c;IMX6U的IO不仅能作为输出&#xff0c;而且也可以作为输入&#xff0c;而我们开发板上具有一个按键&#xff0c;按键肯定是连接了一个IO口的额&#xff0c;我们在这一节将会把IO配置成输入功能&#xff0c;读取…

JAVA基础面试题汇总(持续更新)

1、精确运算场景使用浮点型运算问题 精确运算场景&#xff08;如金融领域计算应计利息&#xff09;计算数字&#xff0c;使用浮点型&#xff0c;由于精度丢失问题&#xff0c;会导致计算后的结果和预期不一致&#xff0c;使用Bigdecimal类型解决此问题&#xff0c;示例代码如下…

Java类的生命周期浅析

知识前提 在了解类的生命周期之前&#xff0c;有必要先了解一下jvm的内存结构。如下所示&#xff1a; 在了解完jvm的内存结构之后&#xff0c;就知道了例如堆区&#xff0c;栈区&#xff0c;常量池和方法区等概念。 也了解到了&#xff0c;编写的代码&#xff0c;是先需要通过…

使用pytdx获取股票信息总结

使用pytdx获取股票相关信息汇总 行情接口标准行情对接总结界面展示性能问题数据可靠性 附录代码 行情接口 pytdx中提供了hq&#xff08;标准行情&#xff09;及exhq&#xff08;扩展市场行情&#xff09;两种接口&#xff0c;扩展市场目前已经失效无法使用。 标准行情 这里只…

4. Getter和Setter注解与lombok

文章目录 1. 什么是Getter和Setter注解2. 什么是lombokjava自带的jar包 3. 从maven仓库里找lombok相关jar包4. 把jar包导入项目另一个jar包导入途径 5. 正式使用注解① 问题② 解决方案提示 6. 如果还想对某个成员变量添加限制怎么办7. 内容出处 1. 什么是Getter和Setter注解 官…

【包教包会】速通LLM《从头开始构建大型语言模型》免费pdf分享

介绍 在当今人工智能技术飞速发展的时代&#xff0c;大型语言模型&#xff08;LLM&#xff09;作为聊天机器人、文本生成和理解等应用的核心&#xff0c;已经成为研究和商业领域的关注焦点。尽管这些模型的应用无处不在&#xff0c;但对于大多数开发者来说&#xff0c;它们的工…

AI正悄然地影响着企业数字化转型

2022年底发布的ChatGPT将人工智能技术上升到了一个新的高度。如今&#xff0c;人工智能正彻底改变数字转型的进程&#xff0c;为企业提供优化运营和提升客户体验的机会。利用算法、数据分析、机器学习等人工智能技术结合企业自身情况&#xff0c;可以推动企业持续创新&#xff…

每日OJ题_牛客_mari和shiny_线性dp_C++_Java

目录 牛客_mari和shiny_线性dp 题目解析 C代码 Java代码 牛客_mari和shiny_线性dp mari和shiny (nowcoder.com) 描述&#xff1a; mari每天都非常shiny。她的目标是把正能量传达到世界的每个角落&#xff01; 有一天&#xff0c;她得到了一个仅由小写字母组成的字…

ElasticSearch 备考 -- Snapshot Restore

一、题目 备份集群下的索引 task&#xff0c;存储快照名称为 snapshot_1 二、思考 这个涉及的是集群的备份&#xff0c;主要是通过创建快照&#xff0c;涉及到以下2步骤 Setp1&#xff1a;注册一个备份 snapshot repository Setp2&#xff1a;创建 snapshot 可以通过两种方…

找生网站方案———未来之窗行业应用跨平台架构

1&#xff09;网站设计方面的考虑 主色调采用于公司深蓝色颜色&#xff0c;网页整体色彩明快、大气、简洁&#xff0c;每个细节均经过精心处 理&#xff0c;网页浏览快速&#xff0c;导航明确清晰。 网页设计要充分考虑网页的整体感觉&#xff0c;每个页面的图片与网站色调的过…

YOLO11改进 | 卷积模块 | 用Ghost卷积轻量化网络【详细步骤】

秋招面试专栏推荐 &#xff1a;深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转 &#x1f4a1;&#x1f4a1;&#x1f4a1;本专栏所有程序均经过测试&#xff0c;可成功执行&#x1f4a1;&#x1f4a1;&#x1f4a1; Ghost 模块可以作为即插即用组件来升级…

C(十四)while、for、do-while循环综合(一)

uu们&#xff0c;小弟我本科在读&#xff0c;文章我会一直坚持更新下去&#xff0c;包括但不限于C初阶、C进阶、数据结构、C、Linux、MySQL、项目、QT开发、各种算法&#xff08;之后会持续更新&#xff09;&#xff0c;并且站在小白的视角尽可能通俗易懂地把这些写出来&#x…

xss之dom类型

目录 xss关于dom类型 1、闭合方式 2、闭合&#xff0c;直接输入1&#xff0c;成功闭合 上我们的pikachu xss关于dom类型 1、闭合方式 输入123&#xff0c;然后打开f12&#xff0c;审查元素&#xff0c;之前一直没有搞懂为什么要在前面加上个单引号 输入两个双引号&#x…

【STM32开发之寄存器版】(三)-详解NVIC中断

一、前言 STM32F103ZET6具备强大的中断控制能力&#xff0c;其嵌套向量中断控制器(NVIC)和处理器核的接口紧密相连&#xff0c;可以实现低延迟的中断处理和高效地处理晚到的中断。NVIC主要具备以下特性&#xff1a; 68个可屏蔽中断通道(不包含16个Cortex™-M3的中断线)&#xf…

【黑马点评】 使用RabbitMQ实现消息队列——1.Docker与RabbitMQ环境安装

黑马点评中&#xff0c;使用基于Redis的Stream实现消息队列&#xff0c;但是Strema已经不太常用。在此修改为使用RabbitMQ实现消息队列。主要包括RabbitMQ的环境准备&#xff08;Docker的下载与安装&#xff09;以及如何修改黑马点评中的代码。 【黑马点评】使用RabbitMQ实现消…