aicode八股分析

RAG

1.什么是RAG

RAG,全称是 Retrieval-Augmented Generation,中文可以理解为 “检索增强生成”

而是一种将信息检索(Information Retrieval)系统与大语言模型(LLM)生成(Generation)能力相结合的技术框架。

解决了LLM的:

知识局限性 (Knowledge Cutoff):LLM 的知识都来自于其训练数据,这些数据有明确的截止日期。对于截止日期之后的新知识,模型是无法感知的。

事实幻觉 (Hallucination):LLM 在回答它不确定的问题时,有时会“编造”听起来合理但实际上是错误的答案,这在需要高度事实准确性的场景中是致命的。

缺乏领域专有知识 (Lack of Domain-Specific Knowledge):对于一些非常专业或企业内部的私有领域,通用的大模型由于没有接触过相关数据,无法提供精准的回答。

当模型需要回答问题时,不直接让它依赖内部知识进行生成,而是先从一个外部的、可信的知识库中检索出与问题最相关的信息,然后将这些信息作为上下文(Context)和原始问题一起提供给大语言模型,让它基于这些“新鲜的”、“准确的”信息来组织和生成最终的答案。

RAG可以分为两个阶段:

  1. 数据准备/索引阶段 (Data Preparation / Indexing - Offline)

这个阶段是预处理工作,目标是建立一个可供快速检索的知识库。

  • 数据加载 (Load):首先,我们需要加载原始的知识文档,来源可以是 PDF、HTML、数据库记录、Notion/Confluence 页面等等。
  • 文档切分 (Chunking/Splitting):由于 LLM 的上下文窗口长度有限,我们不能将整篇长文档直接作为输入。因此,需要将文档切分成大小适中的、有意义的文本块(Chunks)。切分策略很关键,可以按段落、句子,或者固定长度来切,好的切分能保证语义的完整性。
  • 向量化 (Embedding):这是 RAG 的核心步骤之一。我们需要将每个文本块通过一个 Embedding Model(例如 aall-mpnet-base-v2, bge-large-zh 等)转换成一个高维的数字向量(Vector)。这个向量可以被认为是该文本块在语义空间中的“坐标”。语义上相近的文本块,其向量在空间中的距离也更近。
  • 数据索引与存储 (Index & Store):最后,我们将生成的文本块原文和其对应的向量存储到一个专门的数据库中,这个数据库通常被称为 向量数据库(Vector Database),例如 Milvus、Pinecone、Chroma,或者像 Elasticsearch、PostgreSQL 加上相应的向量检索插件。
  1. 检索生成阶段 (Retrieval & Generation - Online)

这个阶段是用户与系统交互、实时生成答案的过程。

  • 用户提问 (User Query):用户输入一个问题。

  • 查询向量化 (Query Embedding):使用与数据准备阶段相同的 Embedding Model,将用户的查询也转换成一个向量。

  • 向量检索 (Vector Retrieval):用查询向量,去向量数据库中执行一个相似性搜索(通常是余弦相似度或欧氏距离计算)。目标是找出与查询向量“距离”最近的 K 个文本块向量,这些文本块就是与用户问题最相关的信息。

  • 构建提示词 (Prompt Construction):将检索到的这 K 个相关的文本块(即上下文 Context)与用户的原始问题(Query)组合成一个新的、更丰富的提示词(Prompt)。这个 Prompt 的模板通常类似于:

    “请根据以下提供的上下文信息来回答用户的问题。如果上下文中没有足够信息,请回答你不知道。

    上下文: [这里是检索到的文本块 1] [这里是检索到的文本块 2] …

    问题: [用户的原始问题]”

  • 生成答案 (Answer Generation):将这个增强后的 Prompt 发送给大语言模型(如 GPT-4, Llama3 等)。LLM 会基于我们提供的上下文来生成一个更加准确、可靠的答案。

  • 返回结果 (Return Response):将 LLM 生成的答案返回给用户。有时为了增加答案的可信度,还会附上检索到的原文出处链接。