山西过油肉菜谱全解析:从传统晋菜做法到「尝尝咸淡」RAG 系统的结构化实战
【免费下载链接】all-in-rag🔍大模型应用开发实战一:RAG 技术全栈指南,在线阅读地址:https://datawhalechina.github.io/all-in-rag/项目地址: https://gitcode.com/datawhalechina/all-in-rag
过油肉是山西传统名菜,历经多年传承,几乎家家都会做。本文以仓库中 data/C8/cook/dishes/meat_dish/山西过油肉.md 这份结构化菜谱为样本,一方面完整还原这道经典晋菜的原料配比、操作步骤与烹饪技巧,另一方面借助 all-in-rag 项目第 8 章「尝尝咸淡」食谱问答系统的源码实现,剖析这份 Markdown 菜谱从入库、元数据增强、按标题分块,到混合检索与 LLM 生成回答的完整 RAG 链路,帮助读者同时掌握一道家常硬菜的做法与一套可落地的菜谱 RAG 数据工程方法。
一、菜品概览与难度评估
山西过油肉是典型的晋菜代表,主料为猪里脊,辅以蒜苔、木耳、葱头,通过「过油滑肉 + 快炒」的技法成菜,讲究肉片滑嫩、咸鲜微醋香。
原菜谱对烹饪难度给出了明确的星级评估:
预估烹饪难度:★★★★
这个星级标记在「尝尝咸淡」RAG 系统中并非摆设。参考 data_preparation.py 中的_enhance_metadata实现,系统会使用正则r'★+'匹配文档中的连续星号数量,并映射为五档难度标签:
difficulty_map = {5: '非常困难', 4: '困难', 3: '中等', 2: '简单', 1: '非常简单'} doc.metadata['difficulty'] = difficulty_map.get(star_count, '未知')因此,★★★★会被自动解析为「困难」级别,并作为结构化元数据写入该菜谱的索引,供后续按难度过滤与查询路由使用。这与 docs/chapter8/02_data_preparation.md 中「从内容中的星级标记自动提取难度等级」的设计完全对应——菜谱只要保持统一的星级书写规范,系统就能零标注地完成难度画像。
二、必备原料与工具清单
制作山西过油肉所需的原料与工具如下:
| 类别 | 原料/工具 |
|---|---|
| 主料 | 猪里脊、鸡蛋 |
| 配菜 | 蒜苔、木耳、葱头 |
| 调料 | 盐、酱油(生抽)、料酒、陈醋、花椒粉、鸡精 |
| 辅料 | 葱姜蒜、淀粉(建议红薯淀粉)、食用油 |
其中木耳需提前泡发,蒜苔提供清甜口感,陈醋是点睛之笔——起锅前淋醋是这道菜「咸鲜中带微酸」风味的关键。工具方面一口炒锅即可,无需特殊设备。
从 RAG 数据工程视角看,这张清单对应菜谱文档中的## 必备原料和工具小节。在 data_preparation.py 的_markdown_header_split中,系统配置了三级标题分割器:
headers_to_split_on = [ ("#", "主标题"), # 菜品名称 ("##", "二级标题"), # 必备原料、计算、操作等 ("###", "三级标题") # 简易版本、复杂版本等 ]也就是说,这份菜谱会被自动切分成「菜名+简介」「必备原料和工具」「计算」「操作」「附加内容」等多个独立子块。当用户问「山西过油肉需要什么食材」时,检索系统能精确命中「必备原料和工具」这一子块,这正是 docs/chapter8/01_env_architecture.md 中强调的「小块检索」优势。
三、用量计算:一人份的精确配比
原菜谱基于作者本人饭量给出了一人份用量,单位明确、便于按比例缩放:
| 原料 | 用量 |
|---|---|
| 猪里脊 | 150 g |
| 蒜苔 | 6 根 |
| 食用油 | 300 ml(其中约 10 ml 用于炒菜) |
| 葱姜蒜 | 50 g |
| 生抽 | 20 ml |
| 食盐 | 10 g |
| 鸡蛋 | 1 个 |
| 淀粉 | 10 g |
| 木耳 | 20 g |
| 葱头 | 100 g |
| 其他调料(料酒、陈醋、花椒粉、鸡精) | 20 g |
几个值得注意的配比要点:
- 油量偏大是这道菜的底色:300 ml 食用油主要用于滑肉(过油),并非全部下锅食用,炸完后需倒出余油,仅留约 10 ml 炒菜。
- 蛋液 + 淀粉双重上浆:一个鸡蛋搭配 10 g 红薯淀粉,保证里脊肉片在高温过油时形成保护层,锁住水分,口感滑嫩。
- 盐与生抽分工明确:生抽在腌制时加入入底味,食盐在出锅前调味,两者互补避免过咸。
在 RAG 系统中,这个## 计算小节是「用量配比」类查询的高频命中区。用户提问「山西过油肉一人份要多少肉」,系统通过向量检索 + BM25 关键词检索即可定位到该子块,再经父子文档映射取回完整菜谱交给 LLM 生成答案。
四、操作步骤详解
4.1 准备工作
- 泡发木耳:木耳提前泡发好,如果着急可以用热水泡发,以缩短等待时间。
- 腌制肉片:猪里脊切片放入碗中,加入 20 ml 生抽、料酒、花椒粉,打入一个鸡蛋,搅拌均匀后加入淀粉(建议红薯淀粉)拌匀,最后倒入 300 ml 食用油封浆,腌制 15 分钟。食用油封浆的作用是隔绝空气、锁住水分,同时让肉片下锅时更易打散。
- 切配辅料:蒜苔切段约 3 cm,葱头切菱形块备用。菱形块受热均匀、成熟度一致,也利于摆盘美观。
4.2 过油与快炒
- 滑肉:起锅烧油,油量要多,油温五成热(约 150 ℃,筷子插入周围泛起细密小泡)下入腌制好的肉片,迅速将肉片打散,待表面微焦后捞出控油备用。五成热油温下肉片既不会脱浆,又能快速定型。
- 爆香:将锅中多余油倒出,留 10 ml 油,油温七成热(约 180 ℃,微微冒烟)下入葱姜蒜爆香。
- 炒配菜:先下蒜苔炒至断生,再下木耳、葱头,加入生抽、花椒粉,翻炒几下。
- 合炒调味:将之前炸好的肉片下入翻炒,加 10 g 盐,起锅前加 10 ml 醋和鸡精,翻炒均匀后起锅装盘。
4.3 附加技巧(原文档要点)
- 火候控制:炸肉片时表面微焦即可出锅,过度油炸会导致肉质变老、失去滑嫩口感。
- 薄芡提口感:起锅前也可以打一个薄薄的水淀粉(水淀粉勾芡),让汤汁略微挂在肉片和配菜上,口感更佳。
五、纵深视角:这份菜谱在「尝尝咸淡」RAG 系统中的完整流转
5.1 元数据增强:文件路径即分类依据
这份菜谱位于data/C8/cook/dishes/meat_dish/目录下,文件名即菜品名。系统在加载时通过 data_preparation.py 的_enhance_metadata完成三项自动标注:
- 菜品分类:匹配路径中的
meat_dish目录,标注为「荤菜」; - 菜品名称:取文件主干名
山西过油肉; - 难度等级:按前文所述正则解析
★★★★为「困难」。
最终该菜谱的元数据可概括为{dish_name: 山西过油肉, category: 荤菜, difficulty: 困难},这些字段被复制到其下所有子块中,成为检索过滤与回答路由的关键依据。
5.2 结构分块与父子映射
按标题分割后,本菜谱形成类似如下的子块结构:
山西过油肉的做法.md(父文档) ├── 子块1:# 山西过油肉的做法 + 简介 + 预估难度 ├── 子块2:## 必备原料和工具(原料清单) ├── 子块3:## 计算(用量配比表) ├── 子块4:## 操作(详细制作步骤) └── 子块5:## 附加内容(火候与勾芡技巧)每个子块都会继承父文档的parent_id并生成独立的chunk_id,映射关系记录在parent_child_map中。这正是 docs/chapter8/02_data_preparation.md 所讲的「小块检索,大块生成」:用户问「过油肉怎么做」时,检索阶段命中「操作」子块实现精确召回;生成阶段则通过get_parent_documents按命中次数排序并去重,取回完整的山西过油肉菜谱交给 LLM,保证回答上下文完整。
5.3 查询流转与回答生成
用户输入「山西过油肉怎么做」后,main.py 中的主流程会依次执行:
- 查询路由:LLM 将问题分类为
detail(详细查询),走分步指导模式; - 查询重写:因问题包含具体菜名,按规则保持原查询不变;
- 混合检索:向量检索(BGE 嵌入模型)与 BM25 关键词检索并行,再经 retrieval_optimization.py 的 RRF 重排融合,取 top_k 子块;
- 父子还原:命中子块回溯父文档,按相关性排序去重;
- 分步生成:调用 generation_integration.py 中的烹饪导师提示词,产出包含「菜品介绍 / 所需食材 / 制作步骤 / 制作技巧」的结构化回答——其「制作技巧」小节会优先采用本菜谱「附加内容」中的火候与勾芡建议。
5.4 配置说明与运行前提
本菜谱作为知识库数据的一份子,参与系统构建时无需任何额外标注。相关运行配置见 config.py,其中data_path默认指向../../data/C8/cook,即本菜谱所在目录的父级;嵌入模型默认使用BAAI/bge-small-zh-v1.5,LLM 默认使用 Moonshot(Kimi)系列模型,需要预先配置MOONSHOT_API_KEY环境变量。按 docs/chapter8/01_env_architecture.md 的说明,在code/C8目录执行pip install -r requirements.txt安装依赖后运行python main.py,即可启动交互式问答,向系统提问「山西过油肉怎么做」或「推荐一道困难级别的荤菜」。
小结
山西过油肉这道菜本身浓缩了传统晋菜「过油滑肉、旺火快炒、陈醋收尾」的技法精髓;而它在 all-in-rag 项目中的意义远不止一份菜谱——它同时是「尝尝咸淡」RAG 系统数据管道的一个典型样本:路径提供分类、星级提供难度、标题结构提供分块边界、附加内容提供生成阶段的技巧素材。掌握这份菜谱的做法,也就顺带理解了结构化菜谱数据如何零标注地流入 RAG 索引并产出高质量问答,这正是本项目第 8 章实战的核心价值所在。
【免费下载链接】all-in-rag🔍大模型应用开发实战一:RAG 技术全栈指南,在线阅读地址:https://datawhalechina.github.io/all-in-rag/项目地址: https://gitcode.com/datawhalechina/all-in-rag
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考