datawhale 组队学习 RAG技术全栈指南task5打卡
数据准备模块是 RAG 系统效果的关键,它实现了**“小块检索,大块生成”的父子文本块策略,以兼顾检索的精确性和生成的上下文完整性**。
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": "素菜"}传入检索器,实现精准筛选。
火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。
更多推荐
所有评论(0)