带评测体系的 RAG + Agent 知识库问答平台
上传文档即可问答的 RAG 平台:标题感知分块 + BM25/向量混合检索 + Rerank + SSE 流式回答,自带 52 题评测体系与 Agent 工具调用。
Role 独立开发(需求 / 架构 / 后端 / 前端 / 评测 / 部署)
上传任意文档(txt / md / pdf / docx),系统自动完成「解析 → 标题感知分块 → 向量化 → BM25 + 向量混合检索 → Rerank 精排 → SSE 流式回答」,回答带可点击的引用出处。
支持追问改写、知识库外问题的 strict / chat 双模式兜底,以及 Agent 工具调用(计算器 / 维基百科搜索)。项目自带 52 条测试集 + 20 篇语料的评测体系,用真实数据驱动每一次优化。
私有文档(课程笔记、面试笔记、项目手册)分散,通用大模型无法直接基于它们作答,直接提问既容易幻觉又无法溯源。
常见的「调个 API」问答 Demo 缺三件东西:回答不可溯源、效果没有量化评测、工程不可测试与部署。
RAG 链路长(分块 → 嵌入 → 检索 → 重排 → 生成),任何一环出问题肉眼都发现不了;没有评测,「优化」就只是玄学。
做一个可对话、可溯源、能执行任务的文档助手,而不只是会聊天的壳。
效果必须可量化:自建测试集与指标(检索命中率 / 忠实度 / 相关性),每次优化都有前后对比数据。
工程可交付:单元测试、静态检查、CI、Docker 部署、可演示;无 API Key 时也能离线跑通全链路。
后端提供文档服务与聊天服务两条链路:文档服务负责上传、解析与入库;聊天服务负责检索与生成,两者共用同一套存储抽象层。
检索环节没有直接依赖现成框架,而是自己实现 BM25 与向量的加权融合并接一层 Rerank,使每一层的原理与权重都可以解释和调整。
另建一套离线评测服务:52 条测试集 × 4 档检索配置 + LLM-as-Judge 生成质量打分,报告落盘到 docs/eval/,让每次改动都有可比数据。
浏览器(React + Vite,通过 SSE 接收流式 token)→ FastAPI 应用层(路由 / 鉴权 / 令牌桶限流 / JSON 结构化日志)→ 文档服务(上传 → 解析 → 标题感知分块 800 字符 / 100 重叠 → Embedding → 入库)、聊天服务(查询改写 → 混合检索 → Rerank → 组装 Prompt → 流式生成 → 引用溯源)、Agent 执行器(Function Calling 循环,工具注册表 + max_turns 防死循环)与存储抽象层(向量存储接口:内存实现,可换 FAISS / pgvector / Milvus);离线评测服务独立于请求链路运行。
不依赖现成检索框架,自己实现 BM25 + 向量加权融合与 Rerank,每一层的原理与权重都能解释和调整。
MVP 用内存实现,业务代码不感知具体存储,演进到 FAISS / pgvector / Milvus 只需要替换实现。
52 条测试集 + 20 篇语料(85 块)、四档配置对比 + LLM-as-Judge 判分,报告可复现。
Embedding(真实 API / 离线 hash)、分词(jieba / 零依赖)、Rerank(自研 / API)均可切换。
统一工具注册(name / description / schema / handler)+ 流式 tool_call 聚合 + max_turns 防死循环。
127 个后端用例(全离线)+ 19 个前端用例、Ruff 0 告警、CI、Docker + Nginx(SSE 关闭缓冲)。
检索实现方式
Chose 自研轻量 BM25 + 向量混合检索 over 直接引入现成检索框架 — 跨主题漏检需要 BM25 的精确命中能力,自研后每一层权重都可解释、可调整。
Cost: 检索层由自己维护,需要自己承担调参与正确性验证。
向量存储方案
Chose 内存实现 + 存储接口抽象 over 一开始就引入 FAISS / pgvector / Milvus — MVP 阶段数据量小,不值得为它引入额外基础设施。
回答模式
Chose strict / chat 双模式按相关度阈值自动分流 over 只保留一种回答模式 — 严格模式防幻觉,但未命中时用户体验差;放开模式能兜底,但必须明确告知依据来源。
检索命中率(top-1,52 题 / 20 篇语料 / 85 块,bge-m3 真实嵌入):纯向量 96.2% → 混合检索 98.1%。
生成质量(LLM-as-Judge,DeepSeek 判分,52 题):引用命中 100%、忠实度 0.99、相关性 0.95。
性能与成本(实测均值):单次问答约 1.9–2.3 s,约 ¥0.0034–0.004 / 次。
质量门禁:后端 pytest 127 用例全绿(全离线)、前端 vitest 19 用例通过、Ruff 0 告警、CI(lint + test + build)。
评测产出:抓到并修复「引用截断误判」(忠实度 0.25 → 0.99)与「Transformer 跨主题漏检」两个真实问题;同时如实记录 2 道所有配置都漏的题,主动暴露方案边界。
在线系统:https://docwise.myiskg.com/ (自 2026-09-24 起启用 HTTPS,证书由 Let's Encrypt 签发并自动续期)。
交付物:Docker Compose(Nginx + FastAPI)部署方案与部署指南、3 分钟演示脚本、24 问面试题库、投递前检查清单。
评测链路本身也需要被验证:忠实度异常时,先怀疑评测口径(引用预览被截断污染了 Judge 上下文),再怀疑模型能力。
方案边界要主动暴露:把「所有配置都漏」的题目如实记录,比只展示成功案例更能说明方案的真实适用范围。
离线可运行是可验证性的前提:把 embedding、分词与 Rerank 都做成可插拔,CI 才能不依赖外部 API 稳定跑完整链路。
![DocWise 深色主题问答界面:左侧会话列表,右侧为基于知识库的回答,带 [1] 引用标记与展开的引用原文片段](/images/projects/docwise/01-chat-answer.png)
