手记

基于检索增强生成(RAG)的基础实现:小白也能懂的讲解

Rag结构的详细解析

使用Dall-e的作者,注:Dall-e(dā lá lē)

比如问“哪个行星有最多的卫星?”一个大型语言模型(LLM)可能会说木星有88颗卫星(基于旧信息)。然而,查看NASA的网站后会发现,正确的答案是土星有146颗卫星(最新数据)。

在快速发展的自然语言处理(NLP)领域中,检索增强生成(RAG)作为一种结合了信息检索和文本生成的强大方法崭露头角。本文将介绍RAG的基本结构,包括索引、检索和生成这三个方面。理解这些组件对提升大型语言模型(LLMs)的能力至关重要。理论背景请参阅“NLP 的演变:从嵌入表示到基于 Transformer 的模型”;如需了解更多高级主题,请查阅“超越炒作:检索增强生成(RAG)的有效实施”。

加入我们,和我们一起探索RAG的奥秘,并增强LLM的能力,从而在自然语言处理领域树立新的标准。

· 什么是RAG?
· RAG中的索引和分块
· 编写有效的RAG提示
· RAG系统的复杂性概述
· RAG系统的痛点
· RAG系统:超越炒作
· 总结
· 参考资料和进一步阅读

RAG是什么?

检索增强生成模型(RAG模型) 是一种自然语言处理(NLP) 领域中强大且创新的方法。其核心思想是结合了信息检索文本生成 的强项,以生成更准确且更符合上下文的响应。RAG的基本结构包括三个关键组成部分:索引创建检索过程内容生成

LangChain(语言链)

索引化阶段,系统处理并组织大量的数据,这一过程高度依赖于嵌入方法。这些嵌入将文本数据转换成数值向量,从而使其更容易管理和搜索。

要详细了解嵌入及其发展过程,以及了解注意力机制和基于变压器的模型,请参阅我的详细博客文章《从嵌入到基于变压器的自然语言处理模型演变》。

接下来是检索阶段,系统使用相似性从索引的数据中找出最相关的片段。这确保提供给生成模型的上下文与当前查询高度相关。

最后,在生成阶段中,大规模语言模型(LLMs)开始工作,根据找到的上下文生成连贯且合适的回复。

在接下来的部分里,我们将更深入地研究每个部分。

为什么要用RAG(检索-读取-生成模型,即Retrieval-Augmented Generation模型)来增强大型语言模型呢?

作者使用Dall-e创作

大模型可能会变得过时。RAG 通过让它们查阅实时资料(例如 NASA 的数据)来解决这个问题。例如,想象一下询问“哪个行星有最多的卫星?”一个大模型可能会回答说木星有 88 颗卫星(基于旧的信息)。然而,RAG 会查询 NASA 的最新数据,并更正为土星有 146 颗卫星。这确保了 RAG 使大模型保持最新的信息,从而更可靠。

想了解更多关于RAG是如何工作的,可以看看这个IBM视频。点击这里观看。这个视频很有帮助。

下面来看看大型语言模型(LLM)的几个关键限制,以及检索和生成(RAG)是如何帮助解决这些问题的。

缺乏事实依据的虚构

  • 问题: 大型语言模型(LLM)可以生成不符合事实或无意义的文本。
  • RAG解决办法: 获取最新且可靠的信息,减少错误和虚构内容。

一个静态的知识库

  • 问题:大型语言模型依赖陈旧的训练数据。
  • RAG解决方法:动态检索当前数据源的数据。

内存限制和资源消耗:

  • 问题点:大型语言模型的容量有限,训练它们耗资巨大。
  • RAG解决方案:访问外部知识库以扩展容量并提高效率。

准确性、精确性和相关

  • 问题:大语言模型可能不够精确,并且在保持上下文方面存在问题。
  • RAG:检索特定和相关的信息,从而提供准确且上下文相关的答案。

聊聊那些罕见或者小众的主题

  • 问题:大型语言模型在处理冷门话题时可能表现不佳。
  • RAG解决方法:访问专门的数据库来获取准确的信息。

通过解决这些限制问题,可以提高LLM的表现和可靠性,提供更准确、上下文相关的输出。

RAG中的索引和分段

要想有效利用检索增强生成技术(RAG),首先要明白系统是怎样处理和组织数据的,这一点非常重要。这包括几个关键步骤,如索引、分块、嵌入,以及把嵌入存入数据库实现高效检索。

LangChain

数据索引

索引是高效检索数据的第一步。在这个阶段,文档会被处理并转换成易于搜索的格式。这通常包括将文档分解成更小、更易管理的块,直接使用“分块”来翻译“chunk”。

分段处理(分段)

(注解:如果上下文表明更倾向于技术或教育语境,可以使用“分块处理”。)

分段是指将文档分成更小的部分或段落。每个段落都是文档的一个独立部分,可以独立处理和检索。这有助于处理大型文档,因为可以专注于相关部分而不是整个文档。例如,在搜索文章时,可以先搜索段落,而不是整个文档。

好处:

  • 提高搜索效率,使信息查找更快捷。
  • 使检索到的信息更加相关。
  • 使在大型文档中更精确地查找特定信息更加容易。
片段的嵌入表示

图片来自哈里亚姆·古特姆的Medium文章Hariam Gautam

将嵌入向量存储到向量数据库中

为每个片段创建嵌入后,并将它们存储在向量数据库中。该数据库支持根据嵌入高效地搜索和检索相似文档。

向量数据仓库

  • 存储高维向量来表示各个片段。
  • 支持使用分层可导航小世界(HNSW)、K-近邻(KNN)和FAISS进行快速相似搜索。

KNN(K近邻)算法

  • 一个简单的算法程序,对于给定查询,基于欧几里得距离等度量,找到最接近的k个嵌入向量。

FAISS(Facebook AI 的相似搜索工具) :

  • FAISS是一个用于相似搜索和聚类的高效库,它针对大规模稠密向量进行了优化并能够处理数十亿个向量。
使用余弦相似性搜索相关分割

当进行查询时,查询同样会被转换成一个嵌入向量。接着,在向量数据库中搜索,以找到与查询最相似的嵌入片段。衡量嵌入相似度的一种常见方法是 余弦相似度

感谢: https://aitechtrend.com/

余弦相似性

  • 计算两个向量之间夹角的余弦。其范围从-1到1,1表示两个向量完全相同,0表示两个向量正交,-1表示两个向量完全相反。
  • 这种方法有效,因为它更关注向量的方向,而不是大小,因此即使向量长度不同也能保持稳健。

步骤:

  • 查询被嵌入成一个向量。
  • 利用余弦相似度在向量数据库中搜索与查询最相似的嵌入。
  • 根据相似度检索与查询相关的片段。

通过索引数据、将其分块、创建嵌入,并存储在向量数据库中,RAG系统可以有效地处理大量数据集并提供准确且与上下文相关的回答。

编写有效的提示以用于RAG

创建适合 Retrieval-Augmented Generation (RAG) 的语言模型的完美提示至关重要,这可以充分发挥其全部潜力。提示指导模型如何利用检索到的信息生成最准确且与上下文相关的响应。这里有一个遵循 Reader LLM 聊天格式的 RAG 提示模板示例。

提示模板示例
    # 提示:
    模板 = """仅根据以下内容回答问题:{context}  
    问题:{question}  
    """
    提示 = 使用模板创建提示
主要部件
  • Context : 提供生成相关回复所需的背景信息。
  • Question : 具体需要回答的问题。
  • Template : 将背景信息和问题结合在一起,形成结构化的格式,确保模型能够有效地利用检索到的数据。

设计良好的提示为何重要

  1. 指引:清晰的指引使模型专注于相关上下文,减少生成不相关或错误答案的可能性。
  2. 一致性表现:采用标准模板确保在不同查询和情境中表现一致。
  3. 效率:精心设计的指令使检索和生成过程更高效,最大限度地利用模型的潜力。

通过设计有效的提示,你可以显著提升RAG系统的性能和可靠性,确保它们能给出准确且符合上下文的合适回应。

简述

这篇博客文章深入挖掘了Retrieval-Augmented Generation (RAG),这是一种结合了信息检索和文本生成的自然语言处理(NLP)领域的最新方法,可以生成更准确且与上下文相关的回复。我们将探讨RAG的关键部分——索引、检索和生成,并突出这些系统如何增强大型语言模型的性能和稳定性。

包括以下关键话题:

  • 索引和分块:将数据拆解并组织成易于管理的片段,以便高效地检索。
  • 嵌入和向量数据库:将片段转换为数值向量表示并存储,以便使用诸如K-近邻(KNN)或FAISS等方法进行快速相似性搜索。
  • 设计有效的提示:设计引导模型准确使用检索到的信息的提示。

它提供了一个关于RAG的清晰实用介绍,为更详细的代码教程铺垫了基础。

通过最多50下鼓掌👏帮助他人发现宝贵的信息。你的掌声能帮助更多人了解这些知识。

参考来源和进一步阅读

如果你对本篇博客文章感兴趣并希望深入了解其中主题,这里有一些不错的资源推荐。

自然语言处理从词嵌入到基于Transformer的模型的历程

关于RAG的精彩解释

RAG(检索、提取、生成)从头开始

相关讨论

0人推荐
随时随地看视频
慕课网APP