Lazy loaded image
技术分享
如何构建一个核心RAG系统?
字数 2148阅读时长 6 分钟
2025-9-2
2025-9-2
type
status
date
slug
summary
tags
category
icon
password

1.什么是RAG系统?

RAG系统,全称是“检索增强生成系统”,它是一种结合了信息检索和文本生成技术的 AI 系统。RAG 系统的核心思想是:不要让 LLM 单打独斗,而是给它提供相关的外部知识,让它在生成答案的时候有所依据,从而提高答案的质量和可靠性。 它可以解决 LLM 在知识更新方面滞后,以及容易产生幻觉(捏造事实)等问题。
在开始深构建核心检索增强生成(RAG)系统之前,我们需要首先进行一些必要的准备工作。其中一个关键步骤是配置好我们的开发环境,以便能够有效地跟踪和管理实验过程中的各种活动,并顺利执行其他相关的任务。这包括设置必需的环境变量,以便程序能够正确运行并访问必要的资源。一个具体的例子就是选择并配置我们将要使用的语言模型(LLMs)API提供程序。
核心 RAG 流水线是高级系统的基石,理解其组件至关重要。因此,在探讨高级组件之前,我们将首先介绍 RAG 系统的核心逻辑。
notion image
一个最简单的 RAG 可以分为三个部分:
  • 索引:以结构化格式组织和存储数据,以实现高效搜索。当你向 RAG 系统提出一个问题时,它首先会从一个大型的知识库(比如文档库、数据库等)中,检索出与你的问题相关的文档或信息片段。 就像你在搜索引擎里输入关键词,搜索引擎会返回与关键词相关的网页一样。
  • 检索:根据查询或输入搜索并获取相关数据。RAG 系统会把检索到的信息和你提出的问题结合起来,形成一个更全面的“输入”。 相当于给 AI 系统提供了更多的上下文信息,帮助它更好地理解你的问题。
  • 生成:使用检索到的数据创建最终响应或输出。RAG 系统会利用大型语言模型 (LLM),根据增强后的输入,生成最终的答案。 LLM 会利用检索到的信息来完善答案,使其更准确、更相关。

1.1 索引

在 RAG 系统能够回答任何问题之前,它首先需要从中汲取知识。为此,我们将使用WebBaseLoader直接从子鱼的博客文章中提取内容。
利用bs_kwargs,我们可以从一开始就针对性地清理HTML数据,例如post-contentpost-title等标签。获取文档后,我们需要将海量文档输入LLM,但这既低效又受上下文窗口限制。因此,分块至关重要,需将文档分解为更小、语义完整的片段。
使用RecursiveCharacterTextSplitter则能智能地保持段落和句子的完整性。
接着,我们通过设置chunk_size=1000创建1000字符的块,并使用chunk_overlap=200确保块之间存在200字符的重叠,以保留上下文信息。
现在虽然文本已被分割,但仍需转换为数值表示,即“嵌入”,以便进行相似性搜索。这些嵌入随后会被存储在向量存储中,这是一种专门为高效向量搜索而设计的数据库。
然后我们可以借助Chroma向量存储OpenAIEmbeddings,这将使得嵌入和索引过程变得非常简单。一行代码即可完成所有操作。
这便是索引的全部流程,在知识索引之后,我们便可以在此基础上进行检索。

1.2 检索

向量库就像一个图书馆,检索器则是一个智能图书管理员。它接收用户的查询,将其嵌入,然后从向量库中获取语义最相似的块。而创建检索器只需要一行代码。
然后我们可以测试一下这个检索器,也就是问一个问题,然后看看检索器会如何输出。
如你所见,检索器成功地从博客文章中提取出了最相关的内容,这些内容直接讨论了"Foundation Agent"。这段上下文正是语言模型形成准确答案所需要的。

1.3 生成

现在有了上下文,但需要 LLM 来进行解读,并形成一个通俗易懂的答案。这就是RAG 中的“生成”步骤。首先,我们需要一个好的提示模板。它会指导 LLM 如何操作。你可以自己进行编写,但如果你是新手,我建议还是从 LangChain Hub 导入一个预先优化好的模板。
然后使用gpt-3.5-turbo来初始化LLM,这一步也只需要一行代码。
现在我们就可以将所有内容链接在一起。使用 LangChain 表达式语言 (LCEL),将一个组件的输出通过管道传输到下一个组件的输入。
这个链条由下面四个部分组成:
  1. {"context": retriever | format_docs, "question": RunnablePassthrough()}:此部分并行运行。它将用户的问题发送到retriever以获取文档,然后由 将其格式化为单个字符串format_docs。同时,RunnablePassthrough将原始问题原封不动地传递过去。
  1. | prompt:上下文和问题被输入到我们的提示模板中。
  1. | llm:格式化的提示将发送给LLM。
  1. | StrOutputParser():这会将 LLM 的输出清理为一个简单的字符串。
然后,我们可以调用整个链条。

2.总结

这便是一个比较详细的构建核心RAG系统的简易教程了。通过本文的介绍,您应该大致会对RAG系统构建的基本原理和实现方法有了初步了解,包括索引、检索和生成这三个核心步骤。虽然这只是一个入门级的教程,但它的确涵盖了构建一个功能完整的RAG系统所需的所有基本要素。希望能够对有需要的人有所帮助,诸君共勉~
 
上一篇
糟了,怎么连AI都会玩宝可梦了……
下一篇
如何在你的业务中选择RAG和Fine tuning?

评论
Loading...