[{"data":1,"prerenderedAt":1126},["ShallowReactive",2],{"page-\u002Fblog\u002Ffitness-rag-assistant":3},{"id":4,"title":5,"body":6,"category":1109,"date":1110,"description":1111,"emoji":1112,"extension":1113,"image":1114,"meta":1115,"navigation":1116,"path":1117,"seo":1118,"stem":1119,"tags":1120,"__hash__":1125},"content\u002Fblog\u002Ffitness-rag-assistant.md","健身饮食 RAG 助手",{"type":7,"value":8,"toc":1088},"minimark",[9,14,27,32,36,44,49,52,68,71,74,95,99,102,119,123,127,131,134,142,145,159,162,167,170,173,190,194,198,201,218,222,225,230,237,254,259,262,274,277,288,292,296,307,313,317,324,327,335,338,387,390,393,447,454,457,468,472,479,492,495,502,534,537,600,603,606,614,617,625,629,632,639,642,673,677,680,686,689,700,704,707,726,729,740,743,747,751,754,759,762,779,783,786,807,810,827,830,867,871,877,884,888,891,908,911,915,918,921,943,946,949,963,967,1053,1057,1060,1066,1072,1078,1084],[10,11,13],"h1",{"id":12},"健身饮食-rag-项目实施流程记录","💪 健身饮食 RAG 项目实施流程记录",[15,16,17],"blockquote",{},[18,19,20,21],"p",{},"项目地址：",[22,23,24],"a",{"href":24,"rel":25},"http:\u002F\u002F82.156.184.44:8000\u002F",[26],"nofollow",[28,29,31],"h2",{"id":30},"一项目背景与目标","一、项目背景与目标",[33,34,35],"h3",{"id":35},"项目背景",[18,37,38,39,43],{},"为了更好地理解 RAG（Retrieval-Augmented Generation，检索增强生成）的实际应用，我基于 ",[40,41,42],"code",{},"all-in-rag"," 开源项目，尝试将其改造成一个垂直场景知识库项目，即：",[18,45,46],{},[47,48,5],"strong",{},[18,50,51],{},"该助手的目标是：",[53,54,55,59,62,65],"ul",{},[56,57,58],"li",{},"读取本地健身饮食知识文档",[56,60,61],{},"根据用户输入的问题检索相关内容",[56,63,64],{},"调用大模型生成针对性的饮食建议",[56,66,67],{},"最终提供一个可以在浏览器中使用的可视化问答页面",[33,69,70],{"id":70},"项目目标",[18,72,73],{},"本项目的核心目标包括：",[75,76,77,83,86,89,92],"ol",{},[56,78,79,80,82],{},"跑通 ",[40,81,42],{}," 项目的最小 RAG 示例",[56,84,85],{},"将原始示例改造成\"健身饮食知识库\"场景",[56,87,88],{},"使用本地 Markdown 文档作为知识源",[56,90,91],{},"接入 DeepSeek 模型完成问答生成",[56,93,94],{},"最终通过 Streamlit 搭建浏览器可视化界面",[28,96,98],{"id":97},"二项目整体实施思路","二、项目整体实施思路",[18,100,101],{},"本项目整体分为五个阶段：",[75,103,104,107,110,113,116],{},[56,105,106],{},"环境准备",[56,108,109],{},"原项目理解与最小示例跑通",[56,111,112],{},"健身饮食知识库改造",[56,114,115],{},"DeepSeek 模型接入与调试",[56,117,118],{},"Streamlit UI 页面搭建与验证",[28,120,122],{"id":121},"三详细实施过程","三、详细实施过程",[33,124,126],{"id":125},"第一阶段确定项目方向与方案设计","第一阶段：确定项目方向与方案设计",[128,129,130],"h4",{"id":130},"明确项目方向",[18,132,133],{},"最初的想法是：",[15,135,136],{},[18,137,138,139,141],{},"是否可以基于 ",[40,140,42],{}," 项目搭建一个\"健身人员每天吃什么\"的知识库问答系统？",[18,143,144],{},"经过分析后，确认该场景非常适合 RAG，因为它具有以下特点：",[53,146,147,150,153,156],{},[56,148,149],{},"领域知识相对结构化",[56,151,152],{},"问题重复度高",[56,154,155],{},"可以通过本地文档建立明确知识边界",[56,157,158],{},"检索结果易于验证",[18,160,161],{},"因此最终项目方向确定为：",[18,163,164],{},[47,165,166],{},"基于本地健身饮食文档的 RAG 问答助手",[128,168,169],{"id":169},"明确第一版功能目标",[18,171,172],{},"为了避免一开始做得过于复杂，第一版先只实现：",[53,174,175,178,181,184,187],{},[56,176,177],{},"读取本地健身饮食文档",[56,179,180],{},"支持基础问答",[56,182,183],{},"支持减脂 \u002F 增肌 \u002F 训练前后饮食等主题",[56,185,186],{},"能在终端输出回答",[56,188,189],{},"后续再升级为网页界面",[33,191,193],{"id":192},"第二阶段使用-codex-辅助改造项目","第二阶段：使用 Codex 辅助改造项目",[128,195,197],{"id":196},"引入-codex-辅助开发","引入 Codex 辅助开发",[18,199,200],{},"为了提高项目改造效率，我决定使用 Codex 协助完成以下任务：",[53,202,203,206,209,212,215],{},[56,204,205],{},"阅读并理解仓库结构",[56,207,208],{},"找到最小可运行的 RAG 示例",[56,210,211],{},"设计健身知识库目录结构",[56,213,214],{},"修改示例脚本优先读取健身文档",[56,216,217],{},"帮助完成后续 UI 页面改造",[128,219,221],{"id":220},"codex-首次改造结果","Codex 首次改造结果",[18,223,224],{},"Codex 对项目进行了最小范围改造，主要完成了：",[18,226,227],{},[47,228,229],{},"新增知识文档目录",[18,231,232,233,236],{},"在 ",[40,234,235],{},"data\u002FC1\u002Ffitness\u002F"," 下新增健身知识文档，例如：",[53,238,239,244,249],{},[56,240,241],{},[40,242,243],{},"goals\u002F减脂.md",[56,245,246],{},[40,247,248],{},"goals\u002F增肌.md",[56,250,251],{},[40,252,253],{},"timing\u002F训练前后饮食.md",[18,255,256],{},[47,257,258],{},"修改示例脚本",[18,260,261],{},"修改了：",[53,263,264,269],{},[56,265,266],{},[40,267,268],{},"code\u002FC1\u002F01_langchain_example.py",[56,270,271],{},[40,272,273],{},"code\u002FC1\u002F02_llamaIndex_example.py",[18,275,276],{},"主要逻辑为：",[53,278,279,282,285],{},[56,280,281],{},"优先扫描健身知识目录中的 Markdown 文件",[56,283,284],{},"如果没有新文档则回退到原示例文档",[56,286,287],{},"保留原始 RAG 主流程，尽量少改动结构",[33,289,291],{"id":290},"第三阶段本地环境搭建与依赖安装","第三阶段：本地环境搭建与依赖安装",[128,293,295],{"id":294},"遇到的第一个问题python-版本不兼容","遇到的第一个问题：Python 版本不兼容",[18,297,298,299,302,303,306],{},"在安装项目依赖时，发现当前 Python 版本过高，导致部分包兼容性较差，特别是在安装 ",[40,300,301],{},"chromadb","、",[40,304,305],{},"huggingface-hub"," 等依赖时出现问题。",[18,308,309,310],{},"最终确定采用项目推荐版本：",[47,311,312],{},"Python 3.12.7",[128,314,316],{"id":315},"安装-conda-环境","安装 Conda 环境",[18,318,319,320,323],{},"由于本地没有安装 Conda，因此首先安装了 ",[47,321,322],{},"Miniconda","。",[18,325,326],{},"选择原因：",[53,328,329,332],{},[56,330,331],{},"比完整 Anaconda 更轻量",[56,333,334],{},"更适合本项目这种单独建环境的场景",[128,336,337],{"id":337},"创建项目虚拟环境",[339,340,345],"pre",{"className":341,"code":342,"language":343,"meta":344,"style":344},"language-bash shiki shiki-themes github-light github-dark","conda create -n all-in-rag python=3.12.7 -y\nconda activate all-in-rag\n","bash","",[40,346,347,376],{"__ignoreMap":344},[348,349,352,356,360,364,367,370,373],"span",{"class":350,"line":351},"line",1,[348,353,355],{"class":354},"sScJk","conda",[348,357,359],{"class":358},"sZZnC"," create",[348,361,363],{"class":362},"sj4cs"," -n",[348,365,366],{"class":358}," all-in-rag",[348,368,369],{"class":358}," python=",[348,371,372],{"class":362},"3.12.7",[348,374,375],{"class":362}," -y\n",[348,377,379,381,384],{"class":350,"line":378},2,[348,380,355],{"class":354},[348,382,383],{"class":358}," activate",[348,385,386],{"class":358}," all-in-rag\n",[18,388,389],{},"期间遇到过 Conda ToS 未接受的问题，需先执行相关接受命令，然后重新创建环境。",[128,391,392],{"id":392},"安装项目依赖",[339,394,396],{"className":341,"code":395,"language":343,"meta":344,"style":344},"cd \u002Fd E:\\github\\健身食谱rag项目\\all-in-rag-main\\code\npip install -r requirements.txt\n",[40,397,398,433],{"__ignoreMap":344},[348,399,400,403,406,409,412,415,418,421,424,427,430],{"class":350,"line":351},[348,401,402],{"class":362},"cd",[348,404,405],{"class":358}," \u002Fd",[348,407,408],{"class":358}," E:",[348,410,411],{"class":362},"\\g",[348,413,414],{"class":358},"ithub",[348,416,417],{"class":362},"\\健",[348,419,420],{"class":358},"身食谱rag项目",[348,422,423],{"class":362},"\\a",[348,425,426],{"class":358},"ll-in-rag-main",[348,428,429],{"class":362},"\\c",[348,431,432],{"class":358},"ode\n",[348,434,435,438,441,444],{"class":350,"line":378},[348,436,437],{"class":354},"pip",[348,439,440],{"class":358}," install",[348,442,443],{"class":362}," -r",[348,445,446],{"class":358}," requirements.txt\n",[18,448,449,450,453],{},"在安装过程中遇到大量 ",[40,451,452],{},"huggingface-hub does not provide the extra 'inference'"," 警告，说明依赖解析存在回溯问题。",[18,455,456],{},"后续采用了以下处理方式：",[53,458,459,462,465],{},[56,460,461],{},"升级 pip \u002F setuptools \u002F wheel",[56,463,464],{},"手动补装关键依赖",[56,466,467],{},"边运行边补缺失包",[33,469,471],{"id":470},"第四阶段运行-c1-脚本并逐步补齐依赖","第四阶段：运行 C1 脚本并逐步补齐依赖",[18,473,474,475,478],{},"在成功进入 ",[40,476,477],{},"code\u002FC1"," 目录后，开始运行：",[339,480,482],{"className":341,"code":481,"language":343,"meta":344,"style":344},"python 01_langchain_example.py\n",[40,483,484],{"__ignoreMap":344},[348,485,486,489],{"class":350,"line":351},[348,487,488],{"class":354},"python",[348,490,491],{"class":358}," 01_langchain_example.py\n",[128,493,494],{"id":494},"缺失依赖逐步补装",[18,496,497,498,501],{},"在运行过程中，先后遇到多个 ",[40,499,500],{},"ModuleNotFoundError","，包括：",[53,503,504,509,514,519,524,529],{},[56,505,506],{},[40,507,508],{},"dotenv",[56,510,511],{},[40,512,513],{},"langchain_community",[56,515,516],{},[40,517,518],{},"langchain_huggingface",[56,520,521],{},[40,522,523],{},"langchain_openai",[56,525,526],{},[40,527,528],{},"unstructured",[56,530,531],{},[40,532,533],{},"markdown",[18,535,536],{},"逐步通过以下方式补齐：",[339,538,540],{"className":341,"code":539,"language":343,"meta":344,"style":344},"pip install python-dotenv\npip install langchain-community\npip install langchain-huggingface\npip install langchain-openai\npip install unstructured\npip install markdown\n",[40,541,542,551,560,570,580,590],{"__ignoreMap":344},[348,543,544,546,548],{"class":350,"line":351},[348,545,437],{"class":354},[348,547,440],{"class":358},[348,549,550],{"class":358}," python-dotenv\n",[348,552,553,555,557],{"class":350,"line":378},[348,554,437],{"class":354},[348,556,440],{"class":358},[348,558,559],{"class":358}," langchain-community\n",[348,561,563,565,567],{"class":350,"line":562},3,[348,564,437],{"class":354},[348,566,440],{"class":358},[348,568,569],{"class":358}," langchain-huggingface\n",[348,571,573,575,577],{"class":350,"line":572},4,[348,574,437],{"class":354},[348,576,440],{"class":358},[348,578,579],{"class":358}," langchain-openai\n",[348,581,583,585,587],{"class":350,"line":582},5,[348,584,437],{"class":354},[348,586,440],{"class":358},[348,588,589],{"class":358}," unstructured\n",[348,591,593,595,597],{"class":350,"line":592},6,[348,594,437],{"class":354},[348,596,440],{"class":358},[348,598,599],{"class":358}," markdown\n",[128,601,602],{"id":602},"成功运行到模型调用阶段",[18,604,605],{},"在补齐依赖后，脚本已经可以成功运行到调用大模型阶段，但此时出现了新的问题：",[339,607,612],{"className":608,"code":610,"language":611},[609],"language-text","OpenAIError: The api_key client option must be set ...\n","text",[40,613,610],{"__ignoreMap":344},[18,615,616],{},"这说明：",[53,618,619,622],{},[56,620,621],{},"代码逻辑、检索流程、依赖环境基本没问题",[56,623,624],{},"当前只差模型 API Key 配置",[33,626,628],{"id":627},"第五阶段deepseek-接入与-api-鉴权排查","第五阶段：DeepSeek 接入与 API 鉴权排查",[128,630,631],{"id":631},"模型接入方案确认",[18,633,634,635,638],{},"因为我只申请了 ",[47,636,637],{},"DeepSeek 的 API Key","，所以不能继续使用其他聚合平台的默认配置。",[18,640,641],{},"需要把代码中的 LLM 调用统一改成 DeepSeek 官方接口：",[339,643,646],{"className":644,"code":645,"language":488,"meta":344,"style":344},"language-python shiki shiki-themes github-light github-dark","llm = ChatOpenAI(\n    model=\"deepseek-chat\",\n    api_key=os.getenv(\"DEEPSEEK_API_KEY\"),\n    base_url=\"https:\u002F\u002Fapi.deepseek.com\"\n)\n",[40,647,648,653,658,663,668],{"__ignoreMap":344},[348,649,650],{"class":350,"line":351},[348,651,652],{},"llm = ChatOpenAI(\n",[348,654,655],{"class":350,"line":378},[348,656,657],{},"    model=\"deepseek-chat\",\n",[348,659,660],{"class":350,"line":562},[348,661,662],{},"    api_key=os.getenv(\"DEEPSEEK_API_KEY\"),\n",[348,664,665],{"class":350,"line":572},[348,666,667],{},"    base_url=\"https:\u002F\u002Fapi.deepseek.com\"\n",[348,669,670],{"class":350,"line":582},[348,671,672],{},")\n",[128,674,676],{"id":675},"_401-鉴权错误排查","401 鉴权错误排查",[18,678,679],{},"在设置了 Key 之后，运行脚本时出现了：",[339,681,684],{"className":682,"code":683,"language":611},[609],"401 Invalid token\ntype: Aihubmix_api_error\n",[40,685,683],{"__ignoreMap":344},[18,687,688],{},"排查后发现：",[53,690,691,694,697],{},[56,692,693],{},"当前脚本请求并没有完全切换到 DeepSeek 官方接口",[56,695,696],{},"仍然可能存在 AIHubMix 之类聚合接口残留配置",[56,698,699],{},"导致 DeepSeek Key 与目标接口不匹配，从而产生 401",[128,701,703],{"id":702},"成功打通-deepseek-调用","成功打通 DeepSeek 调用",[18,705,706],{},"修正之后，重新在终端设置环境变量：",[339,708,710],{"className":341,"code":709,"language":343,"meta":344,"style":344},"set DEEPSEEK_API_KEY=你的key\npython 01_langchain_example.py\n",[40,711,712,720],{"__ignoreMap":344},[348,713,714,717],{"class":350,"line":351},[348,715,716],{"class":362},"set",[348,718,719],{"class":358}," DEEPSEEK_API_KEY=你的key\n",[348,721,722,724],{"class":350,"line":378},[348,723,488],{"class":354},[348,725,491],{"class":358},[18,727,728],{},"此时项目已经能够：",[53,730,731,734,737],{},[56,732,733],{},"成功读取健身知识文档",[56,735,736],{},"成功检索相关内容",[56,738,739],{},"成功调用 DeepSeek 生成问答结果",[18,741,742],{},"说明终端版 RAG 链路已跑通。",[33,744,746],{"id":745},"第六阶段构建-streamlit-可视化页面","第六阶段：构建 Streamlit 可视化页面",[128,748,750],{"id":749},"决定升级为浏览器-ui","决定升级为浏览器 UI",[18,752,753],{},"在终端版跑通后，为了更方便验证和展示效果，决定继续升级项目，目标是：",[18,755,756],{},[47,757,758],{},"将终端版升级为 Streamlit 页面版",[18,760,761],{},"主要需求包括：",[53,763,764,767,770,773,776],{},[56,765,766],{},"浏览器输入问题",[56,768,769],{},"点击按钮提交",[56,771,772],{},"展示模型回答",[56,774,775],{},"展示检索到的来源文档片段",[56,777,778],{},"保留原来的终端脚本能力",[128,780,782],{"id":781},"使用-codex-搭建-streamlit-页面","使用 Codex 搭建 Streamlit 页面",[18,784,785],{},"我让 Codex 完成以下任务：",[53,787,788,795,801,804],{},[56,789,790,791,794],{},"抽取 ",[40,792,793],{},"01_langchain_example.py"," 中的核心问答逻辑",[56,796,797,798],{},"新建 ",[40,799,800],{},"app.py",[56,802,803],{},"构建最小可用的 Streamlit 页面",[56,805,806],{},"复用当前 DeepSeek 配置与健身知识库读取逻辑",[128,808,809],{"id":809},"启动页面时的路径问题",[18,811,812,813,815,816,819,820,823,824,826],{},"最初在 ",[40,814,477],{}," 目录执行 ",[40,817,818],{},"streamlit run app.py"," 报错 ",[40,821,822],{},"File does not exist: app.py","，原因是 ",[40,825,800],{}," 被创建在项目根目录。",[18,828,829],{},"正确做法是：",[339,831,833],{"className":341,"code":832,"language":343,"meta":344,"style":344},"cd \u002Fd E:\\github\\健身食谱rag项目\\all-in-rag-main\nstreamlit run app.py\n",[40,834,835,856],{"__ignoreMap":344},[348,836,837,839,841,843,845,847,849,851,853],{"class":350,"line":351},[348,838,402],{"class":362},[348,840,405],{"class":358},[348,842,408],{"class":358},[348,844,411],{"class":362},[348,846,414],{"class":358},[348,848,417],{"class":362},[348,850,420],{"class":358},[348,852,423],{"class":362},[348,854,855],{"class":358},"ll-in-rag-main\n",[348,857,858,861,864],{"class":350,"line":378},[348,859,860],{"class":354},"streamlit",[348,862,863],{"class":358}," run",[348,865,866],{"class":358}," app.py\n",[128,868,870],{"id":869},"streamlit-环境不一致问题","Streamlit 环境不一致问题",[18,872,873,874,876],{},"启动 UI 页面后，前端提示没有 ",[40,875,513],{}," 模块。",[18,878,879,880,883],{},"解决方式：使用 ",[40,881,882],{},"python -m streamlit run app.py"," 确保 Streamlit 走当前环境。",[128,885,887],{"id":886},"streamlit-页面成功呈现","Streamlit 页面成功呈现",[18,889,890],{},"最终，页面成功运行，呈现效果包括：",[53,892,893,896,899,902,905],{},[56,894,895],{},"页面标题：健身饮食 RAG 助手",[56,897,898],{},"输入框",[56,900,901],{},"提交按钮",[56,903,904],{},"问答显示",[56,906,907],{},"可视化交互方式",[18,909,910],{},"至此，项目从终端版成功升级为浏览器可访问的可视化问答系统。",[28,912,914],{"id":913},"四项目最终成果","四、项目最终成果",[33,916,917],{"id":917},"已完成功能",[18,919,920],{},"本项目最终完成了以下目标：",[53,922,923,929,932,934,937,940],{},[56,924,925,926,928],{},"成功基于 ",[40,927,42],{}," 搭建本地 RAG 应用",[56,930,931],{},"成功将知识库改造成健身饮食场景",[56,933,88],{},[56,935,936],{},"使用 DeepSeek 官方接口作为 LLM",[56,938,939],{},"成功跑通终端问答版本",[56,941,942],{},"成功搭建 Streamlit 浏览器交互页面",[33,944,945],{"id":945},"当前场景示例",[18,947,948],{},"可支持的问题示例包括：",[53,950,951,954,957,960],{},[56,952,953],{},"减脂早餐怎么安排？",[56,955,956],{},"增肌训练后吃什么？",[56,958,959],{},"训练前 1 到 2 小时适合吃什么？",[56,961,962],{},"减脂期一天三餐如何分配？",[28,964,966],{"id":965},"五项目中遇到的主要问题与解决办法","五、项目中遇到的主要问题与解决办法",[968,969,970,983],"table",{},[971,972,973],"thead",{},[974,975,976,980],"tr",{},[977,978,979],"th",{},"问题",[977,981,982],{},"解决",[984,985,986,995,1003,1011,1019,1027,1035,1043],"tbody",{},[974,987,988,992],{},[989,990,991],"td",{},"Python 版本兼容问题",[989,993,994],{},"改用 Python 3.12.7，通过 Conda 新建独立环境",[974,996,997,1000],{},[989,998,999],{},"Conda 未安装",[989,1001,1002],{},"安装 Miniconda",[974,1004,1005,1008],{},[989,1006,1007],{},"依赖回溯问题",[989,1009,1010],{},"升级基础工具，逐步补装依赖",[974,1012,1013,1016],{},[989,1014,1015],{},"缺少多个模块",[989,1017,1018],{},"逐步补装 python-dotenv、langchain 系列等",[974,1020,1021,1024],{},[989,1022,1023],{},"API Key 未配置",[989,1025,1026],{},"设置环境变量",[974,1028,1029,1032],{},[989,1030,1031],{},"401 Invalid token",[989,1033,1034],{},"确认使用 DeepSeek 官方接口",[974,1036,1037,1040],{},[989,1038,1039],{},"Streamlit 找不到 app.py",[989,1041,1042],{},"回到项目根目录执行",[974,1044,1045,1048],{},[989,1046,1047],{},"Streamlit 缺模块",[989,1049,1050,1051],{},"使用 ",[40,1052,882],{},[28,1054,1056],{"id":1055},"六项目经验总结","六、项目经验总结",[18,1058,1059],{},"通过本次项目实践，我对 RAG 的理解不再停留在概念层面，而是完成了一次从\"教程项目\"到\"垂直场景问答应用\"的完整落地过程。",[18,1061,1062,1065],{},[47,1063,1064],{},"对 RAG 链路有了更直观的理解","：我实际经历了文档准备 → 文档加载 → 文本切分 → 向量化 → 检索 → 生成回答 → UI 展示的全过程。",[18,1067,1068,1071],{},[47,1069,1070],{},"学会了围绕具体场景构建知识库","：相比通用问答，健身饮食属于更容易结构化的场景。",[18,1073,1074,1077],{},[47,1075,1076],{},"学会了使用 Codex 进行辅助开发","：阅读仓库、最小改造、接入 DeepSeek、搭建 Streamlit 页面。",[18,1079,1080,1083],{},[47,1081,1082],{},"对 Python 环境与依赖管理有了更深理解","：Python 版本兼容、Conda 环境切换、pip 依赖安装、Streamlit 与 Python 解释器不一致等问题。",[1085,1086,1087],"style",{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}",{"title":344,"searchDepth":378,"depth":378,"links":1089},[1090,1094,1095,1103,1107,1108],{"id":30,"depth":378,"text":31,"children":1091},[1092,1093],{"id":35,"depth":562,"text":35},{"id":70,"depth":562,"text":70},{"id":97,"depth":378,"text":98},{"id":121,"depth":378,"text":122,"children":1096},[1097,1098,1099,1100,1101,1102],{"id":125,"depth":562,"text":126},{"id":192,"depth":562,"text":193},{"id":290,"depth":562,"text":291},{"id":470,"depth":562,"text":471},{"id":627,"depth":562,"text":628},{"id":745,"depth":562,"text":746},{"id":913,"depth":378,"text":914,"children":1104},[1105,1106],{"id":917,"depth":562,"text":917},{"id":945,"depth":562,"text":945},{"id":965,"depth":378,"text":966},{"id":1055,"depth":378,"text":1056},"项目实践","2025-06-15","基于 all-in-rag 开源项目，将其改造成一个垂直场景知识库的健身饮食问答助手","💪","md","https:\u002F\u002Ftrae-api-cn.mchost.guru\u002Fapi\u002Fide\u002Fv1\u002Ftext_to_image?prompt=Modern%20flat%20illustration%20of%20fitness%20and%20nutrition%20concept%2C%20dumbbells%20healthy%20food%20bowl%20and%20protein%20shake%20as%20floating%20elements%2C%20dark%20navy%20background%20with%20vibrant%20purple%20gradient%20glow%2C%20minimalist%20tech%20style%2C%20no%20text&image_size=landscape_16_9",{},true,"\u002Fblog\u002Ffitness-rag-assistant",{"title":5,"description":1111},"blog\u002Ffitness-rag-assistant",[1121,1122,1123,1124],"RAG","AI","Python","Streamlit","xK6VauuKF2UujQD7U6J6Y0x2XT-JuRGeDjxgMHRf3o8",1791776027007]