RAG 系统核心模块总结

第二节 数据准备模块:父子文本块架构

数据准备模块是 RAG 系统效果的关键,它实现了**“小块检索,大块生成”的父子文本块策略,以兼顾检索的精确性和生成的上下文完整性**。

1. 核心设计与架构

  • 父子文本块映射:

    • 父文档: 完整的菜谱文件,用于生成阶段提供完整上下文。

    • 子块: 按标题(如“必备原料和工具”、“操作”)分割的小块,用于检索阶段提高匹配精度。

  • 基本流程:

    • 检索: 使用小的子块进行精确匹配。

    • 生成: 传递完整的父文档给 LLM,确保上下文完整性。

2. 文档加载与元数据增强

步骤 目标 关键实现
文档加载 批量读取 Markdown 文件,分配唯一 ID。 使用 rglob("*.md") 递归查找;为每个文档分配 parent_id 并标记 doc_type: "parent"
元数据增强 丰富文档信息,用于过滤和检索。 菜品分类: 从文件路径推断。 菜品名称: 从文件名提取 (file_path.stem)。 难度等级: 从内容中的星级标记 (★★★★★ 等) 提取。

3. Markdown 结构分块

  • 分块器: 使用 MarkdownHeaderTextSplitter,按照 ###### 三级标题进行结构化分割。

  • 父子关系建立: 每个分割后的子块 (doc_type: "child") 都包含其父文档的 parent_id,并建立 parent_child_map 映射。

  • 分块效果: 一个菜谱(父文档)被分割为多个语义明确的小块(子块),如原料、操作、计算等。

4. 智能去重

  • 目标: 当检索到同一道菜的多个子块时,最终只向 LLM 传递一份完整的父文档,避免重复和冗余。

  • 逻辑: get_parent_documents 函数通过统计每个 parent_id 被匹配的次数(相关性指标),然后按相关性排序,并构建去重后的父文档列表。


第三节 索引构建与检索优化

本模块专注于将数据转化为可高效检索的索引,并采用混合检索策略优化结果。

1. 核心设计

  • 索引构建: 使用 BGE-small-zh-v1.5 模型进行向量化,使用 FAISS 作为向量数据库。

    • 索引缓存机制: 实现索引的保存 (save_index)加载 (load_index),大幅缩短系统启动时间。

  • 混合检索: 结合向量检索(语义相似度)和 BM25 检索(关键词匹配),使用 RRF (Reciprocal Rank Fusion) 算法进行结果融合重排。

2. 索引构建实现

步骤 技术/工具 作用
嵌入模型 HuggingFaceEmbeddings (BGE) 将文本块 (chunks) 转化为向量表示。
构建索引 FAISS.from_texts 基于文本和元数据构建高效的向量索引。
索引缓存 save_local / load_local 实现索引的持久化存储和快速加载,提高启动效率。

3. 检索优化实现

检索器 优势 作用
向量检索器 🌟 理解语义相似度,处理同义词、意图。 侧重语义匹配,如“简单易做的菜”。
BM25 检索器 🔑 擅长关键词精确匹配。 侧重关键词匹配,如具体的菜名、食材。
RRF 重排 融合两种检索结果的排名信息。 综合语义准确性和关键词精确性,避免过度依赖单一检索方式。

4. 元数据过滤检索

  • 功能: 支持在向量检索时,通过元数据(如 category 菜品分类、difficulty 难度等级)进行预过滤。

  • 应用场景: 用户查询“推荐几道素菜”时,可将 filter: {"category": "素菜"} 传入检索器,实现精准筛选。

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐