title: RAG(1) author: Gamehu tags: - RAG categories: - AI date: 2025-09-18 16:29:00 ---
RAG 第一篇
后续团队需要做企业大脑,会用到RAG,先比较完整的了解下RAG,把零碎知识补的完整一些,做个记录。
### 标准RAG(Retrieval-Augmented Generation)的运行流程图 标准RAG系统的运行流程可以分为两大阶段:**索引阶段(Indexing Phase)**(预处理数据)和**运行时阶段(Runtime Phase)**(查询处理)。以下是详细的流程描述,我会结合常见的流程图示例来说明。RAG的核心是先从外部知识库中检索相关信息,然后用这些信息增强LLM的生成,以减少幻觉并提供更准确的回答。 {% asset_img 3.jpg https://www.6clicks.com %} 这个流程图展示了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来加速检索。 这一阶段的输出是一个可查询的向量数据库。 {% asset_img 1.jpg danielp1.substack.com %} 这个图更详细地展示了索引和检索的子步骤,包括分块、嵌入和重排序。 #### 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。模板示例: ``` 系统提示: 你是一个助手,使用以下上下文回答问题。 上下文: [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)** 返回生成的文本给用户。可选:后处理,如引用来源或验证事实。 {% asset_img 2.webp k2view.com %} 结构化和非结构化数据的融合,以及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️⃣ 回答问题时(每次提问都这样)** ``` 用户问问题 → 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