本专栏聚焦大语言模型(LLM)相关内容的解析,通过检索增强生成(RAG)应用的视角来进行。
本系列文章

如上图所示,即使是一个简单的检索增强生成应用,也需要调整许多不同的参数、组件和模型。
在我最近对语言模型(LLM)应用的探索中,检索增强生成(RAG)所扮演的重要角色让我着迷。要理解从概念化到在云端部署的端到端检索增强生成架构,可能颇具挑战性。
为了解决这个问题,我很高兴地宣布,即将推出一系列详细的博客文章。我将通过检索增强生成应用的视角,剖析大语言模型的复杂之处,全面讲解检索增强生成流程的每个阶段,并提供实际操作经验。
我的目标是让每个人都能更轻松地理解复杂的大语言模型世界,确保每个阶段都能得到详细的阐述。
和我一起踏上这段富有启发性的旅程,通过对检索增强生成的全面研究,深入挖掘大语言模型应用的潜力。
1. 什么是检索增强生成?
如果你一直在向量存储或其他一些数据库中查找数据,并在生成输出时将相关信息作为上下文传递给大语言模型,那么你已经在进行检索增强生成了。检索增强生成,简称 RAG,是由 Meta 在 2020 年推广的一种架构,旨在通过将相关信息与问题/任务详情一起传递给模型,来提高大语言模型的性能。
2. 为什么选择检索增强生成?
大语言模型是在大量的语料库上进行训练的,它们可以利用其参数化的记忆来回答任何问题或完成任务。这些模型存在知识截止日期,具体取决于它们最后一次训练的时间。当被问到超出其知识库范围的问题,或者关于在知识截止日期之后发生的事件的问题时,模型很有可能会产生幻觉(给出错误或无根据的答案)。Meta 的研究人员发现,通过提供与当前任务相关的信息,模型完成任务的性能会显著提高。
例如,如果模型被问到一个在截止日期之后发生的事件,将关于该事件的信息作为上下文提供,然后再提出问题,这将有助于模型正确回答问题。由于大语言模型的上下文窗口长度有限,我们只能传递与当前任务最相关的知识。我们在上下文中添加的数据质量会影响模型生成的回复质量。机器学习从业者在检索增强生成流程的不同阶段会使用多种技术来提高大语言模型的性能。
3. 检索增强生成的高层架构
LangChain 有一个以最小(但并非最简单)形式呈现的检索增强生成示例:
一个典型的检索增强生成应用有两个主要组件:
- 索引构建:这是一个从数据源摄取数据并对其进行索引的流程。这通常是离线进行的。
- 检索与生成:实际的检索增强生成链,它在运行时接收用户查询,从索引中检索相关数据,然后将其传递给模型。
从原始数据到答案的最常见完整流程如下:
索引构建
- 加载:首先,我们需要加载数据。这是通过文档加载器(DocumentLoaders)来完成的。
- 分割:文本分割器将大型文档分割成较小的块。这对于索引数据和将其传递给模型都很有用,因为大块数据更难搜索,并且无法放入模型有限的上下文窗口中。
- 存储:我们需要一个地方来存储和索引我们分割好的数据,以便日后进行搜索。这通常是使用向量存储(VectorStore)和嵌入模型(Embeddings model)来完成的。

检索
给定用户输入,使用检索器(Retriever)从存储中检索相关的分割数据。
生成
聊天模型/大语言模型使用包含问题和检索到的数据的提示来生成答案。

python
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)的描述,但代码被高度抽象了,所以很难理解其中发生了什么:
- 我们获取了一个网页的内容(在这个例子中,这是我们的知识库)。
- 我们处理源内容并将其存储在知识库中(在这个例子中是一个向量数据库)。
- 我们输入一个提示,LangChain 从知识库中找到相关信息,并将提示和知识库的结果都传递给大语言模型。
虽然这个脚本对于原型设计和理解使用检索增强生成的主要步骤很有帮助,但它对于进一步的开发并没有太大的用处,因为你没有太多的控制权。让我们来讨论一下实现过程中涉及的内容。
4. 结论
在大语言模型应用系列的第一部分中,我们剖析了检索增强生成(RAG)在增强大语言模型(LLMs)方面的重要作用。从理解检索增强生成背后的动机,到探索大语言模型应用架构的组件,我们揭示了使这些应用发挥作用的各个层面。
我们深入探讨了知识库检索的复杂之处,强调了 ETL(抽取、转换、加载)流程以及像 Unstructured、LlamaIndex 和 LangChain 的文档加载器等工具的重要性。我们还强调了维护最新知识库的重要性,并提到了高效的文档索引过程。
请继续关注我们即将发布的博客文章,我们将继续探索检索增强生成流程的其余阶段。从用户查询处理到前端开发,我们将提供实际操作的见解,揭开大语言模型应用的神秘面纱。让我们一起释放大语言模型的全部潜力,让复杂的知识在自然语言理解和生成领域变得通俗易懂。敬请期待更多内容!
鸣谢
在这篇博客文章中,我们整理了来自各种来源的信息,包括研究论文、技术博客、官方文档等。
以下是参考列表:
- https://llmstack.ai/blog/retrieval-augmented-generation
- https://python.langchain.com/v0.1/docs/use_cases/question_answering/#quickstart
- https://python.langchain.com/v0.1/docs/use_cases/question_answering/#quickstart
- https://medium.com/@vipra_singh/building-llm-applications-introduction-part-1-1c90294b155b