all-in-rag 食谱数据实战:从「无骨鸡爪」Markdown 到父子块检索的全流程解析
2026/9/23 16:49:39 网站建设 项目流程
  • 教程
  • 人工智能
  • 大模型
  • RAG

【免费下载链接】all-in-rag

🔍大模型应用开发实战一:RAG 技术全栈指南,在线阅读地址:https://datawhalechina.github.io/all-in-rag/

项目地址:https://gitcode.com/datawhalechina/all-in-rag
点击查看免费下载

本篇指南以 Datawhale all-in-rag 仓库中的真实菜谱文档 无骨鸡爪.md 为核心对象,先完整还原这道酸辣开胃、Q 弹爽口的凉菜做法,再以此为样本,拆解它如何被仓库 code/C8 中的"尝尝咸淡 RAG 系统"加载、增强元数据、按 Markdown 标题结构分块并最终用于混合检索与问答生成。读完你将同时掌握:一道五星难度菜谱的完整烹饪流程,以及一份结构化菜谱文档在 RAG 流水线中从原始 Markdown 到可检索文本块的完整生命周期。

一、食谱档案:一道"做法简单但消耗体力"的五星凉菜

无骨鸡爪是一道典型的"工序决定成败"的菜——调味料本身并不复杂,真正的挑战在于去骨环节需要耐心与体力。原文档中标注其预估烹饪难度为★★★★★(五星),第一次制作的总耗时约为8 小时 15 分钟,其中去骨约 2 小时、冷藏腌制约 6 小时。

从数据结构的角度看,这份文档遵循了仓库菜谱数据的统一规范:以# 一级标题记录菜品名称,以## 二级标题划分"必备原料和工具 / 计算 / 操作 / 附加内容"等章节。这种高度规整的结构正是 docs/chapter8/01_env_architecture.md 中所强调的、最适合按标题层级分块的文档形态。

二、必备原料和工具

制作无骨鸡爪所需原料如下(后续"计算"一节会给出精确用量):

  • 鸡爪
  • 料酒
  • 大葱
  • 大蒜
  • 小米辣
  • 洋葱
  • 生抽
  • 蚝油
  • 黑醋(推荐陈醋)
  • 白糖
  • 花椒油
  • 香菜
  • 柠檬

需要说明的是,原文档附注指出成品图片颜色较浅,是因为家里人口味偏好酱油少的版本——生抽用量可以根据口味在参考值基础上自由调整。

三、计算:2-3 人份的标准用量

原文档明确说明一份正好够2-3 个人食用,用量配比是一份完整的可执行清单:

原料用量备注
鸡爪1kg主料
4 片焯水去腥用
料酒65g焯水去腥用
大葱3 段每段约 5cm
大蒜10 瓣腌料
小米辣4 个(少辣)/ 6 个(中辣)/ 12 个(大辣)文档推荐大辣
洋葱半个腌料
生抽75g(15g × 5)可按口味增减
蚝油30g(15g × 2)
黑醋(推荐陈醋)50g酸味核心来源
白糖10g平衡酸辣
3g
花椒油10ml提供麻香
香菜3 颗增香
柠檬2 颗以 1 颗为单位调整酸度

小米辣的辣度档位设计是这道菜的灵活变量:不吃辣可以减到 4 个,追求刺激则直接上 12 个。柠檬同理,酸度以"颗"为单位调节,2 颗是推荐值,但完全可以按口味增减。

四、操作流程

4.1 鸡爪处理(焯水去腥)

  1. 用剪刀或刀把鸡爪上的指甲部分全部剪掉,包括指甲下面的肉和骨头,让它一点指甲都不剩
  2. 用水把鸡爪洗干净,放一边备用;
  3. 将鸡爪放入大锅中,准备去腥;
  4. 放入全部大葱、料酒、姜;
  5. 加水没过鸡爪;
  6. 大火煮开,中途可以把浮末捞起来
  7. 水开(100 度沸腾)后等 10 分钟;
  8. 关火,捞出来,把水沥干,洗干净,放入盆里。

⚠️ 附加提示:操作时需要注意观察沸腾的水位线,如发现水位低于食材的 3/4,应加热水至没过食材,避免煮制不均匀。

4.2 去骨(可省略,约 2 小时)

这是全流程最耗体力的一步,原文档明确说明此步骤可以省略(省略后即为带骨版本,风味相近但少了"无骨"的口感体验)。完整去骨步骤如下:

  1. 将焯好洗净的鸡爪放入冰箱冷冻层 20 分钟——冷冻能让皮肉适度收紧、骨头更好分离;
  2. 从冷冻层取出后放入非冷冻层冷藏,然后分批 10 个一批拿出来去骨(避免长时间暴露在室温下);
  3. 从鸡爪的手指最前端开始,每只手指都要用刀划开,划到它的手背部分
  4. 再从手背部用刀分划开至整个手臂;
  5. 把每只手指的关节处都掰一掰(像按压手指发出声响那样),松动关节;
  6. 按着手指最前端,往里推,每只手指都一样,先推到中间手掌、手背部分;
  7. 每只手指的皮脱离后,从手掌开始往手臂部分推,直到整个鸡爪皮肉完整脱下来;
  8. 放入碗中,备用。

4.3 调配腌料(核心风味成型)

  1. 小米辣切成均匀小颗;
  2. 大蒜、洋葱、香菜切碎;
  3. 柠檬对半切开,把柠檬汁挤入装鸡爪的容器里;
  4. 全部调料倒入装鸡爪的容器,小米辣、大蒜、洋葱和香菜也一并放进去;
  5. 抓拌均匀;
  6. 调配好后全部放入准备好的鸡爪;
  7. 放入冰箱冷藏一个晚上(约 6 个小时)入味。

至此,一份酸辣开胃、Q 弹爽口的无骨鸡爪就完成了。总耗时中绝大部分来自冷藏腌制(6 小时),实际手工作业时间约 2 小时出头的去骨加上约 15 分钟的焯水与调料处理。

五、数据视角:无骨鸡爪文档如何进入 RAG 流水线

上面还原的是原文档的完整烹饪内容。接下来我们切换视角,看看仓库中的"尝尝咸淡 RAG 系统"(code/C8)是如何消费这份文档的——这既是 docs/chapter8/02_data_preparation.md 所述"小块检索,大块生成"父子文本块策略的真实样本,也是验证整条 RAG 链路的最佳载体。

5.1 文档加载与元数据增强

系统启动后,数据准备模块 data_preparation.py 通过rglob("*.md")递归扫描 data/C8/cook 目录下的所有菜谱文件,对每个文件执行_enhance_metadata元数据增强。以无骨鸡爪这份文档为例,实际提取结果如下:

  • 菜品分类(category):从文件路径中的目录名推断。meat_dishCATEGORY_MAPPING中映射为"荤菜",因此data/C8/cook/dishes/meat_dish/无骨鸡爪/路径下的文档被标记为"荤菜";
  • 菜品名称(dish_name):直接取文件名主干(stem),即"无骨鸡爪";
  • 难度等级(difficulty):用正则re.search(r'★+', content)匹配文档中的连续星号,5 颗星映射为"非常困难"。这也解释了原文档中"预估烹饪难度:★★★★★"这行看似普通的描述,在 RAG 系统中其实承担着结构化难度元数据的职责,可被用于"来一道困难的荤菜"这类带过滤条件的检索。

5.2 按 Markdown 标题结构分块

元数据增强后,chunk_documents调用_markdown_header_split,使用MarkdownHeaderTextSplitter按三级标题结构对文档进行切分(strip_headers=False保留标题,便于模型理解上下文)。无骨鸡爪这份文档会被切分成如下几个子块:

父文档:无骨鸡爪的做法.md ├── 子块1:# 无骨鸡爪的做法 + 简介 + 难度评级(★★★★★) ├── 子块2:## 必备原料和工具 + 食材清单 ├── 子块3:## 计算 + 2-3人份用量配比表 ├── 子块4:## 操作 + 鸡爪处理/去骨/调配腌料步骤 └── 子块5:## 附加内容 + 注意事项

每个子块都会继承父文档的元数据(分类、菜名、难度),并额外获得chunk_idparent_iddoc_type="child"chunk_index等字段,同时建立parent_child_map父子映射。这正是 docs/chapter8/02_data_preparation.md 中"检索用小子块、生成用父文档"设计的落地:当用户问"无骨鸡爪需要什么食材"时,向量检索能精确命中子块 2,而回答生成时则通过get_parent_documents取回包含完整步骤的父文档。

5.3 混合检索与 RRF 重排

索引构建(index_construction.py)使用BAAI/bge-small-zh-v1.5嵌入模型对子块向量化并存入 FAISS 后,检索优化模块 retrieval_optimization.py 会同时运行 FAISS 向量检索和 BM25 关键词检索,再用 RRF(Reciprocal Rank Fusion,1 / (k + rank),默认 k=60)对两路结果融合重排。例如"无骨鸡爪怎么去骨"这样的查询,向量路负责语义匹配"去骨"步骤,BM25 路负责关键词精确命中"去骨"二字,双路融合能显著提升召回质量。

5.4 生成回答

最终由生成集成模块 generation_integration.py 根据查询路由结果选择回答模式:detail类型查询(如"无骨鸡爪怎么做")走分步指导模式,提示词会引导模型组织"菜品介绍 / 所需食材 / 制作步骤 / 制作技巧"四段式回答,并明确要求"优先使用原文中的实用技巧",从而把原文档"附加内容"里的水位线提醒等经验完整传递给用户。

六、实操验证:让 RAG 系统回答这道菜

如果你想在本地亲自验证这条链路,可以按 docs/chapter8/01_env_architecture.md 的说明操作:

# 创建虚拟环境并安装依赖 conda create -n cook-rag-1 python=3.12.7 conda activate cook-rag-1 cd code/C8 pip install -r requirements.txt

配置好MOONSHOT_API_KEY环境变量后运行:

python main.py

启动交互式问答后,可以尝试输入"无骨鸡爪怎么做"(触发detail路由与分步指导模式)、"无骨鸡爪需要什么食材"(触发子块 2 的精确检索),或"推荐几个五星难度的荤菜"(触发难度 + 分类的元数据过滤检索)。整个流程中,无骨鸡爪这份文档会先后经历:加载 → 元数据增强 → 标题分块 → 向量化建索引 → 混合检索 → 父子文档回溯 → LLM 生成,每一环都可以在 main.py 的日志输出中看到对应打印信息,便于对照理解。

七、附加内容与要点小结

  • 去骨可省略:嫌麻烦可以直接做带骨版本,酸辣调味部分完全一致;
  • 看护水位线:焯水沸腾期间如水位低于食材 3/4,需加热水至没过食材;
  • 冷藏是关键:6 小时冷藏腌制是入味核心,不建议大幅缩短;
  • 辣度酸度可调:小米辣 4/6/12 个对应少/中/大辣,柠檬以 1 颗为单位增减;
  • 文档结构即数据资产:这份菜谱之所以能无缝接入 code/C8 的 RAG 系统,正是因为其严格的 Markdown 标题层级与统一的难度标注规范——在 all-in-rag 的菜谱数据集中,每一份.md文件都是经过良好预处理的 RAG 语料。

从一口酸辣爽脆的无骨鸡爪,到一条完整的"文档 → 元数据 → 子块 → 向量索引 → 检索重排 → 生成回答"的 RAG 数据流水线,这就是 Datawhale all-in-rag 仓库中"以结构化食谱为载体的 RAG 实战"最直观的缩影。相关实现细节可继续阅读 docs/chapter8/02_data_preparation.md 与 docs/chapter8/03_index_retrieval.md 获取更完整的模块级讲解。

  • 教程
  • 人工智能
  • 大模型
  • RAG

【免费下载链接】all-in-rag

🔍大模型应用开发实战一:RAG 技术全栈指南,在线阅读地址:https://datawhalechina.github.io/all-in-rag/

项目地址:https://gitcode.com/datawhalechina/all-in-rag
点击查看免费下载

相关推荐

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询