教程人工智能大模型RAG【免费下载链接】all-in-rag大模型应用开发实战一RAG 技术全栈指南在线阅读地址https://datawhalechina.github.io/all-in-rag/项目地址https://gitcode.com/datawhalechina/all-in-rag点击查看免费下载姜葱捞鸡是一道以嫩滑爆汁、白饭杀手著称的粤式家常菜而在 Datawhale all-in-rag 仓库中它更是一份典型的 RAG 数据样本——存放于 data/C8/cook/dishes/meat_dish/姜葱捞鸡/姜葱捞鸡.md是尝尝咸淡 RAG 系统第 8 章实战项目知识库中的荤菜类菜谱之一。本文以这份菜谱文档为线索先完整还原其烹饪方法再深入讲解它如何被 数据准备模块 完成元数据增强、按 Markdown 标题结构分块并最终经由混合检索与多模式生成回答姜葱捞鸡怎么做这类真实问题。读完本文你将掌握从一份结构化菜谱文档到RAG 可检索、可生成的知识单元的完整转化链路。一、文档定位一份为 RAG 而生的结构化菜谱1.1 文档在仓库中的位置与角色尝尝咸淡 RAG 系统是 docs/chapter8 讲解的实战项目其数据源是数百个 Markdown 格式的菜谱文件统一存放于 data/C8/cook 目录下按菜品种类分目录组织data/C8/cook/ ├── dishes/ │ ├── meat_dish/ # 荤菜姜葱捞鸡位于此处 │ ├── vegetable_dish/ # 素菜 │ ├── soup/ # 汤品 │ ├── dessert/ # 甜品 │ └── ... # 早餐、主食、水产、调料、饮品姜葱捞鸡文档就位于dishes/meat_dish/目录下这个目录层级本身就是后续元数据增强环节推断菜品分类的关键线索详见第三节。1.2 为什么这份文档适合做 RAG 数据正如 01_env_architecture.md 所述这类菜谱有两个关键特点结构高度规整每份菜谱都严格遵循统一的 Markdown 标题层级——一级标题写菜名随后依次是简介与难度评级、必备原料和工具、计算、操作、附加内容等二级标题内容篇幅较短单个菜谱通常在 700 字左右不会超出模型上下文窗口可以直接按标题分块无需与RecursiveCharacterTextSplitter等常规分块方法组合。姜葱捞鸡文档完整具备上述特征打开文件可以看到清晰的五段式结构# 姜葱捞鸡的做法 ← 一级标题菜品名称 简介 预估烹饪难度★★★ ← 难度评级 ## 必备原料和工具 ← 二级标题 ## 计算 ← 二级标题 ## 操作 ← 二级标题 ## 附加内容 ← 二级标题这正是 MarkdownHeaderTextSplitter 这类结构感知分割器最喜欢的输入形态也是小块检索、大块生成父子文本块架构能落地的前提。二、菜谱正文全解析从配料到出锅作为知识库的核心内容这份菜谱的原料、配比与步骤必须被 RAG 系统完整、无损地保留与检索。下面先完整还原其烹饪方法。2.1 必备原料和工具原料/工具说明鸡腿肉主料推荐 4 个鸡腿盐焗鸡粉腌制用赋予咸香底味葱、姜制作葱姜蘸料的核心配料蒸锅用于蒸制鸡腿炒锅/小锅用于加热淋入蘸料的油2.2 计算按份数换算的用量配比每次制作前需要确定计划做几份。一份正好够 2 个人吃。每份的具体用量如下原料用量每份鸡腿4 个约 400g盐焗鸡粉5g姜50g葱1 根盐5g糖5g油35ml这份计算小节的价值在于它把用料与份数解耦用户提问姜葱捞鸡需要多少姜时RAG 系统可以精确命中该小节详见第四节分块效果。2.3 操作腌制 → 蒸制 → 淋油 → 捞拌四个鸡腿清洗干净放入碗中碗中加入盐焗鸡粉和 5ml 油搅拌均匀让鸡腿静置腌制 15 分钟同时准备蒸锅并把水煮开鸡腿腌制完成后放入水开后的蒸锅中蒸制 20 分钟将姜根据个人口味切成 1姜蓉、2姜丝或 3姜粒将葱切成 0.5cm 小段将葱姜放入蘸料碗并加入盐和糖将剩余的油倒入另一个锅中加热至六至七成热将热油淋入葱姜碗中激发出葱姜香气鸡腿蒸好后将其撕碎成鸡丝不需要特别细大概 1cm 粗就可以将葱姜油淋在鸡丝上搅拌均匀即可。几个关键细节盐焗鸡粉腌制 15 分钟是为鸡肉入味打底蒸制 20 分钟保证鸡腿熟透且肉质嫩滑热油加热至六至七成热约 160℃180℃油面开始冒烟但未剧烈翻动再淋入葱姜才能充分激发香气而不糊撕鸡丝保持 1cm 左右的粗度既便于挂汁又保留口感。2.4 附加内容原文附有一条视频参考标题为《白饭杀手来啦 #姜葱捞鸡》B 站视频。在实际 RAG 系统中这一小节可能被检索到变化做法类信息需要与操作主流程区分对待——这正是 02_data_preparation.md 中提到按标题严格分块会把上下文切得太细的典型场景。三、元数据增强机器如何看懂这份菜谱仅仅把 Markdown 文本读进来是不够的检索阶段还需要按分类、难度等条件过滤。这一步由 data_preparation.py 中的_enhance_metadata方法完成它从文件路径和正文内容两个维度自动抽取元数据。3.1 分类推断从目录结构到中文标签源码中维护了一张目录关键词到中文分类的映射表CATEGORY_MAPPINGCATEGORY_MAPPING { meat_dish: 荤菜, vegetable_dish: 素菜, soup: 汤品, dessert: 甜品, breakfast: 早餐, staple: 主食, aquatic: 水产, condiment: 调料, drink: 饮品 }加载文档时模块会检查文件路径的各层目录名是否命中映射表的 keydoc.metadata[category] 其他 for key, value in self.CATEGORY_MAPPING.items(): if key in path_parts: doc.metadata[category] value break对姜葱捞鸡文档而言路径中包含meat_dish因此category被标记为荤菜。3.2 菜名与难度提取菜品名称直接取文件名主干file_path.stem即姜葱捞鸡难度等级源码使用正则re.search(r★, content)精确匹配连续星号再查难度映射表difficulty_map {5: 非常困难, 4: 困难, 3: 中等, 2: 简单, 1: 非常简单}姜葱捞鸡正文中写有预估烹饪难度★★★连续 3 颗星因此difficulty被标记为中等。3.3 确定性父文档 ID值得注意的是实际源码对父文档 ID 的分配采用了基于相对路径的确定性哈希而非随机 UUIDparent_id hashlib.md5(relative_path.encode(utf-8)).hexdigest()这样同一份菜谱在任何一次加载中都会得到相同的parent_id配合索引缓存机制可以避免数据更新后父子映射错乱。此外模块还通过 filter_documents_by_category、filter_documents_by_difficulty、get_statistics 等方法对外提供过滤与统计能力为后续检索路由如推荐几道简单的素菜提供支撑。四、Markdown 结构分块H1/H2 标题切分4.1 分块配置chunk_documents 调用内部方法_markdown_header_split使用 LangChain 的MarkdownHeaderTextSplitter按标题层级切分headers_to_split_on [ (#, 主标题), # 菜品名称 (##, 二级标题), # 必备原料、计算、操作等 (###, 三级标题) # 简易版本、复杂版本等 ] markdown_splitter MarkdownHeaderTextSplitter( headers_to_split_onheaders_to_split_on, strip_headersFalse # 保留标题便于理解上下文 )关键参数是strip_headersFalse分割后的子块会保留标题文本让检索结果天然自带语义上下文如## 操作本身就暗示了内容主题。4.2 姜葱捞鸡的分块效果按上述配置姜葱捞鸡文档会被切分为 5 个子块每个子块继承父文档的parent_id并新增chunk_id、doc_typechild、chunk_index等元数据姜葱捞鸡的做法.md父文档parent_id 由路径哈希确定 ├── 子块0# 姜葱捞鸡的做法 简介 预估烹饪难度★★★ ├── 子块1## 必备原料和工具 鸡腿肉/盐焗鸡粉/葱姜 ├── 子块2## 计算 每份用量配比鸡腿400g、盐焗鸡粉5g... ├── 子块3## 操作 腌制/蒸制/淋油/捞拌 11 步 └── 子块4## 附加内容 视频参考这样的粒度带来了两类收益检索精确用户问姜葱捞鸡需要什么食材时子块 1必备原料和工具能精确命中而不是在整个文档中大海捞针生成完整生成阶段会通过parent_id回溯到完整父文档保证 LLM 拿到的上下文覆盖原料、配比、步骤全流程。4.3 为什么不用整个文档做检索02_data_preparation.md 中专门讨论过这个问题当用户问姜葱捞鸡需要什么调料时如果直接用整个文档做向量检索这个具体问题在全文中的占比很小很可能检索不到或排名靠后而用小块检索必备原料和工具章节就能精确匹配。这就是小块检索大块生成设计的核心动机。五、从检索到生成一条姜葱捞鸡怎么做的完整链路当用户向系统提问姜葱捞鸡怎么做时main.py 中的ask_question会串联起四个阶段。以下结合源码还原完整链路。5.1 查询路由判定问题类型query_router 使用 LLM 将用户问题分为三类list要菜名列表、detail要具体做法、general其他一般问题。按照提示词中的示例规则姜葱捞鸡怎么做这类包含具体菜名做法询问的问题会被归为detail从而走分步指导生成模式。5.2 查询重写具体问题保持原样query_rewrite 会先判断查询是否需要重写。规则示例中宫保鸡丁怎么做这类包含具体菜品名称的查询保持原查询不变因此姜葱捞鸡怎么做不会发生改写直接进入检索环节。5.3 RRF 混合检索向量 BM25 双路融合hybrid_search 并行执行两路检索向量检索vector_retriever基于 BGE-small-zh-v1.5 嵌入search_kwargs{k: 5}捕捉语义相似度BM25 检索bm25_retriever基于关键词精确匹配k5。随后 _rrf_rerank 用 RRFReciprocal Rank Fusion算法融合两路排名核心公式为1 / (k rank 1)源码中k60用于平滑并按内容哈希去重合并、将融合分数写入doc.metadata[rrf_score]。最终截取top_k默认 3见 config.py个子块。对姜葱捞鸡怎么做而言BM25 路能精确匹配菜名向量路能匹配捞拌蒸制等语义相近词两路互补。系统还支持从问题中自动提取分类/难度过滤条件_extract_filters_from_query例如简单的荤菜会附带category荤菜的过滤。5.4 智能去重与父文档回溯检索到的子块可能来自同一道菜例如操作和必备原料和工具两个子块都被命中。get_parent_documents 会统计每个parent_id被匹配的次数作为相关性指标按命中次数降序去重输出父文档保证姜葱捞鸡只输出一次完整菜谱。5.5 多模式生成detail 模式的分步指导由于路由类型为detail系统调用 generate_step_by_step_answer使用结构化提示词让 LLM 组织回答建议输出## 菜品介绍 ## 所需食材 ## 制作步骤 ## 制作技巧仅在原文有实用技巧时包含上下文由 _build_context 组装前缀带有【食谱 N】菜名 | 分类 | 难度的元数据行并受max_length2000限制避免超出模型上下文。最终系统回答会完整呈现姜葱捞鸡的原料清单、15 分钟腌制 20 分钟蒸制 热油淋葱姜的详细步骤——这正是 04_generation_sys.md 中详细查询示例所展示的效果。六、运行与验证6.1 环境准备按 01_env_architecture.md 的指引在code/C8目录下创建虚拟环境并安装依赖conda create -n cook-rag-1 python3.12.7 conda activate cook-rag-1 cd code/C8 pip install -r requirements.txt依赖清单见 requirements.txt核心包括langchain0.3.26、langchain-community0.3.27、faiss-cpu、rank_bm25、sentence-transformers等。6.2 核心配置config.py 以dataclass方式集中管理全部运行参数配置项默认值说明data_path../../data/C8/cook菜谱数据根目录姜葱捞鸡位于其dishes/meat_dish/子目录index_save_path./vector_indexFAISS 向量索引缓存路径embedding_modelBAAI/bge-small-zh-v1.5嵌入模型llm_modelkimi-k2-0711-preview生成模型Moonshottop_k3检索返回的子块数量temperature0.1生成温度控制回答创造性max_tokens2048最大生成长度运行前需设置MOONSHOT_API_KEY环境变量可通过.env文件加载main.py 使用load_dotenv()读取。6.3 启动与验证python main.py系统启动后会自动检查索引缓存首次运行构建 FAISS 索引需要几分钟索引构建流程见 index_construction.py之后加载已保存索引只需几秒。交互式界面中可直接提问姜葱捞鸡怎么做系统将打印查询类型、检索命中的文档块如姜葱捞鸡(操作)、回溯到的完整文档名再输出分步指导回答。知识库构建完成后还会打印统计信息文档总数、文本块数、分类与难度分布可借此验证姜葱捞鸡是否被正确归类为荤菜、中等难度。小结一份看似简单的姜葱捞鸡菜谱在 all-in-rag 的尝尝咸淡 RAG 系统中完整走过了数据加载 → 元数据增强 → 结构分块 → 混合检索 → 父文档回溯 → 多模式生成的全流程路径与内容自动映射出分类荤菜、菜名姜葱捞鸡、难度中等★★★H1/H2 标题层级被MarkdownHeaderTextSplitter精确切分为 5 个可检索子块同时保留完整父文档用于生成RRF 混合检索 智能去重确保操作章节精确命中、同一菜谱不重复输出detail 路由最终驱动 LLM 输出结构化的分步烹饪指导。深入阅读 数据准备模块、检索优化模块 与 生成集成模块 的源码并结合 docs/chapter8 的架构说明即可将这套方法论迁移到任意同类结构化文档的知识库构建中。赞分享教程人工智能大模型RAG【免费下载链接】all-in-rag大模型应用开发实战一RAG 技术全栈指南在线阅读地址https://datawhalechina.github.io/all-in-rag/项目地址https://gitcode.com/datawhalechina/all-in-rag点击查看免费下载相关推荐all-in-rag 实战以意式烤鸡菜谱为例解析 RAG 食谱知识库的结构化数据与父子文本块机制all in rag 实战以意式烤鸡菜谱为例解析 RAG 食谱知识库的结构化数据与父子文本块机制 本篇技术指南以 Datawhale all in ra教程人工智能大模型RAGall-in-rag 项目实战以「葱油拌面」为例解析菜谱数据如何驱动 RAG 知识库构建all in rag 项目实战以「葱油拌面」为例解析菜谱数据如何驱动 RAG 知识库构建 葱油拌面是一道经典的上海家常面点做法简单、香味独特在本仓库的「尝教程人工智能大模型RAGall-in-rag 食谱知识库实战以蚂蚁上树为例的 Markdown 菜谱结构化解析与 RAG 检索链路all in rag 食谱知识库实战以蚂蚁上树为例的 Markdown 菜谱结构化解析与 RAG 检索链路 本文以仓库 data/C8/cook/dish教程人工智能大模型RAG创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
