【指南】RAG:从数据到智能应用程序

2024年07月11日 由 alex 发表 149 0

虽然LLM是个好东西,也是一种趋势,但如果使用不当,也会带来一些弊端。是的,LLM 有时会产生意想不到的回应,它们可能是假的、编造的信息,甚至是有偏见的。出现这种情况的原因有很多。我们将这种由 LLM 生成错误信息的过程称为幻觉。


有一些显著的方法可以缓解 LLM 产生的幻觉,如微调、提示工程、检索增强生成(RAG)等。


10


大型语言模型(LLM)有时会产生幻觉答案,而减少这些幻觉的技术之一就是 RAG。对于用户查询,RAG 倾向于从所提供的源/信息/数据中检索信息,而这些源/信息/数据都存储在矢量数据库中。矢量数据库是存储矢量数据的传统数据库之外的专门数据库。


矢量数据以嵌入的形式存在,可以捕捉对象的上下文和含义。例如,假设你想从人工智能应用程序中获取自定义响应。


首先,组织的文档会通过嵌入模型转换成嵌入数据,并存储在矢量数据库中。当向人工智能应用程序发送查询时,它会被转换为矢量查询嵌入,并通过矢量数据库的矢量相似性搜索找到最相似的对象。这样,你的 LLM 驱动的应用程序就不会产生幻觉,因为你已经指示它提供自定义响应,并为其提供自定义数据。


一个简单的使用案例是客户支持应用程序,将自定义数据输入存储在矢量数据库中的应用程序,当用户查询时,它会生成与你的产品或服务相关的最合适的响应,而不是一些通用的答案。通过这种方式,RAG 正在给世界上许多其他领域带来革命性的变化。


RAG 管道

RAG 管道基本上包括三个关键组件: 检索组件、增强组件和生成组件。


  • 检索: 该组件可帮助你从外部知识库(如矢量数据库)中获取任何给定用户查询的相关信息。这个组件非常关键,因为它是策划有意义且上下文正确的回复的第一步。
  • 增强: 这部分涉及增强和添加更多相关上下文到为用户查询检索的回复中。
  • 生成: 最后,在大型语言模型(LLM)的帮助下,向用户提供最终输出。LLM 利用自身的知识和所提供的上下文,为用户的查询提供合适的回复。


这三个组成部分是 RAG 管道的基础,可帮助用户获得他们正在寻找的上下文丰富且准确的回复。这就是 RAG 在构建聊天机器人、问题解答系统等方面如此特别的原因。


RAG 中的分块策略


11


通过 RAG 提高法律硕士申请的效率是件好事。


但问题是,正确的分块策略应该是什么?


分块是一种将大文件分解成更易于管理的段/块的方法,这样 LLM 应用程序就能获得适当的上下文,检索也会更容易。


在 YouTube 上的一段视频中,Greg Kamradt 概述了不同的分块策略。让我们逐一了解它们。


根据复杂程度和有效性,它们被分为五个级别。


第一级:固定大小的分块

这是最简单粗暴的文本分割方法。Langchain 和 llamaindex 框架为这种分块技术提供了字符文本分块器(CharacterTextSplitter)和句子分块器(SentenceSplitter)(默认在句子上分块)类。


第二级:递归分块

虽然固定大小的分块更容易实现,但它不考虑文本的结构。递归分块法提供了另一种选择。在这种方法中,我们使用一组分隔符以分层和迭代的方式将文本分成更小的分块。Langchain 框架提供了 RecursiveCharacterTextSplitter 类,该类使用默认分隔符("\n\n"、"\n"、""、"")分割文本。


第三级:基于文档的分块法

在这种分块方法中,我们根据文档的固有结构对其进行分割。这种方法考虑了内容的流程和结构,但对缺乏清晰结构的文档可能效果不佳。


第四层:语义分块法

以上三个层次都涉及文档的内容和结构,需要保持分块大小的恒定值。这种分块方法旨在从嵌入中提取语义,然后评估这些分块之间的语义关系。Llamindex拥有SemanticSplitterNodeParse类,可以利用块之间的上下文关系将文档分割成块。


第5级:代理分块

这种分块策略探索了使用 LLM 的可能性,以根据上下文确定分块中应包含多少文本和哪些文本。


使用 RAG 让人工智能访问非结构化数据很受欢迎,但也带来了巨大的挑战,其中包括管理非结构化数据集的不可预测性和确保检索质量。这些挑战包括管理非结构化数据集的不可预测性和确保检索质量。trufflepig 允许开发人员按原样上传数据并根据查询接收相关结果,从而直接解决了这些挑战。


12


trufflepig 是一个完全可管理的检索 API,可通过自然语言搜索非结构化数据。它为 RAG 的检索步骤提供了端到端的解决方案,因此你可以专注于完善应用程序的业务特定方面,而不是创建和管理基础设施。


trufflepig 的检索方法消除了与其他框架或 RAG 工具相关的修补工作。忘记管理单独的文档存储、自定义分块逻辑或摄取。我们的系统会根据语义结构对你的数据进行智能索引,以实现闪电般快速的相关检索。


RAG 痛点与解决方案


13


RAG 乍一看似乎很容易,但事实可能并非如此。有效检索是一件痛苦的事情,在这一重要阶段可能会遇到一些问题。


使用 LlamaIndex 的 RAG


14


LlamaIndex 是一个框架,提供用于创建高级 RAG 应用程序的库。图片展示了 LlamaIndex 的高层工作方式。让我们更好地了解 LlamaIndex 的工作流程。


LlamaIndex 提供了一个用于摄取各种类型内容(如文档、数据库和 API)的框架,这使它成为一个强大的框架,可用于构建具有多种类型内容的 LLM 应用程序,而且你希望对查询做出集成响应。


LlamaIndex 有两个主要阶段。加载/索引和查询。


在加载和索引阶段,被摄取的文档会被分解成内容块。使用嵌入模型将这些内容块转换为嵌入内容。这样就创建了内容的矢量表示,类似的内容在多维空间中映射得更接近。该矢量存储在矢量数据库中(免费使用 SingleStore 作为你的矢量数据库),LlamaIndex 还存储了索引,以便更快地进行语义搜索。


当发出查询时,查询会转换为嵌入向量,并在向量数据库中进行语义搜索,以检索所有类似内容,这些内容可作为查询的上下文。然后将其传递给大型语言模型,以获得响应。


使用 LangChain 的 RAG


15


LangChain 是 Harrison Chase 开发的一个开源人工智能框架,通过提供所需的所有组件,帮助开发人员创建强大的人工智能应用程序。LangChain 配备了内存功能、与向量数据库的集成、连接外部数据源的工具、逻辑和 API。这使得 LangChain 成为构建由 LLM 驱动的应用程序的强大框架。


请看上图,PDF 是我们的外部知识库,它以向量嵌入(向量数据)的形式存储在向量数据库中。基本上,PDF 文档会被分割成一小块一小块的单词,然后这些单词会被赋予称为向量嵌入的数字编号。你需要一个嵌入模型来将文本、图像、音频、视频转换成嵌入数据。


用户查询会经过相同的 LLM 将其转换为嵌入,然后通过向量数据库找到最相关的文档。找到相关文档后,再通过 LLM 添加更多上下文,最后生成响应。这样一来,RAG 就成了大多数 LLM 驱动的应用程序的面包和黄油,即使不是相关的,也能检索到最准确的回复。有一些著名的人工智能框架,如 LangChain 和 LlamaIndex,通过提供所需的所有工具包,帮助这些 LLM 应用程序变得强大。


让我们通过本教程了解如何在 RAG 设置中使用 LangChain。


RAG 评估策略


16


RAG 评估领域不断发展,对于人工智能/ML/数据工程师来说,全面了解这些概念非常重要。


RAG 评估包括对检索和生成特定输入文本组件的评估。


从高层次来看,RAG 评估算法可分为两类。1) 基本事实(理想答案)由评估者/用户提供 2) 基本事实(理想答案)也由另一个 LLM 生成。


为便于理解,可以划分为 5 个子类别。

1. 基于字符的评价

2. 基于单词的评估

3. 基于嵌入的评估

4. 数学框架

5. 基于实验的框架


文章来源:https://levelup.gitconnected.com/the-many-facets-of-rag-from-data-to-intelligent-applications-498fbaf4b1f8
欢迎关注ATYUN官方公众号
商务合作及内容投稿请联系邮箱:bd@atyun.com
评论 登录
写评论取消
回复取消