从0到1搭建企业级RAG系统(八·终章):全栈整合与回顾 — LiteRAG 最终形态
前言
从第一篇写下“生产级大模型应用架构”开始,LiteRAG 已经走过了一整个完整的开发周期。八篇文章、数万行代码、无数次调试与重构,这个项目终于从一个雄心勃勃的规划蓝图,落地为一个可以自信展示的完整作品。
回顾第一篇,我曾规划了一个“大而全”的架构:Vue3 前端、多模态支持(PDF/Excel/语音)、用户权限管理、实时语音交互……然而在实际开发中,我逐渐意识到:在有限的时间和硬件资源下,聚焦核心链路的深度远比堆砌功能更有价值。
这篇终章,我将做三件事:
-
对照第一篇的规划,诚实复盘:哪些实现了?哪些放弃了?为什么?
-
展示最终系统全貌:从架构图到技术栈,从核心模块到完整依赖清单。
-
总结与展望:这八篇文章带给我的成长,以及未来可能的方向。
GitHub链接:WuYMGitHub/LiteRAG: 面向边缘端的高效RAG系统,包含Milvus、Redis、Prometheus监控栈。
一、对照第一篇:初衷与现实的诚实复盘
1.1 最初规划 vs 最终实现
| 第一篇中的规划 | 最终实现 | 取舍原因 |
|---|---|---|
| Vue3 + FastAPI 前后端分离 | Gradio 全栈交互界面 | 个人精力有限,Gradio 能快速实现多会话管理、自动标题生成等核心交互 |
| 多模态支持(PDF/Excel/语音) | 纯文本 RAG | 6GB 显存不足以支撑多模态模型,且多模态非 RAG 核心链路 |
| 用户登录、角色权限管理 | 未实现 | 非个人项目的核心需求,实现成本高但展示价值有限 |
| 实时语音交互 | 未实现 | 与核心检索链路无关,属于前端体验层 |
| LangChain 编排 | FastAPI 直连,仅在文档分块等有限场景使用 | LangChain 抽象层过重,调试困难,直接调用更灵活 |
| Qwen-2.5 本地部署 | Qwen3.5-Flash 云端 API | 6GB 显存无法同时容纳本地 LLM + Embedding + Reranker |
| MinIO 对象存储 | Milvus 内置 MinIO 即可 | 独立 MinIO 是过度设计 |
| BGE-Small-EN Embedding | BGE-M3(多语言,1024维) | 中英文混杂场景下,多语言模型语义匹配准确率大幅提升 |
| BGE-Reranker-Base | BGE-Reranker-V2-M3(多语言) | 与 Embedding 同步升级,保证精排阶段跨语言评分准确 |
1.2 超出预期的部分
有些东西是第一篇中没有规划,却在开发过程中自然而然生长出来的:
-
加权 RRF 融合:原计划只是简单的 RRF 融合,但在诊断中发现 BM25 噪音严重干扰向量检索信号,于是自研了可配置权重的加权 RRF 算法,向量检索贡献设为 BM25 的 3 倍。
-
RAGAS 自动化评估闭环:从“感觉系统答得不错”到“Context Recall 0.50 → 0.80”,建立了数据驱动的优化方法论。
-
SQLite 零依赖会话持久化:在不引入 MySQL/PostgreSQL 的前提下,用 Python 标准库自带的 SQLite 实现了会话的双写持久化。
-
全链路可观测性:Prometheus + Grafana 的开箱即用仪表板,让系统状态一目了然。
1.3 为什么“做减法”比“堆功能”更需要勇气
作为一个正在找实习的研一学生,时间是最稀缺的资源。如果把精力分散在 Vue3 前端、多模态解析、权限系统这些“看起来很厉害”的功能上,最终很可能得到一个“什么都有但什么都不精”的半成品。相比之下,聚焦在 RAG 核心链路的深度优化上——从检索算法到模型选型,从评估闭环到系统可靠性——虽然功能列表看起来“少”了,但每一个功能都经得起面试官的深挖。
二、最终系统全貌
2.1 架构总览
text
┌──────────────────────────────────────┐
│ Gradio (UI) │
│ 多会话管理 / 自动标题 / 侧边栏 │
└────────────────┬─────────────────────┘
│
┌────────────────▼─────────────────────┐
│ FastAPI Chat API │
│ /chat /health /metrics │
└────────┬──────────────┬──────────────┘
│ │
┌────────────▼──────┐ ┌────▼─────────────────┐
│ Query Rewriter │ │ Session Manager │
│ (多轮指代消解) │ │ (Redis + SQLite 双写) │
│ Qwen3.5-Flash │ └──────────────────────┘
└────────────┬──────┘
│
┌────────────▼──────────────────────────────┐
│ Hybrid Search (加权 RRF) │
│ ┌─────────────┐ ┌──────────────────────┐│
│ │ Vector 检索 │ │ BM25 关键词检索 ││
│ │ BGE-M3 │ │ Jieba + 12个领域词 ││
│ │ (1024维) │ │ ││
│ └──────┬───────┘ └──────┬───────────────┘│
└─────────┼──────────────────┼────────────────┘
│ │
┌─────────▼──────────────────▼────────────────┐
│ Reranker: BGE-Reranker-V2-M3 │
│ 显存不足 → 自动 CPU 回退 │
└──────────────────────┬──────────────────────┘
│
┌──────────────────────▼──────────────────────┐
│ LLM Service │
│ Qwen3.5-Flash (阿里百炼 API) │
└─────────────────────────────────────────────┘
旁路监控:
FastAPI /metrics → Prometheus → Grafana (LiteRAG Overview)
仪表板自动加载:docker compose up 即可用
2.2 完整技术栈
| 层级 | 技术选型 | 说明 |
|---|---|---|
| API 框架 | FastAPI + Uvicorn | 异步高性能,自带 Swagger 文档 |
| 向量数据库 | Milvus 2.4.23 (Standalone) | IVF_FLAT 索引,COSINE 相似度 |
| Embedding 模型 | BGE-M3 (1024维) | 多语言,本地部署,HuggingFace 离线模式 |
| Reranker 模型 | BGE-Reranker-V2-M3 | 多语言 Cross-Encoder,显存不足自动 CPU 回退 |
| LLM | Qwen3.5-Flash (阿里百炼 API) | OpenAI 兼容接口,按量付费 |
| 分词 | Jieba + 12 个领域自定义词 | 防止专业术语被错误切分 |
| L1 缓存 | Redis 7 (redis-stack-server) | 精确匹配缓存,TTL 3600s |
| L2 缓存 | Milvus (Semantic Cache Collection) | 语义相似度缓存,阈值 0.92 |
| 会话存储 | Redis (热缓存) + SQLite (冷持久化) | 零额外依赖,双写保证 |
| 监控 | Prometheus + Grafana | 预置 LiteRAG Overview 仪表板,自动加载 |
| 容器化 | Docker Compose | 一键启动全部基础服务 |
| 前端 | Gradio 6.x | 多会话管理、自动标题生成、侧边栏 |
| 爬虫 | Crawl4AI + AsyncWebCrawler | 异步并发抓取,自动转 Markdown |
| 评估 | RAGAS | Faithfulness/Answer Relevancy/Context Precision/Context Recall |
| 压测 | Locust | 自定义 RAGUser 模拟真实用户行为 |
2.3 核心功能清单
| 功能 | 状态 | 说明 |
|---|---|---|
| 多轮对话 | ✅ | 查询改写(多轮指代消解)+ LLM 层 history 传入 |
| 混合检索 | ✅ | 向量检索 + BM25 + 加权 RRF 融合 |
| Reranker 精排 | ✅ | BGE-Reranker-V2-M3,GPU/CPU 自适应 |
| 双层缓存 | ✅ | L1 Redis + L2 Milvus 语义缓存 |
| 会话持久化 | ✅ | SQLite + Redis 双写,刷新/重启不丢失 |
| 全链路监控 | ✅ | Prometheus + Grafana 自动加载仪表板 |
| 自动化评估 | ✅ | RAGAS 5 样本评估管线 |
| 知识库管理 | ✅ | Crawl4AI 爬虫 + ingest.py 灌入脚本 |
| 压测脚本 | ✅ | Locust 多用户并发模拟 |
| 健康检查 | ✅ | /health 端点 + Prometheus up 指标 |
三、核心模块代码说明
本节列出项目的关键文件及其职责,帮助读者快速定位代码。
| 文件 | 职责 | 关键技术点 |
|---|---|---|
app/main.py |
FastAPI 入口 | 路由注册、Prometheus 指标暴露、健康检查 |
app/api/v1/endpoints/chat.py |
核心问答端点 | 查询改写按需启用、缓存 Key 会话隔离、加权 RRF 参数传递、LLM 调用时传入 history、问答结束后同步会话历史 |
app/core/retrieval/hybrid_search.py |
混合检索引擎 | Jieba 自定义词表(12个领域词)、加权 RRF 融合(dense_weight=3.0)、BM25 索引缓存、Reranker 可选精排 |
app/core/reranker.py |
重排序服务 | BGE-Reranker-V2-M3 加载、显存检测与 CPU 回退、动态模型加载/释放 |
app/core/embedding.py |
向量编码 | BGE-M3(1024维)、强制离线模式、本地模型路径 |
app/core/query_rewriter.py |
查询改写 | 单轮改写 + 多轮结合历史改写,异常回退原始查询 |
app/core/session_manager.py |
会话管理 | Redis+SQLite 双写、两级查询(Redis优先→SQLite回退→回写Redis)、get_all_sessions、delete_session |
app/core/db.py |
数据库初始化 | SQLite 建表、WAL 模式、自动创建目录 |
app/core/semantic_cache.py |
L2 语义缓存 | Milvus Collection 自动创建/重建、1024 维向量相似度匹配、0.92 阈值 |
app/ui/gradio_app.py |
前端界面 | 多会话管理、自动标题生成、侧边栏动态渲染、demo.load 持久化恢复 |
scripts/ingest.py |
数据灌入 | 文档分块(chunk_size=512)、BGE-M3 向量化、Milvus 批量插入 |
scripts/evaluate_full_fixed.py |
RAGAS 评估 | 5 样本全量评估、LLM+Embedding 评估器 |
scripts/locustfile.py |
压力测试 | RAGUser 模拟多用户并发请求 |
scripts/fetch_articles_*.py |
爬虫脚本 | Crawl4AI 异步抓取、自动保存 Markdown |
monitoring/prometheus.yml |
Prometheus 配置 | 15s 抓取间隔,FastAPI + Milvus 双 target |
monitoring/dashboard.yml |
Grafana 自动加载 | Provisioning 配置,路径指向仪表板目录 |
docker-compose.yml |
容器编排 | Milvus+Etcd+MinIO+Redis+Prometheus+Grafana 全套服务 |
四、关键性能指标
4.1 RAGAS 评估结果
| 指标 | 优化前 | 优化后 | 提升 |
|---|---|---|---|
| Context Recall (召回率) | 0.50 | 0.80 | ↑ 60% |
| Context Precision (精准率) | 0.87 | 0.97 | ↑ 12.3% |
| Faithfulness (忠实度) | 0.70 | 0.81 | ↑ 15.6% |
| Answer Relevancy (相关性) | 0.84 | 0.86 | ↑ 1.6% |
4.2 优化手段回顾
| 优化方向 | 具体手段 | 效果 |
|---|---|---|
| P0 缺陷修复 | 启用查询改写、删除错误降级逻辑、缓存 Key 加入 session 隔离 | 多轮对话可用、缓存不污染 |
| 知识库补盲 | 爬虫补充 8 篇混合检索、Reranker 等基础概念文档 | 评估样本 3、4 从无到有 |
| Embedding 升级 | BGE-Small-EN (384维) → BGE-M3 (1024维) | 中英文跨语言语义匹配大幅提升 |
| Reranker 升级 | BGE-Reranker-Base → BGE-Reranker-V2-M3 | 精排阶段不再误杀英文文档 |
| 分词强化 | Jieba 添加 12 个领域专用词 | BM25 关键词检索恢复精准 |
| 加权 RRF | 向量检索权重设为 BM25 的 3 倍 | 正确信号不再被噪音淹没 |
五、完整依赖清单
以下是项目的核心依赖及其用途(完整列表见 requirements.txt):
| 依赖 | 用途 |
|---|---|
fastapi + uvicorn |
API 框架 + ASGI 服务器 |
pymilvus |
Milvus 向量数据库客户端 |
redis |
Redis 缓存客户端 |
sentence-transformers |
BGE-M3 / BGE-Reranker-V2-M3 模型加载 |
transformers + torch |
HuggingFace 模型推理 |
openai |
LLM API 调用(兼容阿里百炼) |
jieba |
中文分词 |
rank-bm25 |
BM25 关键词检索 |
langchain + langchain-community |
文档分块(RecursiveCharacterTextSplitter, SemanticChunker) |
crawl4ai |
AI 爬虫框架 |
prometheus_fastapi_instrumentator |
FastAPI 指标暴露 |
locust |
性能压测 |
gradio |
前端交互界面 |
datasets + ragas |
RAGAS 自动化评估 |
python-dotenv |
环境变量管理 |
loguru |
日志输出 |
六、部署与运行
6.1 前提条件
-
Python 3.10+ 及虚拟环境
-
Docker 及 Docker Compose
-
阿里百炼 API Key(或其他 OpenAI 兼容 API)
6.2 一键启动
bash
# 1. 克隆项目
git clone https://github.com/yourname/LiteRAG.git
cd LiteRAG
# 2. 配置环境变量
cp .env.example .env
# 编辑 .env,填入 LLM_API_KEY 等信息
# 3. 启动基础设施
docker compose up -d
# 4. 安装依赖并灌入知识库
python -m venv venv && source venv/bin/activate
pip install -r requirements.txt
python scripts/ingest.py
# 5. 启动 API
uvicorn app.main:app --host 0.0.0.0 --port 8000
# 6. 启动前端(另开终端)
python app/ui/gradio_app.py
6.3 访问地址
| 服务 | 地址 |
|---|---|
| 对话界面 | http://localhost:7860 |
| API 文档 | http://localhost:8000/docs |
| 健康检查 | http://localhost:8000/health |
| Prometheus | http://localhost:9090 |
| Grafana | http://localhost:3000 (admin/admin) |
七、总结与展望
7.1 八篇文章的完整回顾
| 篇序 | 主题 | 核心收获 |
|---|---|---|
| 一 | 环境准备与 Milvus 部署 | WSL2 + Docker GPU 穿透、Milvus 单机部署 |
| 二 | Redis、Prometheus、Grafana 整合 | 监控基础设施搭建 |
| 三 | 文档向量化与 AI 爬虫 | 知识库构建、Crawl4AI 实战 |
| 四 | 混合检索、Reranker、双层缓存 | 检索链路打通 |
| 五 | 多轮对话、查询改写、Gradio 前端 | 交互体验闭环 |
| 六 | 性能突围:0.50 → 0.80 | P0 修复 + Embedding/Reranker 升级 + 加权 RRF |
| 七 | 监控闭环 + 会话持久化 | 系统可靠性最后两块拼图 |
| 八 | 全栈整合与回顾 | 对照初心、展示最终形态 |
7.2 个人收获
-
RAG 系统的全链路认知:从文档切分、向量化、检索、精排到生成,每个环节的工程细节都有了深入理解。
-
评估驱动的优化方法论:不靠感觉,用 RAGAS 数据说话,精准定位瓶颈再下手。
-
多语言模型选型经验:中英文混杂场景下 Embedding 和 Reranker 必须选多语言版本。
-
架构取舍能力:知道什么该做,更知道什么不该做。在时间和资源受限下,聚焦核心链路的深度比堆砌功能更有价值。
-
工程化意识:监控、持久化、容器化、文档——这些都是让一个 Demo 变成产品不可或缺的部分。
7.3 后续方向
-
Agent 能力:让系统能调用外部工具,完成多步推理任务。
-
前端优化:用 Vue3 重写一个更专业的 UI。
-
知识图谱增强:结合 GraphRAG,提升长文档推理能力。
-
多租户与权限隔离:支持企业级场景。
-
更轻量的本地 Embedding:探索 ONNX 量化部署,进一步降低显存占用。
写在最后
八篇文章,从“雄心蓝图”到“工程落地”,LiteRAG 见证了我从一个只会“跑 Demo”的学生,成长为一个能独立设计、优化、监控和评估一个完整系统的开发者。
如果说有什么最想分享给读者的心得,那就是:一个项目的价值,不在于你往里面塞了多少功能,而在于你为它解决的那些问题付出了多少思考。
感谢每一位阅读这个系列的朋友。如果你也在入门 RAG 的方向,希望你也能找到一个自己感兴趣的项目,把它做到极致。如果你对我的项目有任何疑问或建议,欢迎在评论区留言,或者在 GitHub 上 Star 和 Fork。
⭐ 如果这个系列对你有帮助,欢迎到我的 GitHub 仓库给个 Star!
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐

所有评论(0)