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 仓库 C8 食谱 RAG 系统知识库中的一份真实数据源——太阳蛋.md——为主线完整复现其食谱内容并深入剖析这份 Markdown 文档在 code/C8 完整 RAG 流水线中如何被加载、如何被元数据增强、如何被结构分块、如何被检索、如何被生成回答的全过程。读完本文你既能照做一份零失败的微波炉太阳蛋也能掌握一套可直接复用的Markdown 结构化知识库 → 向量索引 → 混合检索 → 多模式生成的 RAG 工程实现。一、太阳蛋食谱一份典型的 Markdown 结构化数据源在 all-in-rag 的 C8 食谱 RAG 系统中data/C8/cook 是整个知识库的原始数据目录按分类/菜品/的目录层级组织如breakfast/太阳蛋.md、meat_dish/红烧肉.md。太阳蛋.md 就是其中一份标准的早餐分类食谱其内容结构完整、难度标识规范非常适合作为理解 RAG 数据准备的样例。原文内容如下1.1 必备原料和工具鸡蛋盐油分可控火候微波炉或不可控火候微波炉定义和分辨方式请见附加内容筷子或牙签1.2 用量计算鸡蛋的用量为 1 个。盐的用量为 1 g 每个鸡蛋。油的用量为 5 mL 每个鸡蛋。使用上述条件计算出计划使用的原材料比例即按份数线性缩放即可做 N 份则鸡蛋 N 个、盐 N g、油 5N mL。1.3 操作步骤可控火候微波炉准备一个小碗倒入在上一步计算好的油撒盐搅拌均匀。倾斜碗使油沾在碗表面。取出一个鸡蛋打入小碗。蛋黄表面戳孔。牙签戳 5 个或筷子戳 1 个。放入微波炉中火 3 分钟。不可控火候微波炉准备一个小碗倒入在上一步计算好的油撒盐搅拌均匀。倾斜碗使油沾在碗表面。取出一个鸡蛋打入小碗。蛋黄表面戳孔。牙签戳 5 个或筷子戳 1 个。放入微波炉1 分钟。循环执行只要太阳蛋还未大面积呈固体状就继续用微波炉加热 30 秒。1.4 附加内容循环执行只要太阳蛋的熟度不符合个人口味就继续用微波炉加热 1 分钟。不可控火候微波炉定义即无法控制火候、仅能控制时长的微波炉。辨别方法若在微波炉操作面板上无法找到小火、中火、大火等字样即为不可控火候微波炉。可控火候微波炉定义即既能控制火候又能控制时长的微波炉。辨别方法若在微波炉操作面板上能找到小火、中火、大火等字样即为可控火候微波炉。关键技巧提示蛋黄表面戳孔是防爆核心——蛋黄在微波加热时内部水分汽化会产生高压若不戳孔极易炸开同时先让油盐在碗壁形成薄油层能有效避免鸡蛋粘碗。这两条经验正是食谱中可被检索模块精确命中的制作技巧型内容。二、食谱文档如何进入 RAG 知识库数据准备模块在 all-in-rag 的 code/C8/rag_modules/data_preparation.py 中DataPreparationModule负责将data/C8/cook下数百份食谱文档含太阳蛋.md转化为带丰富元数据的父子文档结构。2.1 批量加载 Markdown 文件load_documents()通过Path(data_path).rglob(*.md)递归扫描整个知识库目录直接以 UTF-8 读取原文并保持 Markdown 格式为每份父文档生成确定性的parent_id基于相对路径的 MD5同时记录source与doc_type: parent标记。2.2 元数据增强太阳蛋的身份证_enhance_metadata()会为太阳蛋文档自动补全三类核心元数据元数据字段提取逻辑太阳蛋文档的取值category从文件路径匹配CATEGORY_MAPPING如breakfast→ 早餐早餐dish_name直接取文件名 stem太阳蛋difficulty用正则★统计连续星号数量映射 1~5 星难度简单文档标记为 ★★其中难度映射表定义在源码中{5: 非常困难, 4: 困难, 3: 中等, 2: 简单, 1: 非常简单}。太阳蛋文档头部预估烹饪难度★★正是这条规则的数据来源也就是说——即使不改动任何代码只要在食谱里按规范标注星号系统就能自动识别难度。2.3 Markdown 结构感知分块_markdown_header_split()使用 LangChain 的MarkdownHeaderTextSplitter按#主标题、##二级标题、###三级标题三级结构对文档分块并设置strip_headersFalse保留标题上下文。太阳蛋文档经此流程会被拆分为典型的父子结构太阳蛋.md父文档parent_id 唯一标识 ├── 子块1# 太阳蛋的做法 难度评级 ├── 子块2## 必备原料和工具 ├── 子块3## 计算用量配比 ├── 子块4## 操作可控火候/不可控火候分支 └── 子块5## 附加内容微波炉类型定义每个子块都会继承父文档的category、difficulty、dish_name并新增chunk_id、parent_id、doc_type: child、chunk_index等字段同时写入parent_child_map维护父子映射——这正是小块检索、大块生成架构的基础。分块的价值在于用户问做太阳蛋需要什么食材时可精确命中子块2而生成回答时再通过get_parent_documents()将命中子块对应的完整父文档含全部操作步骤交给 LLM保证上下文不残缺。三、索引构建与混合检索让太阳蛋被精确召回3.1 向量化与 FAISS 索引code/C8/rag_modules/index_construction.py 中的IndexConstructionModule使用HuggingFaceEmbeddings默认模型BAAI/bge-small-zh-v1.5normalize_embeddingsTrue将每个子块编码为向量并构建 FAISS 索引save_index()/load_index()实现了索引缓存机制首次构建后后续启动可直接秒级加载。3.2 双路混合检索与 RRF 重排code/C8/rag_modules/retrieval_optimization.py 的RetrievalOptimizationModule同时设置了两路检索器向量检索vectorstore.as_retrieverk5基于语义相似度能理解微波炉做早餐怎么煎个蛋等同义表达BM25 检索BM25Retriever.from_documentsk5基于关键词精确匹配能稳定命中太阳蛋戳孔等专名。hybrid_search()调用_rrf_rerank()用 RRFReciprocal Rank Fusion融合两路结果每个文档得分 Σ 1 / (k rank 1)默认k60综合排名后取top_k配置文件默认 3。此外metadata_filtered_search()支持按category、difficulty元数据过滤——例如查询推荐几道简单的早餐时系统会自动从问题中提取过滤条件见 main.py 的_extract_filters_from_query只检索早餐简单的文档块太阳蛋正是此类场景的理想命中对象。四、生成集成从检索结果到结构化回答code/C8/rag_modules/generation_integration.py 的GenerationIntegrationModule负责最后一公里。查询路由query_router()用 LLM 将问题分类为list要菜名推荐、detail要具体做法、general一般性问题三类查询重写对非list类查询query_rewrite()会智能改写模糊表达如想做个蛋→更利于检索的表达明确查询则保持原样父子文档聚合get_parent_documents()按子块命中次数统计父文档相关性并智能去重多模式生成detail类问题走generate_step_by_step_answer()按菜品介绍/所需食材/制作步骤/制作技巧的结构化提示词输出分步指导general类问题走generate_basic_answer()输出常规回答list类问题由generate_list_answer()直接返回去重后的菜名列表流式输出generate_step_by_step_answer_stream()/generate_basic_answer_stream()基于 LCEL 的chain.stream()实现逐字输出配合 main.py 中print(chunk, end, flushTrue)呈现打字机效果。若用户问太阳蛋怎么做链路将呈现为查询路由判定detail→ 重写后混合检索命中太阳蛋相关子块 → 聚合完整父文档 → 分步指导模式生成包含原料配比与双火候操作分支的详细回答。五、一键运行把太阳蛋喂给 RAG 系统完整系统由 code/C8/main.py 的RecipeRAGSystem协调initialize_system()按依赖顺序初始化数据准备、索引构建、生成集成模块build_knowledge_base()优先加载已保存索引run_interactive()提供命令行交互问答。运行前提按 code/C8/requirements.txt 安装依赖langchain0.3.26、faiss-cpu、sentence-transformers、rank_bm25 等设置环境变量MOONSHOT_API_KEY默认 LLM 为kimi-k2-0711-preview见 code/C8/config.py默认数据路径../../data/C8/cook与嵌入模型BAAI/bge-small-zh-v1.5均已在 code/C8/config.py 中配置好top_k3、temperature0.1、max_tokens2048可按需调整。# 在 code/C8 目录下 export MOONSHOT_API_KEYyour_api_key python main.py启动后即可交互提问例如太阳蛋怎么做detail 分步指导、推荐几道简单的早餐list 元数据过滤。整体架构与运行说明还可参考 docs/chapter8/01_env_architecture.md各模块实现细节见 docs/chapter8/02_data_preparation.md、docs/chapter8/03_index_retrieval.md、docs/chapter8/04_generation_sys.md。六、小结一份看似简单的太阳蛋食谱在 all-in-rag 的 C8 系统中完整经历了 RAG 的四大环节数据准备目录路径推断分类、星号正则识别难度、三级标题结构分块→索引构建BGE 向量化 FAISS 缓存→混合检索向量语义 BM25 关键词 RRF 融合 元数据过滤→生成集成查询路由、智能重写、父子文档聚合、多模式与流式输出。掌握这条链路你就能将任何规范化的 Markdown 文档集快速改造为可问答、可推荐的领域知识库——这也正是 all-in-rag 项目从文档到生产级 RAG的核心工程价值所在。【免费下载链接】all-in-rag大模型应用开发实战一RAG 技术全栈指南在线阅读地址https://datawhalechina.github.io/all-in-rag/项目地址: https://gitcode.com/datawhalechina/all-in-rag创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
企业数字化 ERP 产品动态
相关推荐
全局规划与局部避障:Astar与DWA算法原理及源码实战 简介:基于Python实现的轮式机器人路径规划工程,融合A星全局路径规划与DWA动态窗口法,适用于机器人导航、自动驾驶等教学科研与个人学习场景。压缩包共50个文件,以13个Python脚本为核心,分别实现A星、DWA与主程序流程&a… · 2026/9/23 23:40:08
razzle-plugin-eslint:为 Razzle 通用应用零配置接入 ESLint 的插件深度解析 前端构建工具前端构建后端 【免费下载链接】razzle ✨ Create server-rendered universal JavaScript applications with no configuration 项目地址: https://gitcode.com/gh_mirrors/ra/razzle 点击查看 免费下载 razzle-plugin-eslint 是 Razzle 官方插件体系中… · 2026/9/23 23:40:08
CNN风格迁移原理与PyTorch实现:从Gram矩阵到VGG特征优化 简介:一份基于CNN卷积神经网络实现图像风格迁移的Python项目完整源码,主要面向计算机相关专业正在准备毕业设计、课程设计或期末大作业的学生,也适合需要项目实战练习的初中级开发者。项目经过导师指导并获高分评价,代码结构完整、… · 2026/9/23 23:40:02
运筹学入门:从线性规划到整数规划的建模实战指南 我刚入行做数据分析那会儿,最怕听到“运筹学”三个字。感觉那是一个属于数学系高分学霸的领域,满屏的矩阵、对偶、单纯形,跟日常工作的距离大概有十万八千里。直到后来真正用线性规划解决了一个库存积压问题,才恍然大悟࿱… · 2026/9/24 1:01:17
SDKMAN 备忘清单:Java 体系 SDK 版本管理工具完整实战指南 文档知识库教程开发工具 【免费下载链接】reference 为开发人员分享快速参考备忘清单(速查表) 项目地址: https://gitcode.com/jaywcjlove/reference 点击查看 免费下载 SDKMAN 是一款专用于管理 Java 生态体系中各类 SDK 版本的命令行工具,可运行在大多… · 2026/9/24 1:00:40
Java Agent技术:从原理到生产实践全解析 1. 为什么Java开发者需要关注Agent技术?在Java生态中,Agent技术一直是个既神秘又强大的存在。记得我2016年第一次接触Java Agent时,花了整整两周才搞明白如何实现一个简单的类转换。如今在阿里云原生团队带架构师岗位,发现90%的P7… · 2026/9/24 1:00:28
YOLOv5红外车辆检测实战:数据校准、模型改造与部署优化 简介:本资源是一套基于YOLOv5实现的红外车辆检测与识别完整方案,面向计算机视觉初学者、智能交通系统开发者及红外图像处理研究者,解决夜间或低光照环境下车辆实时检测难题。压缩包共128个文件,含24个Python训练/推理脚本… · 2026/9/24 1:00:22
基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程 简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为… · 2026/9/24 0:00:13
1D-CNN时间序列建模实战:从Conv1d原理到工业落地 简介:面向时间序列数据建模的一维卷积神经网络完整实现,适合深度学习入门者及需要快速验证时序模型的研究者,能够从音频、文本、传感器或股价等序列中挖掘局部特征与时间依赖。压缩包体积很小,只有3KB,内含3个Python脚… · 2026/9/24 0:00:26
柔软的L:汉语语流中被忽视的舌肌张力控制 1. 这个“L”不是字母表里的L,而是舌尖上的L最近在几个方言群和语音教学社群里,反复看到有人发一句:“也说字母L:柔软的长舌”。初看以为是英语发音课笔记,点开才发现全是方言爱好者、播音系学生、语言康复师甚至戏曲演… · 2026/9/24 0:00:44