- 教程
- 人工智能
- 大模型
- RAG
【免费下载链接】all-in-rag
🔍大模型应用开发实战一:RAG 技术全栈指南,在线阅读地址:https://datawhalechina.github.io/all-in-rag/
番茄红酱是一道以碎牛肉、番茄酱与蔬菜为基底、用牛奶小火慢炖而成的浓香百搭酱料,可搭配薄饼、意面等主食食用。本篇指南以 all-in-rag 仓库中 番茄红酱.md 菜谱为主体,完整还原其原料清单、每份用量配比与五步操作流程,并结合仓库 C8 章"尝尝咸淡 RAG 系统"的源码实现,说明这份结构化菜谱是如何被加载、打标、分块并在问答中被检索与生成的。读完本篇,你既能照单做出正宗的番茄红酱,也能理解一份菜谱文档在 RAG 知识库中从"文件"到"可回答"的全过程。
一、菜品概览与难度评估
番茄红酱香浓可口、营养丰富,是一款兼容性极强的百搭酱料,既可以作为薄饼、意面的浇头,也可以搭配其他主食食用。原文档评价其"有些繁琐,适合有烹饪经验的人尝试",并给出了★★★★(四星)的预估烹饪难度——这意味着它包含较多处理步骤,需要精妙掌握火候、时间与材料组合的技巧,即便是有经验的厨师也需要花费不少时间来准备。
值得说明的是,这份难度标记在 all-in-rag 的 RAG 系统中并不仅仅是一行文字,而是被元数据增强逻辑解析为结构化的难度标签。在 data_preparation.py 的_enhance_metadata方法中,系统通过正则表达式★+匹配连续星号数量,并依据映射表{5: '非常困难', 4: '困难', 3: '中等', 2: '简单', 1: '非常简单'}将其转换为难度元数据:
star_match = re.search(r'★+', content) if star_match: star_count = len(star_match.group()) difficulty_map = {5: '非常困难', 4: '困难', 3: '中等', 2: '简单', 1: '非常简单'} doc.metadata['difficulty'] = difficulty_map.get(star_count, '未知')因此,当用户向系统提问"推荐一个困难的荤菜"时,这份番茄红酱会因为difficulty='困难'且category='荤菜'而被元数据过滤逻辑准确命中。从源码结构可以推断,这一机制正是 main.py 中_extract_filters_from_query与 retrieval_optimization.py 中metadata_filtered_search协同工作的结果。
二、必备原料与工具清单
制作番茄红酱需要准备以下原料,其中干罗勒或百里香为可选香料,其余均为必需项:
| 类别 | 原料 |
|---|---|
| 肉类 | 碎牛肉 |
| 蔬菜 | 蒜瓣、胡萝卜、芹菜、洋葱 |
| 调味 | 番茄酱、糖、食盐、胡椒粉、橄榄油 |
| 液体 | 牛奶 |
| 香料(可选) | 干罗勒或百里香 |
原文档将橄榄油单列为必备原料,它同时承担煸炒蔬菜与炒制牛肉两道工序的介质作用。这份清单在 RAG 系统分块后恰好对应"## 必备原料和工具"这个独立子块,用户若询问"番茄红酱需要什么食材",检索阶段可精确命中该子块,再经由父子文档机制取回完整父文档供大模型组织回答。
三、计算:每份用量配比
原文档按"每份"给出固定配比,一次制作恰好对应一份的量,无需随份数换算:
- 碎牛肉 500g
- 蒜瓣 2 个
- 胡萝卜 半根
- 芹菜 一根
- 洋葱 半个
- 橄榄油(操作中分两次各用 10ml)
- 糖 2g
- 食盐 10g
- 黑胡椒粉 5g
- 番茄酱 300g
- 牛奶 300ml
这组数据体现了酱料的平衡逻辑:500g 碎牛肉提供浓郁肉香,300g 番茄酱奠定酸甜基底,300ml 牛奶则用于中和番茄的酸涩并带来顺滑口感。需要注意的是,原文档特别提示"考虑各个品牌的番茄酱内含盐量不同,建议在炒牛肉时少放盐,煮的时候尝一下再调味"——即 10g 食盐为上限参考值,实际投放量应以所用番茄酱品牌的含盐量为准动态调整。
这份用量数据在知识库中同样被结构化处理:在 RAG 系统的 Markdown 分块流程里(见 data_preparation.py 的_markdown_header_split),"## 计算"标题下的配比内容会作为一个独立子块保存,并携带chunk_id、parent_id、doc_type='child'、chunk_index等元数据,与"必备原料""操作"等子块共同组成父子文档结构。
四、操作步骤详解
原文档将整个制作过程浓缩为五个步骤,下面结合烹饪原理逐条展开:
第一步:备料将胡萝卜、芹菜、洋葱切碎,蒜瓣切片。蔬菜切碎粒度保持均匀,既有利于快速煸炒出香,也能在后续 30 分钟慢炖中与肉酱充分融合。
第二步:煸炒蔬菜锅中加入 10ml 橄榄油,油热后下入蔬菜,大火翻炒至略微变色后盛出备用。大火快炒的目的是在保留蔬菜水分与清甜口感的同时,激发出洋葱、胡萝卜、芹菜的香气——这三者正是西式酱料中经典的"香蔬三件套"(Mirepoix)。
第三步:炒制牛肉锅内再加入 10ml 橄榄油,放入蒜片翻炒 10 秒,随后加入碎牛肉、糖、盐、胡椒粉和香料(干罗勒或百里香),将牛肉炒脆、炒出颗粒感。炒至颗粒状能让牛肉在后续炖煮中更好地吸附酱汁,同时避免结块;此阶段加糖也可帮助牛肉上色并平衡整体风味。
第四步:合炒将炒好的蔬菜和番茄酱加入锅中,与牛肉充分翻炒、搅拌均匀。让酱料、油脂与肉末在高温下融合,为下一步的慢炖做铺垫。
第五步:慢炖收汁分多次缓缓倒入 300ml 牛奶,转中小火煮 30 分钟即可完成。分次倒入牛奶可以防止温度骤降导致酱料分离;中小火慢炖则让牛肉、蔬菜与番茄酱的风味充分交融,牛奶中的乳脂还能柔化番茄的酸度,最终形成浓稠顺滑的质地。原文档强调,煮酱料期间请持续搅动以免粘锅,待酱料变得粘稠即可出锅。
从 RAG 系统视角看,这五个步骤对应"## 操作"子块,是回答"番茄红酱怎么做"时的核心检索内容。当查询被路由为detail类型时,generation_integration.py 中的generate_step_by_step_answer会使用"分步指导模式"提示词,将完整的父文档作为上下文,组织出包含菜品介绍、所需食材、制作步骤与制作技巧的结构化回答——大模型严格以这份操作步骤为事实依据,不会凭空捏造烹饪环节。
五、附加技巧与灵活变体
原文档在"附加内容"一节给出了三条实用经验,它们是保证成品质量的关键补充:
- 盐量控制:各品牌番茄酱含盐量差异较大,建议炒牛肉时少放盐,煮制过程中尝味后再做最终调味,避免成品过咸。
- 防粘锅:煮酱料期间必须持续搅动;当酱料变得粘稠时即为出锅时机,无需死守 30 分钟。
- 口味变体:可根据个人口味将碎牛肉替换为"一半碎猪肉一半碎牛肉"的混合肉末,或将牛奶替换为鸡汤或饮用水,以适配不同的风味偏好与饮食需求。
此外,原文档还补充了一个生活化建议:一次吃不完也没有关系,酱料可以冷冻保存,需要时随时取出加热即可(但务必记得食用)。这一特性也使其非常适合批量制作。
在 RAG 系统中,"## 附加内容"是独立的第五个子块。由于父子文档机制的存在,即使用户的问题只命中了"附加内容"子块(例如询问"番茄红酱能冷冻吗"),系统也能通过 data_preparation.py 中的get_parent_documents依据parent_id映射回完整父文档,按子块匹配次数统计相关性并去重排序,确保回答时上下文完整、不缺失食材与步骤信息。
六、这份菜谱在 RAG 知识库中的全生命周期
结合 all-in-rag 项目 C8 章"尝尝咸淡 RAG 系统"的实现(环境与架构说明见 01_env_architecture.md),这份番茄红酱菜谱从落盘到被问答,完整经历以下链路:
1. 加载与元数据增强
系统通过rglob("*.md")递归扫描数据目录(默认data_path = ../../data/C8/cook,配置见 config.py)。对番茄红酱这份文件而言,路径中的meat_dish会被 data_preparation.py 的CATEGORY_MAPPING映射为荤菜,文件名番茄红酱被提取为dish_name,正文中的★★★★被解析为困难难度。
2. 结构感知分块
使用MarkdownHeaderTextSplitter按#、##、###三级标题分割,strip_headers=False保留标题以维持上下文可读性。番茄红酱文档由此被切分为约 5 个子块(主标题与简介、必备原料和工具、计算、操作、附加内容),每个子块均继承父文档元数据并建立parent_child_map映射。
3. 索引构建
子块经BAAI/bge-small-zh-v1.5嵌入模型向量化后写入 FAISS 向量索引(index_construction.py),并持久化到vector_index目录,二次启动时可直接加载缓存实现秒级就绪。
4. 检索与重排
用户提问"番茄红酱怎么做"时,系统先由查询路由器判断为detail类型,随后执行混合检索——FAISS 向量检索与 BM25 关键词检索并行,再经 RRF(Reciprocal Rank Fusion)算法融合重排,取top_k=3个最相关子块(retrieval_optimization.py)。
5. 父子文档回溯与生成
按子块的parent_id回溯完整父文档并去重,最终由 Moonshot 大模型(默认kimi-k2-0711-preview,temperature 0.1、max_tokens 2048)以分步指导模式生成详细回答。整个过程可通过 main.py 的交互式问答入口体验。
小结
番茄红酱是一道用料常见、逻辑清晰却讲究火候与耐心的高难度酱料:量化配比(牛肉 500g、番茄酱 300g、牛奶 300ml)是基础,大火煸香、牛肉炒脆、分次加奶、中小火慢炖 30 分钟是口感的关键,盐量尝味调整与持续防粘则是成品质量的保障。与此同时,这份菜谱也是 all-in-rag 食谱 RAG 系统中的一个典型样本——从目录路径推断分类、从星号解析难度、按标题结构分块,再到混合检索与父子文档回溯生成,每一步都有仓库源码可循,为理解"结构化文档如何在 RAG 知识库中发挥价值"提供了最直观的实战案例。
- 教程
- 人工智能
- 大模型
- RAG
【免费下载链接】all-in-rag
🔍大模型应用开发实战一:RAG 技术全栈指南,在线阅读地址:https://datawhalechina.github.io/all-in-rag/
相关推荐
Datawhale all-in-rag 食谱知识库实战:酱排骨(家常酱香做法全解)
Datawhale all in rag 食谱知识库实战:酱排骨(家常酱香做法全解) 酱排骨是一道色泽酱红、肉质酥烂、骨香浓郁、汁浓味鲜、咸中带甜的家常硬菜,本
教程人工智能大模型RAG红烧猪蹄的完整做法:all-in-rag 菜谱知识库中的标准化荤菜食谱实战
红烧猪蹄的完整做法:all in rag 菜谱知识库中的标准化荤菜食谱实战 红烧猪蹄是一道汤汁浓郁、软糯下饭的经典家常硬菜,其标准做法文档完整收录在 all i
教程人工智能大模型RAGLeague Akari 完整上手指南:免费开源的英雄联盟客户端智能助手,快速告别繁琐重复操作
League Akari 完整上手指南:免费开源的英雄联盟客户端智能助手,快速告别繁琐重复操作 周六晚上八点,小林排进一局排位。选英雄只剩 25 秒,对面中单的
教程人工智能大模型RAG
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考