RAG(1)

AI RAG

后续团队需要做企业大脑,会用到RAG,先比较完整的了解下RAG,把零碎知识补的完整一些,做个记录。

### 标准RAG(Retrieval-Augmented Generation)的运行流程图

标准RAG系统的运行流程可以分为两大阶段:索引阶段(Indexing Phase)(预处理数据)和运行时阶段(Runtime Phase)(查询处理)。以下是详细的流程描述,我会结合常见的流程图示例来说明。RAG的核心是先从外部知识库中检索相关信息,然后用这些信息增强LLM的生成,以减少幻觉并提供更准确的回答。

这个流程图展示了RAG的高层结构:从数据源到最终输出的完整路径。

1. 索引阶段(Indexing Phase):预构建知识库

这一阶段发生在系统启动前,用于将外部数据转化为可检索的形式。通常是离线过程,目的是创建向量数据库以支持高效查询。

  • 步骤1: 数据采集(Data Ingestion)
    从各种来源(如文档、数据库、网页)收集原始数据。这些数据可以是结构化(e.g., SQL表)或非结构化(e.g., PDF、文本文件)。
  • 步骤2: 数据分块(Chunking)
    将长文档切分成小块(chunks),通常每个chunk 100-500 tokens,以匹配嵌入模型的输入限制。分块策略包括固定长度、按句子或语义分块(e.g., 使用LLM检测自然断点)。
  • 步骤3: 嵌入生成(Embedding Generation)
    使用嵌入模型(如BERT、OpenAI的text-embedding-ada-002)将每个chunk转化为向量表示(dense vector,e.g., 768维)。这捕捉语义相似性。
  • 步骤4: 索引存储(Indexing and Storage)
    将向量和对应的原始chunk存储到向量数据库(Vector DB,如FAISS、Pinecone、Milvus)。同时可能添加元数据(如来源、时间戳)。索引使用近似最近邻(ANN)算法如HNSW来加速检索。

这一阶段的输出是一个可查询的向量数据库。

这个图更详细地展示了索引和检索的子步骤,包括分块、嵌入和重排序。

2. 运行时阶段(Runtime Phase):实时查询处理

这是用户交互时的核心流程,对应你之前描述的“检索 + 生成”。

  • 步骤1: 用户输入(User Query Input)
    用户提供查询(query),e.g., “什么是RAG?”。
  • 步骤2: 查询嵌入(Query Embedding)
    使用相同的嵌入模型将query转化为向量。
  • 步骤3: 检索(Retrieval)
    在向量数据库中计算query向量与所有chunk向量的相似度(e.g., 余弦相似度)。返回Top-K个最相似的chunks(原始文本 + 元数据)。可选:重排序(Re-ranking)使用另一个模型(如Cross-Encoder)进一步过滤,提高相关性。
  • 步骤4: 提示构建(Prompt Construction)
    将检索到的Top-K chunks(原始文本)与query拼接成一个Prompt。模板示例:
    1
    2
    3
    4
    系统提示: 你是一个助手,使用以下上下文回答问题。
    上下文: [chunk1] [chunk2] ... [chunkK]
    问题: [query]
    回答:
    注意:这里不直接传递向量,只传递文本。Prompt长度需控制在LLM上下文窗口内(e.g., 8K-128K tokens)。
  • 步骤5: 生成(Generation)
    将Prompt输入LLM(e.g., GPT-4、LLaMA),LLM基于Prompt生成回答。生成过程使用解码算法如beam search或greedy decoding。
  • 步骤6: 输出响应(Output Response)
    返回生成的文本给用户。可选:后处理,如引用来源或验证事实。

结构化和非结构化数据的融合,以及Prompt + Context的输入到LLM。

详细流程的潜在变体和优化

  • 高级检索:可结合关键字搜索(BM25)与向量搜索的混合检索(Hybrid Search),或使用查询重写(Query Rewriting)来扩展query。
  • 多跳检索:对于复杂查询,多次检索(e.g., 先检索实体,再检索关系)。
  • 性能考虑:检索延迟通常<1s,生成取决于LLM大小。常见问题:噪声chunk(无关信息)导致Prompt过长,可用压缩(如摘要)优化。
  • 工具与框架:实现时常用LangChain、Haystack或LlamaIndex。嵌入模型:Sentence Transformers;向量DB:Weaviate。

总结

一句话概括RAG就像给AI装了个”外挂搜索引擎”,问啥先从知识库里找答案,再让AI组织回答。

整个流程就两步大动作:

1️⃣ 准备阶段(一次性干完)

  • 把一堆文档(PDF、网页、数据库)切成小块(像切西瓜一样)
  • 给每块内容**打个”指纹”**(向量嵌入,类似数字DNA)
  • 把这些”指纹+原文”存进搜索引擎(向量数据库)

比喻:就像给图书馆每本书都贴上标签,方便以后快速找书。

2️⃣ 回答问题时(每次提问都这样)

1
2
3
4
用户问问题 → AI先去"图书馆"翻书 → 找到相关内容 → 组织答案给用户
↓ ↓ ↓ ↓
"什么是RAG?" 搜"指纹"匹配 挑出3-5段 "RAG是检索增强生成..."
找相关段落 最相关的书 用这些内容回答

详细拆解

  1. 你问问题 → AI把你的问题也打个”指纹”
  2. AI去搜 → 在图书馆里找跟你问题”指纹”最像的几本书
  3. 挑重点 → 不把整本书都拿出来,只拿相关段落
  4. 拼答案 → 把这些段落+你的问题一起给AI,让它重新组织回答
  5. 输出 → AI用找到的”参考资料”给你准确回答

关键点:

  • 向量(指纹)只用来”找书”不直接给AI看
  • AI真正读的是书里的原文,不是那些数字指纹
  • 找书快(秒级),读懂写回答慢(几秒到几十秒)

为啥要这样?

  • 不RAG:AI只能凭记忆瞎编,容易胡说八道
  • 有RAG:AI像查字典一样先找事实,再组织语言回答

通俗理解:RAG就是让AI**”不瞎编,先查资料”**,回答前先翻书确认事实!

参考文档

https://www.6clicks.com/resources/blog/understanding-rag-retrieval-augmented-generation-explained
https://danielp1.substack.com/p/navigating-retrieval-augmented-generation