008.RAG
文章目录

问题: 什么是RAG,讲一下原理和流程
👇 点击展开/折叠 面试背诵模板(建议先背这个)
- 相关检索 (Retrieve):用问题向量在向量数据库中搜索,找出语义最相似的N个文本块作为参考信息。有的系统会先对用户问题进行查询重写,使其更清晰、更利于搜索。
- **上下文增强 (Augment)**:将检索到的文本块和用户原始问题,按特定模板组合成一个内容丰富的提示词(Prompt)。
- **答案生成 (Generate)**:将增强后的提示词发给大语言模型(LLM)。模型会基于提供的参考资料生成答案,从而得到更准确、有依据的回复。
一、RAG产生的背景与核心价值
大语言模型存在三个固有限制:
① 知识截止于训练数据时间点,无法回答最新问题;
② 训练数据不含企业私有文档或专业领域知识;
③ 容易产生事实性幻觉(hallucination)。
RAG通过实时检索外部知识库注入相关上下文,让模型基于检索到的事实而非仅凭参数化记忆生成答案,从而提升准确性、可控性和可解释性。
二、核心运作流程(两阶段详解)
阶段一:离线索引(数据准备)
- 文档加载与解析:从多种数据源(PDF、Word、网页、数据库)读取原始文档。
- 文本分块(Chunking):将长文档切分为语义完整的短文本块(通常256-512 tokens),便于精准检索。
- 向量化嵌入Embed:使用嵌入模型(如OpenAI text-embedding-3-small、BGE等)将文本块转换为高维向量。
- 存储索引:将向量及对应的原始文本存入向量数据库(如Milvus、Pinecone、Chroma等),并构建索引加速相似度搜索。倒排索引
阶段二:在线查询(检索与生成)
- 问题向量化:将用户输入的问题用与索引阶段相同的嵌入模型转换为向量。
- 相似性检索:在向量数据库中进行ANN(近似最近邻)搜索,返回与问题语义最相似的Top-k个文本块。
- 上下文注入:将检索到的文本块作为上下文,与用户问题一起组合成结构化提示词。
- LLM生成:将增强后的提示词输入大语言模型,生成基于检索事实的最终答案。
RAG文本预处理属于特征工程吗?
是,但视角不同。
在RAG(检索增强生成)系统中,文本预处理是特征工程在特定领域的具体应用。两者目标一致:都是将非结构化或半结构化的原始数据,处理成更适合下游任务(对RAG而言是检索和生成)的格式。
它们的主要区别在于应用场景和最终目的:
- 传统特征工程:服务于机器学习模型(如分类、回归),最终产出是结构化的特征向量。
- RAG文本预处理:服务于检索系统和大语言模型(LLM),最终产出是结构清晰、语义完整的文本块(Chunks)及其元数据,以便高效检索和生成准确回答。
RAG文本预处理的核心操作
RAG的文本预处理通常包含以下关键步骤:
1. 文档解析
- 目标:从不同格式的原始文档中提取出纯文本内容。
- 操作:解析PDF、Word、HTML、Markdown等格式,提取正文、标题、表格、代码块等核心文本信息,并丢弃无关的格式和元素。
2. 数据清洗与标准化
- 目标:消除噪声,提升文本质量。
- 操作:
- 清洗:去除HTML标签、特殊符号、乱码、广告、页眉页脚等无关或干扰性内容。
- 去重:使用哈希算法或语义相似度计算,删除重复或高度相似的段落。
- 标准化:统一日期、数值、单位等格式(如将“今天”转换为具体日期“2025-07-17”),保证数据一致性。
3. 文本分块
- 目标:将长文档切分成大小合适、语义完整的文本块,这是RAG中最关键的步骤之一。
- 操作:
- 固定长度分块:按固定的字符数(如512个字符)进行切割,实现简单但可能破坏语义。
- 语义分块:利用句子边界检测或段落分割,尽可能保留完整的语义单元。
- 动态分块:根据内容复杂度(如技术文档按章节,短文本合并相邻段落)动态调整块大小。
4. 元数据提取
- 目标:为每个文本块添加上下文“标签”,丰富其信息维度。
- 操作:提取并附加文档来源(URL、文件名)、创建时间、作者、文档类型等信息。这些元数据可用于检索时的精准过滤(如只搜索特定时间范围内的文档)和结果排序。
5. 结构化增强(可选)
- 目标:为文本注入更深层的语义信息。
- 操作:运用命名实体识别(NER)等技术,从文本中提取出人名、地名、组织名等关键实体,并将其作为标签或直接拼接到文本中,增强语义表示。
总结
可以将传统特征工程理解为数据进入模型前的“通用翻译”,而RAG文本预处理则是数据进入检索和生成系统前的“专项精加工”。后者借鉴了前者的思想,并根据RAG系统的特定需求,发展出了一套专门的操作流程。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 LGQ的博客!