- 教程
- 人工智能
- 大模型
- RAG
【免费下载链接】all-in-rag
🔍大模型应用开发实战一:RAG 技术全栈指南,在线阅读地址:https://datawhalechina.github.io/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 鸡爪处理(焯水去腥)
- 用剪刀或刀把鸡爪上的指甲部分全部剪掉,包括指甲下面的肉和骨头,让它一点指甲都不剩;
- 用水把鸡爪洗干净,放一边备用;
- 将鸡爪放入大锅中,准备去腥;
- 放入全部大葱、料酒、姜;
- 加水没过鸡爪;
- 大火煮开,中途可以把浮末捞起来;
- 水开(100 度沸腾)后等 10 分钟;
- 关火,捞出来,把水沥干,洗干净,放入盆里。
⚠️ 附加提示:操作时需要注意观察沸腾的水位线,如发现水位低于食材的 3/4,应加热水至没过食材,避免煮制不均匀。
4.2 去骨(可省略,约 2 小时)
这是全流程最耗体力的一步,原文档明确说明此步骤可以省略(省略后即为带骨版本,风味相近但少了"无骨"的口感体验)。完整去骨步骤如下:
- 将焯好洗净的鸡爪放入冰箱冷冻层 20 分钟——冷冻能让皮肉适度收紧、骨头更好分离;
- 从冷冻层取出后放入非冷冻层冷藏,然后分批 10 个一批拿出来去骨(避免长时间暴露在室温下);
- 从鸡爪的手指最前端开始,每只手指都要用刀划开,划到它的手背部分;
- 再从手背部用刀分划开至整个手臂;
- 把每只手指的关节处都掰一掰(像按压手指发出声响那样),松动关节;
- 按着手指最前端,往里推,每只手指都一样,先推到中间手掌、手背部分;
- 每只手指的皮脱离后,从手掌开始往手臂部分推,直到整个鸡爪皮肉完整脱下来;
- 放入碗中,备用。
4.3 调配腌料(核心风味成型)
- 小米辣切成均匀小颗;
- 大蒜、洋葱、香菜切碎;
- 柠檬对半切开,把柠檬汁挤入装鸡爪的容器里;
- 把全部调料倒入装鸡爪的容器,小米辣、大蒜、洋葱和香菜也一并放进去;
- 抓拌均匀;
- 调配好后全部放入准备好的鸡爪;
- 放入冰箱冷藏一个晚上(约 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_dish在CATEGORY_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_id、parent_id、doc_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/
相关推荐
all-in-rag 实战:以"意式烤鸡"菜谱为例,解析 RAG 食谱知识库的结构化数据与父子文本块机制
all in rag 实战:以"意式烤鸡"菜谱为例,解析 RAG 食谱知识库的结构化数据与父子文本块机制 本篇技术指南以 Datawhale all in ra
教程人工智能大模型RAGDatawhale all-in-rag 实战:以《可乐鸡翅》菜谱为例解析 RAG 数据准备与"小块检索、大块生成"全流程
Datawhale all in rag 实战:以《可乐鸡翅》菜谱为例解析 RAG 数据准备与"小块检索、大块生成"全流程 导读 本文以 all in rag
教程人工智能大模型RAGDatawhale All-in-RAG 食谱数据实战:B52 轰炸机鸡尾酒分层调制全解析
Datawhale All in RAG 食谱数据实战:B52 轰炸机鸡尾酒分层调制全解析 B52 轰炸机(B 52)是鸡尾酒中最具观赏性与仪式感的一款:以甘露
教程人工智能大模型RAG
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考