我把本地文档 RAG 做成了可用系统:Flask + Vue3 + LangChain + FAISS(多知识库 + 流式输出)

我把本地文档 RAG 做成了可用系统:Flask + Vue3 + LangChain + FAISS(多知识库 + 流式输出)

很多 RAG Demo 都停留在"能回答一次问题",但真正要用起来,至少还要解决这几件事:

  • 多个知识库隔离(不同业务、不同团队互不影响)
  • 文档管理(上传、列表、删除、URL 入库)
  • 多轮会话记忆(不仅是检索,还要记住上下文)
  • 流式输出(边生成边展示,减少等待焦虑)

我把这些做成了一个完整项目:docs-rag-chat。

技术栈是 Flask + Vue3 + LangChain + FAISS,后端支持按 app_id 隔离知识库,前端支持实时流式渲染答案。

项目地址:https://github.com/eagle1949/docs-rag-chat


项目图片:

1. 项目结构和整体链路

核心链路可以概括为:

  1. 文档入库:上传文件 / URL 抓取
  2. 文档切分:按 chunk 切成可检索片段
  3. 向量化存储:写入 FAISS
  4. 问答检索:相似召回 + LLM 生成
  5. 会话记忆:摘要 + 最近对话
  6. 流式返回:SSE token 推送到前端

简化架构:

text 复制代码
Vue3 Frontend
  -> Flask RAG API
     -> DocumentLoader (md/txt/pdf/url)
     -> DocumentSplitter (chunk=500, overlap=50)
     -> FAISS VectorStore (Qianfan Embeddings)
     -> ChatOpenAI (Moonshot by default)
     -> SummaryBufferMemory (session level)

2. 多知识库隔离是怎么做的

我没有把所有文档都堆到一个索引里,而是按 app_id 做目录级隔离。

每个 app 独立维护:

  • data/rag/{app_id}/documents(原始文件)
  • data/rag/{app_id}/faiss_index(向量索引)
  • data/rag/{app_id}/documents_meta.json(文档元信息)
  • storage/chat_history/{app_id}(会话记忆文件)

这样做的好处是:

  • 检索准确率更稳(避免跨业务语料干扰)
  • 清理和迁移简单(按 app 维度操作)
  • 未来做权限控制更自然

3. 入库链路:不只支持文件,也支持 URL

文件上传

支持 .md / .txt / .pdf,并做了基础校验:

  • 扩展名校验
  • 文件大小限制(10MB)
  • 上传后写入 app 对应目录

URL 入库

对 http/https 链接执行网页解析,转换为文档再切分入库。

这点非常实用:很多知识都在内部 wiki / 在线文档,不一定是本地文件。


4. 问答策略:检索 + 记忆融合,不是二选一

我在问答链路里做了一个实用取舍:

  • 优先处理"会话型问题"(例如"我叫什么名字"),避免被检索噪声干扰
  • 文档型问题走向量召回(TopK=3)
  • 当检索为空但会话历史存在时,仍允许按历史上下文回答
  • 两边都不足时,明确返回"无法回答",避免幻觉

召回分数用了一个简单映射:

python 复制代码
confidence = 1 / (1 + distance)

只保留 confidence >= 0.2 的片段。


5. SSE 流式返回:用户体验提升最明显的一步

后端提供流式接口:

  • POST /apps/{app_id}/rag/ask/stream

事件协议分三类:

  • token:增量文本
  • done:结束标记 + sources
  • error:异常信息

前端通过 ReadableStream + TextDecoder 按行解析 data:,实时拼接到答案区域。

实际体验是:用户不用等整段生成完才看到内容,感知速度会快很多。


6. 快速启动(本地可跑)

后端

bash 复制代码
cd Backend
uv sync
uv run python -m app.http.app

或直接:

bash 复制代码
cd Backend
run_backend.bat

前端

bash 复制代码
cd frontend
npm install
npm run dev

后端默认 http://127.0.0.1:5000

前端默认 http://127.0.0.1:5173


7. API 示例(按 app_id 隔离)

上传文档

bash 复制代码
curl -X POST "http://127.0.0.1:5000/apps/default/rag/documents/upload" \
  -F "file=@your_doc.md"

URL 入库

bash 复制代码
curl -X POST "http://127.0.0.1:5000/apps/default/rag/url/upload" \
  -H "Content-Type: application/json" \
  -d '{"url":"https://example.com/article"}'

问答(流式)

bash 复制代码
curl -N -X POST "http://127.0.0.1:5000/apps/default/rag/ask/stream" \
  -H "Content-Type: application/json" \
  -d '{"question":"总结这份文档","session_id":"session_001"}'

8. 这个项目适合谁

  • 想做企业内部知识库问答的同学
  • 想做"可维护"RAG,而不只是 demo 的同学
  • 想练一遍"前后端 + 检索 + 会话 + 流式输出"全链路的人

9. 后续计划

  • 混合检索(向量 + BM25)
  • 重排序(Rerank)
  • 可观测性(请求链路、召回质量监控)
  • 鉴权和多用户管理
  • Docker 一键部署

如果你也在做 RAG 项目,欢迎看看这个仓库并提 issue。

如果这篇文章对你有帮助,也欢迎点个 Star 支持一下:

https://github.com/eagle1949/docs-rag-chat

相关推荐
Fox爱分享13 小时前
都问程序员双十一买什么,我的答案一定是这块专业编程显示器
后端·程序员·ai编程
ZzT13 小时前
AI-SDLC 实践 00|让 Coding Agent 参与整个项目周期:AI-SDLC 是什么、为什么要做
ai编程·claude
日日大王学编程14 小时前
deerflow-memory-design-blog
python·langchain·开源
zilingyun202114 小时前
AI 编程工具的尽头,是软件工厂
ai编程
AI日报派送佬15 小时前
2026年11月02日 AI 行业日报|商汤开源 Loop-9B、Pika 发布 H3 Flex 音视频模型、Meta× 傅利叶推出人形机器人 Max
人工智能·微软·开源·音视频·openai·1024程序员节·ai日报
前端精髓15 小时前
动态选择工具
python·langchain
沉默王二16 小时前
真绝了,国产模型 Token 自由了!
人工智能·openai·agent
无责任此方_修行中16 小时前
模型变强了,架构为什么反而要变?——从"折叠 subagent"到"Super-agent"
人工智能·ai编程·deepseek
孔令飞17 小时前
AI 岗位类别、要求、技能及学习路线
云原生·go·ai编程
拆房老料17 小时前
【第四部分:Agentic 智能体设计模式】17. Agent 路由模式详解:从意图识别到动态模型选择
java·设计模式·ai编程·策略模式