RAG(1)
AI
RAG
后续团队需要做企业大脑,会用到RAG,先比较完整的了解下RAG,把零碎知识补的完整一些,做个记录。
标准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。模板示例:注意:这里不直接传递向量,只传递文本。Prompt长度需控制在LLM上下文窗口内(e.g., 8K-128K tokens)。1
2
3
4系统提示: 你是一个助手,使用以下上下文回答问题。
上下文: [chunk1] [chunk2] ... [chunkK]
问题: [query]
回答: - 步骤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 | 用户问问题 → AI先去"图书馆"翻书 → 找到相关内容 → 组织答案给用户 |
详细拆解:
- 你问问题 → AI把你的问题也打个”指纹”
- AI去搜 → 在图书馆里找跟你问题”指纹”最像的几本书
- 挑重点 → 不把整本书都拿出来,只拿相关段落
- 拼答案 → 把这些段落+你的问题一起给AI,让它重新组织回答
- 输出 → 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