什么是检索增强生成?
如果你一直在向量存储或其他数据库中查找数据,并在生成输出时将相关信息作为上下文传递给 LLM,那么你已经在进行检索增强生成了。检索增强生成(简称 RAG)是 Meta 于 2020 年推广的一种架构,旨在通过将相关信息与问题/任务细节一起传递给模型来提高 LLM 的性能。
为什么是 RAG?
LLM 是在大型数据集上训练出来的,可以利用其参数化内存回答任何问题或完成任务。这些模型的知识截止日期取决于它们上次接受训练的时间。当被问及知识库之外的问题或知识截止日期之后发生的事件时,模型很有可能会产生幻觉。Meta 公司的研究人员发现,通过提供手头任务的相关信息,模型完成任务的性能会显著提高。
例如,如果模型被问及一个发生在截止日期之后的事件,那么提供该事件的相关信息作为上下文,然后再提问,将有助于模型正确回答问题。由于 LLM 的上下文窗口长度有限,我们只能传递与当前任务最相关的知识。我们在上下文中添加的数据的质量会影响模型生成的回答的质量。人工智能从业者在 RAG 管道的不同阶段使用多种技术来提高 LLM 的性能。
高级 RAG 架构
LangChain 有一个最小(但不是最简单)形式的 RAG 示例:
典型的 RAG 应用程序有两个主要组件:
从原始数据到答案的最常见完整序列如下:
索引
检索: 给定用户输入,使用检索器从存储中检索相关的分片。
生成: 聊天模型/LLM 使用包含问题和检索数据的提示生成答案。
from langchain.document_loaders import WebBaseLoader
from langchain.indexes import VectorstoreIndexCreator
loader = WebBaseLoader("https://www.promptingguide.ai/techniques/rag")
index = VectorstoreIndexCreator().from_loaders([loader])
index.query("What is RAG?")
通过这五行代码,我们得到了 RAG 的描述,但代码被严重抽象化,因此很难理解发生了什么: 我们获取网页(本例中的知识库)的内容。
虽然这个脚本对于原型设计和理解 RAG 的主要功能很有帮助,但对于超越这个阶段并没有什么用处,因为你没有太多的控制权。下面我们就来讨论实施过程中的问题。
总结
在 LLM 应用程序系列的第一部分,我们剖析了检索增强生成(RAG)在增强大型语言模型(LLM)中的重要作用。从了解 RAG 背后的动机到探索 LLM 应用程序架构的各个组成部分,我们揭开了这些应用程序的层层面纱。
我们深入探讨了知识库检索的复杂性,强调了 ETL 管道和工具(如 Unstructured、LlamaIndex 和 LangChain 的文档加载器)的重要性。此外,还强调了维护更新知识库的重要性,以及高效的文档索引流程。
相关文章: