ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

洋葱炒猪肉菜谱的 RAG 全流程解析:从 Markdown 数据加工到 all-in-rag 智能问答实战

洋葱炒猪肉菜谱的 RAG 全流程解析:从 Markdown 数据加工到 all-in-rag 智能问答实战 教程人工智能大模型RAG【免费下载链接】all-in-rag大模型应用开发实战一RAG 技术全栈指南在线阅读地址https://datawhalechina.github.io/all-in-rag/项目地址https://gitcode.com/datawhalechina/all-in-rag点击查看免费下载本篇以 all-in-rag 仓库「尝尝咸淡 RAG 系统」知识库中的真实菜谱 洋葱炒猪肉的做法 为贯穿全文的案例完整讲解一道结构化菜谱从原料数据到可问答知识的加工链路元数据增强、Markdown 结构分块、父子文本块检索去重、以及 LLM 分步指导生成。读完你将掌握 RAG 系统中小块检索、大块生成策略在一份真实文档上的落地细节并可直接对照源码复现整个问答流程。一、数据源本体洋葱炒猪肉这道菜到底写了什么先回到一切数据的起点——仓库中的原始文档 洋葱炒猪肉的做法。它位于data/C8/cook/dishes/meat_dish/目录下属于「荤菜」分类的菜谱之一全文结构高度规整是典型的可用于 RAG 构建的结构化 Markdown 数据。其完整内容如下洋葱炒猪肉的做法咸中带甜简单上手一不小心可能让人多吃一碗饭。一般只需 15 分钟即可完成。预估烹饪难度★★★文档正文由「必备原料和工具」「计算」「操作」「附加内容」四个二级标题章节构成每个章节职责单一、篇幅精炼这为后续按标题分块提供了天然的切分依据。1.1 必备原料和工具洋葱猪肉片蕃茄酱麻油1.2 计算每份用量配比食材食材用量洋葱一颗是主角喜欢吃洋葱可以多半颗一颗猪肉250g蒜头3 瓣调味料调味料用量食用油15ml黑胡椒1.25g酱油30ml糖15g麻油5ml番茄酱15ml料酒15ml备注配方中的小匙、大匙属于体积计量单位若家中没有标准量勺可参照常见茶匙约 5ml、大匙约 15ml的换算标准来精准确定用料。1.3 操作步骤洋葱切片猪肉切片或切丝蒜头拍碎并将上述调味料混合备用。炒锅内倒入 1 大匙食用油等待约 10 秒让油温升高后倒入猪肉。炒至猪肉变色后下蒜头炒香盛起备用。原锅下洋葱翻炒 3~4 分钟加入调味料炒匀。下刚盛起备用的猪肉翻炒至猪肉熟透。猪肉熟后再翻炒 1~2 分钟即可起锅。1.4 附加内容猪肉可选猪肩肉片或切好的肉丝按个人喜好决定。这段原文是后续所有 RAG 环节的事实基础检索必须能命中它生成必须忠于它。接下来我们看这份菜谱是如何被「尝尝咸淡 RAG 系统」加工成可检索、可回答的知识单元的。二、数据准备一份菜谱如何被加载并打上元数据标签在 docs/chapter8/02_data_preparation.md 中明确了数据准备模块的设计目标把原始 Markdown 菜谱文件转化为带丰富元数据的父文档完整菜谱与子文档按标题分割的小块为小块检索、大块生成打基础。对应实现位于 code/C8/rag_modules/data_preparation.py。2.1 加载递归发现与父文档 IDload_documents()通过Path(self.data_path).rglob(*.md)递归扫描数据目录下的所有 Markdown 文件逐文件读取内容并为每个父文档分配一个确定性的唯一 ID——基于文件相对数据根目录的路径做 MD5 哈希而非随机 UUID这样同一文件在不同构建之间拥有稳定 ID便于索引复用与父子关系重建parent_id hashlib.md5(relative_path.encode(utf-8)).hexdigest()洋葱炒猪肉这份文档被读取后即成为一个doc_typeparent的父文档source字段指向其文件路径。2.2 元数据增强从路径与内容中自动提取加载完成后_enhance_metadata()会对每个父文档做三项关键增强以洋葱炒猪肉为例元数据字段提取方式洋葱炒猪肉的实际取值dish_name取文件名 stem洋葱炒猪肉category在路径中匹配分类目录名荤菜命中meat_dishdifficulty用正则★匹配内容中的连续星号按数量映射中等原文为 ★★★分类映射与难度映射在源码中集中定义便于检索模块复用见 data_preparation.py 的CATEGORY_MAPPING与DIFFICULTY_LABELSCATEGORY_MAPPING { meat_dish: 荤菜, vegetable_dish: 素菜, soup: 汤品, dessert: 甜品, breakfast: 早餐, staple: 主食, aquatic: 水产, condiment: 调料, drink: 饮品 } difficulty_map {5: 非常困难, 4: 困难, 3: 中等, 2: 简单, 1: 非常简单}这份元数据的价值在于用户提问推荐一道荤菜有没有中等难度的下饭菜时系统可以从查询中提取过滤条件main.py中的_extract_filters_from_query()直接做category/difficulty的元数据过滤检索而不是把过滤负担全部压给向量相似度。三、结构分块洋葱炒猪肉被切成哪五个子块结构规整的菜谱与第 2 章学过的 Markdown 结构分块思路天然契合参见 docs/chapter2/05_text_chunking.md。DataPreparationModule._markdown_header_split()使用 LangChain 的MarkdownHeaderTextSplitter按三级标题层级切分headers_to_split_on [ (#, 主标题), # 菜品名称 (##, 二级标题), # 必备原料、计算、操作等 (###, 三级标题) # 简易版本、复杂版本等 ] markdown_splitter MarkdownHeaderTextSplitter( headers_to_split_onheaders_to_split_on, strip_headersFalse # 保留标题便于理解上下文 )以洋葱炒猪肉为例分块结果恰好对应文档的五个语义单元洋葱炒猪肉的做法.md父文档parent_idxxx ├── 子块1# 洋葱炒猪肉的做法 简介 预估烹饪难度 ★★★ ├── 子块2## 必备原料和工具 原料清单 ├── 子块3## 计算 食材/调味料用量配比表 ├── 子块4## 操作 六步制作步骤 └── 子块5## 附加内容 猪肉选材建议每个子块都会继承父文档的全部元数据并额外标注doc_typechild、chunk_id随机 UUID、chunk_index在父文档中的位置、parent_id同时在parent_child_map中登记child_id - parent_id的映射关系为后续由子块回溯父文档做准备。分块的效果是检索粒度变细用户问洋葱炒猪肉需要什么调味料向量检索可以精确命中计算子块而不是在整个文档中大海捞针而strip_headersFalse保留了标题使每个子块都自带语义上下文。四、小块检索、大块生成检索去重与父子文档回溯4.1 为什么要小块检索大块生成如果直接把整份菜谱作为一个检索单元用户提问洋葱炒猪肉要放多少酱油时这个具体问题只占全文极小比例向量检索很可能排不到前面反之若只检索小块命中的计算子块又缺少操作步骤的上下文。因此系统采用混合策略检索阶段用小子块精确匹配生成阶段回溯完整父文档保证上下文完整这正是 docs/chapter8/01_env_architecture.md 中强调的设计核心。4.2 混合检索与 RRF 重排code/C8/rag_modules/retrieval_optimization.py 中的RetrievalOptimizationModule同时启动两个检索器向量检索基于 BGE 嵌入模型默认BAAI/bge-small-zh-v1.5 FAISS 向量库做语义相似度召回BM25 检索基于BM25Retriever做关键词精确召回。两者结果通过_rrf_rerank()按 Reciprocal Rank Fusion 公式1 / (k rank 1)k60融合排序兼顾语义与词面匹配。例如洋葱炒猪肉这类菜名查询BM25 对菜名关键词高度敏感而咸中带甜的下饭菜这类语义查询则依赖向量召回RRF 将两者的排名优势合并。4.3 智能去重多个子块合并为一份完整菜谱由于洋葱炒猪肉被切成 5 个子块用户提问时可能同时命中计算与操作两个子块。此时DataPreparationModule.get_parent_documents()会统计每个parent_id被命中的子块数量作为相关性指标按命中次数降序排列父文档输出去重后的完整父文档列表避免把同一道菜重复传给 LLM。源码实现见 data_preparation.py其日志输出形如从 2 个子块中找到 1 个去重父文档: 洋葱炒猪肉(2块)直观展示了多块命中、一份输出的效果。五、生成阶段菜谱如何变成分步骤烹饪指导检索回溯得到完整父文档后由 code/C8/rag_modules/generation_integration.py 的GenerationIntegrationModule负责生成回答。main.py中的ask_question()会先通过query_router()把问题路由为三类list推荐/列表类如推荐几道荤菜直接输出菜名列表generate_list_answerdetail做法细节类如洋葱炒猪肉怎么做走分步指导模式generate_step_by_step_answergeneral一般知识类走基础回答模式generate_basic_answer。以 detail 路由为例提示词要求模型围绕菜品介绍 / 所需食材 / 制作步骤 / 制作技巧灵活组织输出且明确约束优先使用原文中的实用技巧不强行填充无关内容。这意味着 LLM 的回答会严格锚定上文那份真实菜谱——洋葱、250g 猪肉、3 瓣蒜头、调味料配比与六步操作都会原样呈现而不是模型自由发挥。_build_context()会把父文档连同dish_name、category、difficulty等元数据拼装进上下文默认最大 2000 字符保证模型看到的是带标签的完整菜谱。六、端到端运行配置、依赖与一次真实问答6.1 关键配置项系统配置集中在 code/C8/config.py 的RAGConfig数据类中核心参数如下配置项默认值作用data_path../../data/C8/cook菜谱数据目录即洋葱炒猪肉所在的知识库根目录index_save_path./vector_indexFAISS 索引持久化路径二次启动秒级加载embedding_modelBAAI/bge-small-zh-v1.5向量嵌入模型llm_modelkimi-k2-0711-preview生成阶段的大模型top_k3检索返回子块数量temperature0.1生成温度低值保证回答更贴近原文max_tokens2048单次生成最大 token 数6.2 环境与运行按 docs/chapter8/01_env_architecture.md 的指引在code/C8目录安装依赖并配置 Kimi API Key通过环境变量MOONSHOT_API_KEY源码在main.py初始化时会校验其是否存在conda create -n cook-rag-1 python3.12.7 conda activate cook-rag-1 cd code/C8 pip install -r requirements.txt # 配置 MOONSHOT_API_KEY 后运行 python main.py依赖清单见 code/C8/requirements.txt包括langchain、langchain-huggingface、langchain-text-splitters、faiss-cpu、rank_bm25、sentence-transformers等。首次运行会经历加载文档 → 元数据增强 → 结构分块 → 构建 FAISS 索引 → 保存索引的完整链路并打印知识库统计文档总数、文本块数、菜品分类、难度分布索引已存在时则直接加载缓存实现秒级启动。6.3 用这份菜谱验证一次完整问答进入交互式问答后提问洋葱炒猪肉怎么做会依次触发查询路由判定为detail混合检索命中洋葱炒猪肉的计算操作等子块get_parent_documents去重回溯出完整父文档分步指导模式生成包含食材清单、六步操作与制作技巧的回答。如果追问洋葱炒猪肉要放多少糖_extract_filters_from_query虽无法提取分类/难度过滤条件但精确的子块检索仍会命中计算章节直接给出糖 15g的用量答案——这正是结构分块 小块检索带来的实战收益。七、小结以「洋葱炒猪肉」这一份真实菜谱为线索我们完整走通了 all-in-rag「尝尝咸淡 RAG 系统」从数据到答案的整条链路结构化 Markdown 文档经过元数据增强菜名、荤菜分类、中等难度与 Markdown 三级标题分块1 份文档 → 5 个子块在混合检索向量 BM25 RRF阶段以小粒度精确命中用户意图再经父子文档映射去重回溯完整菜谱最后由 LLM 在 detail 路由下生成忠于原文的分步指导。这份菜谱既是厨房里一道 15 分钟的快手菜也是理解 RAG 数据加工流水线一份难得的麻雀虽小、五脏俱全的样本数据。若想深入阅读模块实现推荐对照 data_preparation.py、retrieval_optimization.py 与 generation_integration.py 三份源码逐行研读。赞分享教程人工智能大模型RAG【免费下载链接】all-in-rag大模型应用开发实战一RAG 技术全栈指南在线阅读地址https://datawhalechina.github.io/all-in-rag/项目地址https://gitcode.com/datawhalechina/all-in-rag点击查看免费下载相关推荐Hindsight 中 AI Agent 的短期记忆与长期记忆两层架构、retain/recall 实现与落地评估方法Hindsight 中 AI Agent 的短期记忆与长期记忆两层架构、retain/recall 实现与落地评估方法 理解短期记忆 vs 长期记忆这一主教程人工智能大模型RAGall-in-rag 数据工程实战白灼虾菜谱从 Markdown 到 RAG 知识库的完整解读all in rag 数据工程实战白灼虾菜谱从 Markdown 到 RAG 知识库的完整解读 在 Datawhale 的 all in rag 仓库中 c教程人工智能大模型RAGall-in-rag 实战冬瓜酿肉菜谱文档的 RAG 全流程解析与制作指南all in rag 实战冬瓜酿肉菜谱文档的 RAG 全流程解析与制作指南 在 Datawhale all in rag 项目的第 8 章中一个以「家常菜食教程人工智能大模型RAG创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表