话梅煮毛豆菜谱实战:解析 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 系统」知识库中的一份典型结构化数据样本。本文以这份菜谱文档为解剖对象完整保留其原料、用量与操作细节同时结合仓库中 data_preparation.py、index_construction.py、retrieval_optimization.py、generation_integration.py 等源码讲清楚一份菜谱从Markdown 文件变成可被检索、可被引用的知识库条目的完整链路读完即可在自己的数据上复现这套流程。一、先看数据源话梅煮毛豆这份菜谱长什么样关联文档位于 data/C8/cook/dishes/vegetable_dish/话梅煮毛豆/话梅煮毛豆.md同目录还存放了成品图1.jpeg。其原文内容如下# 话梅煮毛豆的做法 酸甜可口、营养价值高的一种简易美食 预估烹饪难度★★ ## 必备原料和工具 * 毛豆 * 话梅 * 食用盐 ## 计算 每份 * 毛豆 300 g * 话梅 6 颗 * 食用盐 2 g ## 操作 * 清水加入食用盐毛豆浸泡 15 分钟 * 加入开水倒入毛豆、话梅水煮 20-30 分钟 * 起锅开吃 ## 附加内容从 RAG 数据工程的角度看这份文档具备三个对后续处理至关重要的结构特征目录即分类文件存放在vegetable_dish/目录下这一路径信息可以直接推导出菜品分类素菜标题即结构文档使用#、##两级标题组织简介 → 原料 → 计算 → 操作 → 附加内容天然适配按标题切块星级即难度预估烹饪难度★★中的连续星号数量可直接映射为难度等级。这也是 why 这份菜谱能够成为知识库一员的关键——它不是自由文本而是遵循了统一模板的结构化数据。仓库中 data/C8/cook 下所有菜谱荤菜、素菜、汤品、甜品等都遵循同一套写法使得后面的元数据增强与分块逻辑可以无差别批量处理。二、文档加载话梅煮毛豆如何进入 RAG 系统数据准备模块 data_preparation.py 的DataPreparationModule是整个链路的入口其核心方法是load_documents()data_preparation.pyfor md_file in data_path_obj.rglob(*.md): with open(md_file, r, encodingutf-8) as f: content f.read() # 基于数据根目录的相对路径生成确定性 parent_id relative_path Path(md_file).resolve().relative_to(data_root).as_posix() parent_id hashlib.md5(relative_path.encode(utf-8)).hexdigest() doc Document( page_contentcontent, metadata{source: str(md_file), parent_id: parent_id, doc_type: parent} )几个实现细节值得注意rglob(*.md)递归扫描只要数据目录下存在.md文件就会被加载话梅煮毛豆的路径dishes/vegetable_dish/话梅煮毛豆/话梅煮毛豆.md正在扫描范围内保持原始 Markdown 格式直接以 UTF-8 读取全文存入page_content不做过早的文本清洗把结构化信息保留给后续分块环节确定性父文档 IDparent_id由文件相对路径做 MD5 生成同一份文件每次构建索引得到的 ID 一致这为索引缓存复用与父子文档关联提供了稳定锚点doc_type: parent标记完整菜谱为父文档与后续切出的子块doc_type: child区分。在 main.py 的build_knowledge_base()中加载文档后紧接着调用chunk_documents()完成分块再交给索引构建模块向量化。默认数据路径在 config.py 中定义为data_path: str ../../data/C8/cook相对code/C8目录也就是说整个菜谱知识库的构建并不需要针对单份文档写任何特殊逻辑。三、元数据增强自动认出素菜 / 简单 / 话梅煮毛豆load_documents()加载完每份文档后会调用_enhance_metadata()data_preparation.py做元数据增强这正是话梅煮毛豆被系统理解的三条线索1. 分类从路径推断。模块维护了一张目录英文名到中文分类的映射表CATEGORY_MAPPING { meat_dish: 荤菜, vegetable_dish: 素菜, soup: 汤品, dessert: 甜品, breakfast: 早餐, staple: 主食, aquatic: 水产, condiment: 调料, drink: 饮品 }只要路径片段中出现vegetable_dishmetadata[category]即被标记为素菜。话梅煮毛豆所在的目录恰好命中这一规则。2. 难度从星号提取。源码使用正则re.search(r★, content)匹配连续的星号再通过映射表换算difficulty_map {5: 非常困难, 4: 困难, 3: 中等, 2: 简单, 1: 非常简单}文档中写的是★★因此metadata[difficulty]会被自动判定为简单。这里的星级写法15 星与菜谱模板是强耦合的约定仓库内所有菜谱都遵守该约定难度标签才能批量、稳定地抽取。3. 名称从文件名提取。doc.metadata[dish_name] file_path.stem即话梅煮毛豆。后续无论是main.py打印检索到的菜品名还是生成列表式回答都直接读取这个字段。增强后的元数据具备实际检索价值模块提供了filter_documents_by_category()与filter_documents_by_difficulty()data_preparation.py两个过滤接口而 main.py 的_extract_filters_from_query()会从用户问题中匹配素菜简单等关键词将其转换为元数据过滤条件——这正是推荐几道简单的素菜这类查询能精准圈定话梅煮毛豆的原因。四、Markdown 结构感知分块二级标题切出可检索的子块分块是决定检索精度的关键环节。模块采用 LangChain 的MarkdownHeaderTextSplitter实现结构感知分块data_preparation.pyheaders_to_split_on [ (#, 主标题), # 菜品名称 (##, 二级标题), # 必备原料、计算、操作等 (###, 三级标题) # 简易版本、复杂版本等 ] markdown_splitter MarkdownHeaderTextSplitter( headers_to_split_onheaders_to_split_on, strip_headersFalse # 保留标题便于理解上下文 )strip_headersFalse表示切块后保留标题文本避免子块丢失上下文语义。以话梅煮毛豆为例父文档会被切成如下子块父文档# 话梅煮毛豆的做法完整菜谱 ├── 子块1# 话梅煮毛豆的做法 简介 难度★★ ├── 子块2## 必备原料和工具 毛豆/话梅/食用盐 ├── 子块3## 计算 毛豆 300g / 话梅 6 颗 / 食用盐 2g ├── 子块4## 操作 浸泡15分钟 / 水煮20-30分钟 / 起锅 └── 子块5## 附加内容每个子块会继承父文档的全部元数据并补充chunk_idUUID、doc_type: child、chunk_index、chunk_size同时把child_id → parent_id写入parent_child_map字典。这套设计对应文档 docs/chapter8/02_data_preparation.md 中强调的小块检索大块生成父子文本块架构用户问话梅煮毛豆要多少话梅时可以精确定位到计算子块而生成回答时再通过get_parent_documents()取回完整父文档保证 LLM 拥有完整上下文。五、从怎么做到推荐素菜检索与生成的完整链路分块完成后索引构建模块 index_construction.py 使用默认的 BGE 中文嵌入模型BAAI/bge-small-zh-v1.5将子块向量化并存入 FAISS 向量库支持save_local/load_local索引缓存。随后检索优化模块 retrieval_optimization.py 提供双路检索向量检索as_retriever(search_typesimilarity, k5)捕捉语义相似例如酸甜的开胃小食能匹配到话梅煮毛豆BM25 关键词检索BM25Retriever.from_documents(chunks, k5)精确匹配话梅毛豆等具体词RRF 融合_rrf_rerank参数k60按1/(krank1)累计两路排名得分输出综合排序结果并写入doc.metadata[rrf_score]。生成集成模块 generation_integration.py 则负责理解问题并组织回答query_router()把问题分为list推荐类、detail做法类、general一般类三种query_rewrite()对模糊查询做重写优化如做菜→简单易做的家常菜谱generate_step_by_step_answer()使用结构化提示词按菜品介绍 / 所需食材 / 制作步骤 / 制作技巧四段式输出详细指导其中制作技巧一节明确要求优先采用原文附加内容中的实用技巧若该部分为空则基于步骤总结或直接省略_build_context()将父文档按max_length2000截断并拼接元数据头菜品名、分类、难度作为 LLM 上下文。在 main.py 的ask_question()中上述环节被串成一条完整流水线查询路由 → 查询重写 → 元数据过滤/混合检索 → 父子文档去重 → 按路由类型选择生成模式。典型问答场景如下用户问题: 推荐几道简单的素菜 查询类型: list 过滤条件: {category: 素菜, difficulty: 简单} 生成结果: 为您推荐话梅煮毛豆、凉拌黄瓜、蒜蓉西兰花……用户问题: 话梅煮毛豆怎么做 查询类型: detail 生成结果: ## 菜品介绍 … ## 所需食材毛豆300g、话梅6颗、盐2g… ## ‍ 制作步骤盐水浸泡15分钟 → 开水下锅煮20-30分钟 → 起锅…六、动手运行把这份菜谱跑进一个可问答的系统从仓库根目录出发按以下步骤即可将话梅煮毛豆所在的整个知识库跑起来准备依赖与密钥main.py启动时会检查MOONSHOT_API_KEY环境变量生成模块通过 Moonshot 的MoonshotChat调用 LLM缺失会抛出ValueError。依赖清单见 code/C8/requirements.txt从源码 import 看主要包括 langchain、langchain-community、langchain-huggingface、langchain-text-splitters、faiss 相关库及python-dotenv。确认配置核心参数集中在 config.py 的RAGConfig中均可用from_dict覆盖配置项默认值作用data_path../../data/C8/cook相对code/C8菜谱知识库根目录index_save_path./vector_indexFAISS 索引持久化路径embedding_modelBAAI/bge-small-zh-v1.5中文嵌入模型llm_modelkimi-k2-0711-preview生成模型top_k3检索返回的子块数量temperature0.1生成温度值越低越保守max_tokens2048最大生成长度启动交互问答在code/C8目录下执行python main.py系统会先构建或加载向量索引首次构建需几分钟之后因索引缓存只需几秒随后进入命令行问答循环支持流式输出。值得注意的是上述整条流水线对话梅煮毛豆并未做任何特判——它是被统一的模板约定目录分类、星级难度、标题结构自动理解的。这也正是本案例最值得复用的经验在搭建 RAG 知识库时先定义好文档模板规范往往比堆砌更多的切块参数更能提升检索效果。七、留白的附加内容与数据规范的价值话梅煮毛豆文档末尾的附加内容目前为空这在数据层面并非缺陷。一方面生成模块的提示词已对此做了容错——没有技巧就不强行输出另一方面它恰好演示了模板的可生长性后续若补充话梅品种选择浸泡时间对口感的影响等补充说明系统无需改动任何代码即可自动将其纳入知识库。结合 docs/chapter8/04_generation_sys.md 中提出的优化方向这份菜谱未来还可以沿着两条路线深化一是接入图数据库把毛豆、话梅、食用盐建模为食材节点支撑和话梅搭配的食材这类关系查询二是融合同目录1.jpeg成品图等视觉数据用多模态模型实现看图找菜。无论走向哪种方案当前这套目录即分类、标题即结构、星级即难度的数据规范都是所有上层能力得以成立的地基。赞分享教程人工智能大模型RAG【免费下载链接】all-in-rag大模型应用开发实战一RAG 技术全栈指南在线阅读地址https://datawhalechina.github.io/all-in-rag/项目地址https://gitcode.com/datawhalechina/all-in-rag点击查看免费下载相关推荐Roo Code v2.2.29 发布解析为自动写入增加可配置延迟让诊断与 Linter 从容跟上Roo Code v2.2.29 发布解析为自动写入增加可配置延迟让诊断与 Linter 从容跟上 Roo Code 2.2.29 引入了一项直接影响开发体教程人工智能大模型RAGall-in-rag 实战以煮泡面加蛋为例拆解菜谱知识库的数据准备与检索生成链路all in rag 实战以煮泡面加蛋为例拆解菜谱知识库的数据准备与检索生成链路 本篇技术指南以 Datawhale「all in rag」仓库中 煮泡面教程人工智能大模型RAGall-in-rag 尝尝咸淡 RAG 系统实战西红柿豆腐汤羹菜谱数据与检索问答全解析all in rag 尝尝咸淡 RAG 系统实战西红柿豆腐汤羹菜谱数据与检索问答全解析 西红柿豆腐汤羹是一道清淡鲜美、营养均衡的经典家常汤羹在 all in教程人工智能大模型RAG上一篇NS-USBLoader终极指南Switch玩家的全能文件管理神器下一篇NS-USBLoader完整指南Switch玩家的终极文件管理解决方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

Sinon 断言指南:`assert.called`——验证 spy、stub 与 fake 至少被调用过一次

Sinon 断言指南:`assert.called`——验证 spy、stub 与 fake 至少被调用过一次

测试开发工具 【免费下载链接】sinon Test spies, stubs and mocks for JavaScript. 项目地址: https://gitcode.com/gh_mirrors/si/sinon 点击查看 免费下载 assert.called(spy) 是 Sinon 内置断言 API 中最基础的断言之一:只要传入的 fake、spy 或 st…

2026/9/24 16:26:30 阅读更多 →
Swagger Codegen 生成的 Jersey2 Java8 客户端:StoreApi 订单与库存接口完整使用指南

Swagger Codegen 生成的 Jersey2 Java8 客户端:StoreApi 订单与库存接口完整使用指南

开发工具代码生成API设计 【免费下载链接】swagger-codegen swagger-codegen contains a template-driven engine to generate documentation, API clients and server stubs in different languages by parsing your OpenAPI / Swagger definition. 项目地址: http…

2026/9/24 16:26:30 阅读更多 →
ARA Research Manager 会话协议深度解析:让 AI 研究 Agent 拥有可审计的跨会话记忆

ARA Research Manager 会话协议深度解析:让 AI 研究 Agent 拥有可审计的跨会话记忆

AI 技能人工智能大模型深度学习 【免费下载链接】AI-Research-SKILLs Comprehensive open-source library of AI research and engineering skills for any AI model. Package the skills and your claude code/codex/gemini agent will be an AI research agent with full hor…

2026/9/24 16:26:30 阅读更多 →

最新新闻

MySQL 1251 报错根源与修复:认证插件兼容性实战指南

MySQL 1251 报错根源与修复:认证插件兼容性实战指南

上周五有个朋友发来一张 MySQL 报错截图: ERROR 1251 (08004): Client does not support authentication protocol requested by server; consider upgrading MySQL client 。他说密码确认了好几遍没问题,3306 端口也是通的,但不管是 Navic…

2026/9/24 19:48:17 阅读更多 →
基于Matlab的正则化逻辑回归实现微芯片质检二分类

基于Matlab的正则化逻辑回归实现微芯片质检二分类

做机器学习这块的朋友应该都知道,逻辑回归是入门分类问题的经典算法,但真正把它用到工业质检这种场景,很多人会卡在一点上:模型在训练集上表现得很好,一上测试数据就崩。微芯片质检就是这样一个典型的高维、小样本、非…

2026/9/24 19:48:17 阅读更多 →
JSZip nodeStream() 详解:在 Node.js 中将 ZIP 内文件内容转为 Streams3 可读流

JSZip nodeStream() 详解:在 Node.js 中将 ZIP 内文件内容转为 Streams3 可读流

开发工具 【免费下载链接】jszip Create, read and edit .zip files with Javascript 项目地址: https://gitcode.com/gh_mirrors/js/jszip 点击查看 免费下载 导读 nodeStream() 是 JSZip 中 ZipObject(即 zip.file(...) 返回的对象)提供的…

2026/9/24 19:48:17 阅读更多 →
Oracle DBLink连接MySQL完整指南:DG4ODBC配置与踩坑总结

Oracle DBLink连接MySQL完整指南:DG4ODBC配置与踩坑总结

01. 先搞清楚一件事:Oracle的DBLink本身并连不上MySQL1.1 为什么默认情况下这条链路是断的很多第一次接触这个需求的同学会默认认为:DBLink嘛,连什么数据库都是DBLink,改了连接串不就行了。我最初也是这么想的,直到在L…

2026/9/24 19:48:17 阅读更多 →
Claude Code性能优化实战:从拖沓到稳定收工的完整提效指南

Claude Code性能优化实战:从拖沓到稳定收工的完整提效指南

1. 性能问题出在哪:先搞懂 Claude Code 的慢与乱我在真实项目里用 Claude Code 干了几个月,最直观的感受是:它大多数时候不是“能力不够”,而是“效率撑不住”。你给它一个任务,它吭哧吭哧写好几十个文件,改…

2026/9/24 19:48:17 阅读更多 →
PostgreSQL时间函数完全指南:从数据类型到常见坑位

PostgreSQL时间函数完全指南:从数据类型到常见坑位

我去年接手一个数据迁移项目时,被一批“看起来一模一样、跑起来差距巨大”的SQL折腾到半夜。后来排查到根因,全是时间函数写法问题——有人用now(),有人用current_date,还有人把时间戳当字符串拼,最绝的是因为时区设置…

2026/9/24 19:47:16 阅读更多 →

日新闻

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为…

2026/9/24 0:00:19 阅读更多 →
单细胞注释实战:基于Scanpy的标记基因与参考映射流程解析

单细胞注释实战:基于Scanpy的标记基因与参考映射流程解析

简介:一份基于单细胞RNA测序数据的细胞类型注释算法研究Python毕业设计源码,针对计算机相关专业正在做毕设或需要项目实战的学习者,可用于课程设计与期末大作业。项目代码完整、经导师指导评审通过,可直接运行,覆盖数据…

2026/9/24 0:00:19 阅读更多 →
C#源生成器实战:用增量生成器替代反射,告别AOT崩溃

C#源生成器实战:用增量生成器替代反射,告别AOT崩溃

第一次在项目里被反射卡住,是在一个老旧的WinForms模块里:几十个类依赖PropertyChanged通知,运行时反射读属性、发通知,每次启动慢半拍不说,一上.NET Native/AOT裁剪模式几乎全面崩盘。后来我把这段逻辑全部改成C#源生…

2026/9/24 0:00:19 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/24 14:34:13 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/24 9:10:42 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/24 14:33:56 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/24 12:50:34 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/24 14:33:48 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/24 12:49:17 阅读更多 →