💪 健身饮食 RAG 项目实施流程记录
一、项目背景与目标
项目背景
为了更好地理解 RAG(Retrieval-Augmented Generation,检索增强生成)的实际应用,我基于 all-in-rag 开源项目,尝试将其改造成一个垂直场景知识库项目,即:
健身饮食 RAG 助手
该助手的目标是:
- 读取本地健身饮食知识文档
- 根据用户输入的问题检索相关内容
- 调用大模型生成针对性的饮食建议
- 最终提供一个可以在浏览器中使用的可视化问答页面
项目目标
本项目的核心目标包括:
- 跑通
all-in-rag项目的最小 RAG 示例 - 将原始示例改造成"健身饮食知识库"场景
- 使用本地 Markdown 文档作为知识源
- 接入 DeepSeek 模型完成问答生成
- 最终通过 Streamlit 搭建浏览器可视化界面
二、项目整体实施思路
本项目整体分为五个阶段:
- 环境准备
- 原项目理解与最小示例跑通
- 健身饮食知识库改造
- DeepSeek 模型接入与调试
- Streamlit UI 页面搭建与验证
三、详细实施过程
第一阶段:确定项目方向与方案设计
明确项目方向
最初的想法是:
是否可以基于
all-in-rag项目搭建一个"健身人员每天吃什么"的知识库问答系统?
经过分析后,确认该场景非常适合 RAG,因为它具有以下特点:
- 领域知识相对结构化
- 问题重复度高
- 可以通过本地文档建立明确知识边界
- 检索结果易于验证
因此最终项目方向确定为:
基于本地健身饮食文档的 RAG 问答助手
明确第一版功能目标
为了避免一开始做得过于复杂,第一版先只实现:
- 读取本地健身饮食文档
- 支持基础问答
- 支持减脂 / 增肌 / 训练前后饮食等主题
- 能在终端输出回答
- 后续再升级为网页界面
第二阶段:使用 Codex 辅助改造项目
引入 Codex 辅助开发
为了提高项目改造效率,我决定使用 Codex 协助完成以下任务:
- 阅读并理解仓库结构
- 找到最小可运行的 RAG 示例
- 设计健身知识库目录结构
- 修改示例脚本优先读取健身文档
- 帮助完成后续 UI 页面改造
Codex 首次改造结果
Codex 对项目进行了最小范围改造,主要完成了:
新增知识文档目录
在 data/C1/fitness/ 下新增健身知识文档,例如:
goals/减脂.mdgoals/增肌.mdtiming/训练前后饮食.md
修改示例脚本
修改了:
code/C1/01_langchain_example.pycode/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,包括:
dotenvlangchain_communitylangchain_huggingfacelangchain_openaiunstructuredmarkdown
逐步通过以下方式补齐:
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 解释器不一致等问题。