💪 健身饮食 RAG 项目实施流程记录

项目地址:http://82.156.184.44:8000/

一、项目背景与目标

项目背景

为了更好地理解 RAG(Retrieval-Augmented Generation,检索增强生成)的实际应用,我基于 all-in-rag 开源项目,尝试将其改造成一个垂直场景知识库项目,即:

健身饮食 RAG 助手

该助手的目标是:

  • 读取本地健身饮食知识文档
  • 根据用户输入的问题检索相关内容
  • 调用大模型生成针对性的饮食建议
  • 最终提供一个可以在浏览器中使用的可视化问答页面

项目目标

本项目的核心目标包括:

  1. 跑通 all-in-rag 项目的最小 RAG 示例
  2. 将原始示例改造成"健身饮食知识库"场景
  3. 使用本地 Markdown 文档作为知识源
  4. 接入 DeepSeek 模型完成问答生成
  5. 最终通过 Streamlit 搭建浏览器可视化界面

二、项目整体实施思路

本项目整体分为五个阶段:

  1. 环境准备
  2. 原项目理解与最小示例跑通
  3. 健身饮食知识库改造
  4. DeepSeek 模型接入与调试
  5. Streamlit UI 页面搭建与验证

三、详细实施过程

第一阶段:确定项目方向与方案设计

明确项目方向

最初的想法是:

是否可以基于 all-in-rag 项目搭建一个"健身人员每天吃什么"的知识库问答系统?

经过分析后,确认该场景非常适合 RAG,因为它具有以下特点:

  • 领域知识相对结构化
  • 问题重复度高
  • 可以通过本地文档建立明确知识边界
  • 检索结果易于验证

因此最终项目方向确定为:

基于本地健身饮食文档的 RAG 问答助手

明确第一版功能目标

为了避免一开始做得过于复杂,第一版先只实现:

  • 读取本地健身饮食文档
  • 支持基础问答
  • 支持减脂 / 增肌 / 训练前后饮食等主题
  • 能在终端输出回答
  • 后续再升级为网页界面

第二阶段:使用 Codex 辅助改造项目

引入 Codex 辅助开发

为了提高项目改造效率,我决定使用 Codex 协助完成以下任务:

  • 阅读并理解仓库结构
  • 找到最小可运行的 RAG 示例
  • 设计健身知识库目录结构
  • 修改示例脚本优先读取健身文档
  • 帮助完成后续 UI 页面改造

Codex 首次改造结果

Codex 对项目进行了最小范围改造,主要完成了:

新增知识文档目录

在 data/C1/fitness/ 下新增健身知识文档,例如:

  • goals/减脂.md
  • goals/增肌.md
  • timing/训练前后饮食.md

修改示例脚本

修改了:

  • code/C1/01_langchain_example.py
  • code/C1/02_llamaIndex_example.py

主要逻辑为:

  • 优先扫描健身知识目录中的 Markdown 文件
  • 如果没有新文档则回退到原示例文档
  • 保留原始 RAG 主流程,尽量少改动结构

第三阶段:本地环境搭建与依赖安装

遇到的第一个问题:Python 版本不兼容

在安装项目依赖时,发现当前 Python 版本过高,导致部分包兼容性较差,特别是在安装 chromadb、huggingface-hub 等依赖时出现问题。

最终确定采用项目推荐版本:Python 3.12.7

安装 Conda 环境

由于本地没有安装 Conda,因此首先安装了 Miniconda。

选择原因:

  • 比完整 Anaconda 更轻量
  • 更适合本项目这种单独建环境的场景

创建项目虚拟环境

conda create -n all-in-rag python=3.12.7 -y
conda activate all-in-rag

期间遇到过 Conda ToS 未接受的问题,需先执行相关接受命令,然后重新创建环境。

安装项目依赖

cd /d E:\github\健身食谱rag项目\all-in-rag-main\code
pip install -r requirements.txt

在安装过程中遇到大量 huggingface-hub does not provide the extra 'inference' 警告,说明依赖解析存在回溯问题。

后续采用了以下处理方式:

  • 升级 pip / setuptools / wheel
  • 手动补装关键依赖
  • 边运行边补缺失包

第四阶段:运行 C1 脚本并逐步补齐依赖

在成功进入 code/C1 目录后,开始运行:

python 01_langchain_example.py

缺失依赖逐步补装

在运行过程中,先后遇到多个 ModuleNotFoundError,包括:

  • dotenv
  • langchain_community
  • langchain_huggingface
  • langchain_openai
  • unstructured
  • markdown

逐步通过以下方式补齐:

pip install python-dotenv
pip install langchain-community
pip install langchain-huggingface
pip install langchain-openai
pip install unstructured
pip install markdown

成功运行到模型调用阶段

在补齐依赖后,脚本已经可以成功运行到调用大模型阶段,但此时出现了新的问题:

OpenAIError: The api_key client option must be set ...

这说明:

  • 代码逻辑、检索流程、依赖环境基本没问题
  • 当前只差模型 API Key 配置

第五阶段:DeepSeek 接入与 API 鉴权排查

模型接入方案确认

因为我只申请了 DeepSeek 的 API Key,所以不能继续使用其他聚合平台的默认配置。

需要把代码中的 LLM 调用统一改成 DeepSeek 官方接口:

llm = ChatOpenAI(
    model="deepseek-chat",
    api_key=os.getenv("DEEPSEEK_API_KEY"),
    base_url="https://api.deepseek.com"
)

401 鉴权错误排查

在设置了 Key 之后,运行脚本时出现了:

401 Invalid token
type: Aihubmix_api_error

排查后发现:

  • 当前脚本请求并没有完全切换到 DeepSeek 官方接口
  • 仍然可能存在 AIHubMix 之类聚合接口残留配置
  • 导致 DeepSeek Key 与目标接口不匹配,从而产生 401

成功打通 DeepSeek 调用

修正之后,重新在终端设置环境变量:

set DEEPSEEK_API_KEY=你的key
python 01_langchain_example.py

此时项目已经能够:

  • 成功读取健身知识文档
  • 成功检索相关内容
  • 成功调用 DeepSeek 生成问答结果

说明终端版 RAG 链路已跑通。

第六阶段:构建 Streamlit 可视化页面

决定升级为浏览器 UI

在终端版跑通后,为了更方便验证和展示效果,决定继续升级项目,目标是:

将终端版升级为 Streamlit 页面版

主要需求包括:

  • 浏览器输入问题
  • 点击按钮提交
  • 展示模型回答
  • 展示检索到的来源文档片段
  • 保留原来的终端脚本能力

使用 Codex 搭建 Streamlit 页面

我让 Codex 完成以下任务:

  • 抽取 01_langchain_example.py 中的核心问答逻辑
  • 新建 app.py
  • 构建最小可用的 Streamlit 页面
  • 复用当前 DeepSeek 配置与健身知识库读取逻辑

启动页面时的路径问题

最初在 code/C1 目录执行 streamlit run app.py 报错 File does not exist: app.py,原因是 app.py 被创建在项目根目录。

正确做法是:

cd /d E:\github\健身食谱rag项目\all-in-rag-main
streamlit run app.py

Streamlit 环境不一致问题

启动 UI 页面后,前端提示没有 langchain_community 模块。

解决方式:使用 python -m streamlit run app.py 确保 Streamlit 走当前环境。

Streamlit 页面成功呈现

最终,页面成功运行,呈现效果包括:

  • 页面标题:健身饮食 RAG 助手
  • 输入框
  • 提交按钮
  • 问答显示
  • 可视化交互方式

至此,项目从终端版成功升级为浏览器可访问的可视化问答系统。

四、项目最终成果

已完成功能

本项目最终完成了以下目标:

  • 成功基于 all-in-rag 搭建本地 RAG 应用
  • 成功将知识库改造成健身饮食场景
  • 使用本地 Markdown 文档作为知识源
  • 使用 DeepSeek 官方接口作为 LLM
  • 成功跑通终端问答版本
  • 成功搭建 Streamlit 浏览器交互页面

当前场景示例

可支持的问题示例包括:

  • 减脂早餐怎么安排?
  • 增肌训练后吃什么?
  • 训练前 1 到 2 小时适合吃什么?
  • 减脂期一天三餐如何分配?

五、项目中遇到的主要问题与解决办法

问题解决
Python 版本兼容问题改用 Python 3.12.7,通过 Conda 新建独立环境
Conda 未安装安装 Miniconda
依赖回溯问题升级基础工具,逐步补装依赖
缺少多个模块逐步补装 python-dotenv、langchain 系列等
API Key 未配置设置环境变量
401 Invalid token确认使用 DeepSeek 官方接口
Streamlit 找不到 app.py回到项目根目录执行
Streamlit 缺模块使用 python -m streamlit run app.py

六、项目经验总结

通过本次项目实践,我对 RAG 的理解不再停留在概念层面,而是完成了一次从"教程项目"到"垂直场景问答应用"的完整落地过程。

对 RAG 链路有了更直观的理解:我实际经历了文档准备 → 文档加载 → 文本切分 → 向量化 → 检索 → 生成回答 → UI 展示的全过程。

学会了围绕具体场景构建知识库:相比通用问答,健身饮食属于更容易结构化的场景。

学会了使用 Codex 进行辅助开发:阅读仓库、最小改造、接入 DeepSeek、搭建 Streamlit 页面。

对 Python 环境与依赖管理有了更深理解:Python 版本兼容、Conda 环境切换、pip 依赖安装、Streamlit 与 Python 解释器不一致等问题。