这就是RAG 一看就懂的个人知识库架构_哔哩哔哩_bilibili

检索增强生成 (RAG) 架构详解

1. 大模型“幻觉”现象及其解决方案背景

大模型在处理问题时可能出现“幻觉”,即生成与输入问题看似相关但实际脱离上下文的、一本正经的错误回答。将完整文档与问题一并输入大模型可初步解决此问题。然而,当文档内容庞大时,答案可能仅存在于文档的局部或零散信息中。此时,大模型接收完整文档反而容易分散注意力,无法准确捕捉关键信息,导致回答偏离。

2. RAG (Retrieval Augmented Generation) 的核心思想

RAG 旨在解决大模型处理长文档时面临的挑战,其核心在于:在将问题提交给大模型之前,仅从长文档中检索并提取与问题最相关的内容片段,然后将这些相关片段连同用户问题一同提供给大模型,作为其生成回答的上下文。

3. Embedding 模型:判断文本相关性的关键

3.1. 定义与功能

Embedding 模型是一种特殊的神经网络模型,其输入是一段文本(可以是句子或段落),输出是一个固定长度的数值数组(也称为向量或竖组)。

3.2. 与大语言模型的区别

  • 输入:两者均接受文本作为输入。
  • 输出
  • 大语言模型输出的是生成文本。
  • Embedding 模型输出的是一个固定长度的数值数组。
  • 目的
  • 大语言模型旨在理解和生成人类语言。
  • Embedding 模型旨在将文本转换为数值表示,以便进行数学运算,特别是衡量语义相似度。

3.3. 输出特征与意义

  • 固定长度:无论输入文本长短,输出的数组长度均固定。例如,OpenAI 的 Text Embedding 3 Small 模型输出 1536 维向量,Text Embedding 3 Large 模型输出 3072 维向量。
  • 有损压缩:可以将输出数组理解为对原始文本信息的有损压缩。信息被浓缩,但其核心语义得以保留。
  • 语义相似性:语义相似的文本经过 Embedding 模型处理后,其对应的向量在数学空间中的距离会非常接近。反之,语义差异大的文本,其向量距离则较远。

3.4. 向量空间与距离度量

  • 高维坐标系:输出的固定长度数组可被视为一个高维坐标系中的一个点(例如,1536 维或 3072 维)。
  • 语义映射:Embedding 模型会将语义上接近的文本映射到向量空间中相互靠近的点。
  • 示例:
  • “老王爱吃瓜”与“老王喜欢吃瓜”的向量距离会非常近。
  • “我也爱 Python”的向量距离会稍远。
  • “刚买的飞机被打了”的向量距离会非常远。
  • 准确性:高维向量空间能够更准确地表达文本之间的语义距离关系,避免低维空间(如二维)因信息拥挤而导致的失真。

4. RAG 的工作流程

4.1. 文档预处理阶段

在用户提问之前,需对目标文档进行一次性处理:

  1. 分块 (Chunking)
  • 将整个长文档切分成多个小片段。
  • 切片方法:按字数、按段落、按句子,或采用更复杂的语义分块算法。
  • 专业术语:chunking
  1. Embedding 生成
  • 对每个切分后的小片段,使用 Embedding 模型生成对应的固定长度向量。
  1. 向量存储与关联
  • 将每个生成的向量与其原始文本片段的对应关系保存起来。
  • 向量数据库:专门设计用于存储和检索向量数据,能够高效地查找与输入向量距离最近的数据。这与传统数据库根据精确数值查找记录的模式不同。
  • 常见向量数据库:Pinecone, ChromaDB, 以及 PostgreSQL 配合 PG Vector 插件等。

4.2. 用户查询阶段

当用户提出问题时,RAG 系统执行以下步骤:

  1. 问题 Embedding
  • 使用与文档预处理时相同的 Embedding 模型,将用户问题转化为一个向量。
  1. 向量检索
  • 将问题向量输入到向量数据库中。
  • 向量数据库根据距离算法(如余弦相似度)查找与问题向量距离最近的几段文档片段。
  1. 上下文构建与提交
  • 将检索到的相关文档片段作为上下文。
  • 将此上下文与用户的原始问题一同发送给大语言模型。
  • 大语言模型接收到的是强相关内容,从而降低“幻觉”风险,提高回答的准确性。

5. RAG 架构的挑战与改进方向

5.1. 固有缺陷

  1. 分块策略的局限性
  • 文章结构各异,单一的分块方法(按字数、段落、句子)难以适配所有场景。
  • 关键内容截断:重要信息可能在分块时被不当地切断,导致上下文丢失或指代关系错位。
  • 示例:“我是程序员老王,我爱吃瓜。”若切分为两段,“我爱吃瓜”中的“我”将失去与“老王”的指代关系,进而影响相关性判断。
  • 再复杂的分块策略也只能尽量减少误伤,无法彻底避免。
  1. 缺乏全局视角
  • RAG 侧重于检索与问题直接相关的局部片段。
  • 对于需要全局信息汇总的问题(例如“这篇文章中‘我’字共出现了多少次?”),RAG 难以处理,因为此类问题与文章中任何单一语句的相关性都不够强,但与整体文章均有涉猎。

5.2. 改进方案

为弥补上述缺陷,目前涌现出多种改进方案,例如:

  • 预处理优化:在分块前进行文本替换,如将所有“我”统一替换为明确的指代对象(“老王”)。
  • 大模型参与分块:让大语言模型根据语义自动判断最佳的切分点和方式。

目前尚未出现完美的解决方案,新的想法仍在不断探索中。

6. RAG 的本质与哲学思考

RAG 本质上是一种在有限大模型上下文窗口下的妥协策略。它通过文档切块、筛选、索引等方式进行信息压缩,保留重要信息,舍弃不重要的部分,以期让模型的回答更贴近事实。这种机制能够解决一部分问题,但仍存在诸多未解难题。RAG 是一种过渡性架构,期待未来出现真正意义上突破现有局限的下一代架构。

这种信息处理方式也映射到日常生活中:面对海量信息,人们通过分类和取舍来管理和记忆。虽然这有助于高效处理信息,但过度细碎的切分有时可能导致上下文丢失,误解原意,甚至使原本重要的联系被削弱或遗忘。