Skip to content
qq1069730908Public

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Repository files navigation

DocMind

一个面向中型软件企业内部知识场景的、可迁移的 RAG 检索脚手架。 把文档摄取、权限、版本、混合检索、证据门控、引用校验和评测闭环一次搭好,未来替换业务文档即可复用。

Python 3.11 FastAPI React Qdrant Docker Compose

作者主页:qq1069730908

项目定位

DocMind 不是一个虚构的“已经服务某企业”的产品案例,也不是只展示聊天页面的 Demo。它是我的个人可迁移后端基线:以后遇到企业制度、研发手册、售后知识库、项目文档等具体业务,只需替换数据源、权限配置和模型端点,就能在现有工程骨架上继续开发,避免每次从零重写 RAG 基础设施。

当前项目适合描述为:

核心功能和工程骨架已完成,具备受控试生产基础;尚未通过正式企业生产发布验收。

质量结论和边界均以 项目交接总览 为准。

真实演示场景

仓库提供一个可公开复现的软件企业知识助手场景:使用许可证明确的 PostHog Handbook 作为制度与 SOP 参考语料,模拟员工查询入职、协作、会议、远程办公等内部规则。

这个场景只用于验证工程链路,不冒充真实客户资料、真实员工或生产用户。换成其他企业场景时,核心代码无需重写:

公开/客户授权文档
        |
        v
目录或 Git 快照导入 -> 解析/分块 -> Embedding -> Qdrant
        |
        v
员工问题 -> 混合检索 -> 证据门控 -> 生成答案 -> [S1] 引用校验

导入示例见 scenarios/software-handbook。

为什么这个项目值得看

RAG 主链路可审计

  • Dense + Sparse 混合检索,使用 RRF 融合,再进行 Rerank。
  • 检索结果严格绑定 kb_id 和 PostgreSQL 中的 Active Revision,避免召回错误知识库或失效版本。
  • 无证据时不调用生成模型;最多进行一次受限查询改写,仍无证据则拒答。
  • 生成回答必须带行内 [S1] 形式来源;非法引用会被标记为未验证,而不是静默放行。
  • 文档正文被当作不可信证据,不执行其中的指令,降低 Prompt Injection 风险。

工程基础设施可替换

  • 解析器、存储、向量库、Embedding、Reranker 和 LLM 通过模块边界隔离。
  • 使用 source_key、不可变 Revision、SHA-256 和 source_metadata 保留文档身份与来源追溯。
  • 目录/Git 快照导入支持增量识别新增、变更和待人工确认的删除。
  • Docker Compose 适合单企业单机私有化部署;后续可替换为对象存储、外部身份系统或分布式 Worker。

评测和失败分析是一等能力

  • 提供公开年报数据集、问题集、引用复核队列和检索阶段诊断脚本。
  • 评测结果绑定数据集版本、模型配置和代码版本,历史结果不被覆盖。
  • v0.3 诊断定位出主要损失来自 Reranker Top-K 的文档拥挤,而非简单归因于“模型不够强”。

功能范围

领域 已实现能力
身份认证 本地账号、Argon2 密码散列、短期 JWT、HttpOnly Refresh Cookie、轮换、登录限速、管理员 TOTP 基础能力
权限 System Administrator、Knowledge Base Owner、Contributor、Reader;用户直授和部门继承;最后一个 Owner 保护
文档 PDF、DOCX、PPTX、Markdown、TXT 文本优先解析;流式上传、SHA-256、异步摄取、状态和进度
版本 Revision 不可变;只有成功处理的版本才会成为 Active Revision;失败版本不会替换线上版本
RAG BGE-M3 Dense、BM25 Sparse、Qdrant RRF、BGE Reranker、语义缓存、有界 LangGraph 工作流
对话 同步问答、SSE 流式输出、会话、反馈、来源片段展示
运维 PostgreSQL、Redis、Qdrant、Celery、Alembic、健康检查、审计、备份/恢复脚本
前端 React 18 + TypeScript,覆盖登录、知识库、文档、问答和设置页面

RAG 工作流

flowchart LR
    A[用户问题] --> B[权限过滤]
    B --> C[Dense 检索]
    B --> D[Sparse 检索]
    C --> E[RRF 融合]
    D --> E
    E --> F[Rerank]
    F --> G{证据门控}
    G -- 无证据 --> H[拒答]
    G -- 有证据 --> I{已改写?}
    I -- 否 --> J[最多一次查询改写]
    J --> C
    I -- 是 --> K[受约束生成]
    K --> L[引用校验]
    L --> M[答案 + 来源]
Loading

关键不变量:

  1. 检索范围同时受知识库权限和 Active Revision 约束。
  2. 没有可验证证据时,系统不得生成看似完整的答案。
  3. 查询改写是有界步骤,不会演化成开放式 Agent 循环。
  4. 引用必须指向本次检索结果中的来源,引用失败会降级为未验证来源。

技术架构

flowchart TB
    U[浏览器] --> F[Caddy + React]
    F --> A[FastAPI API]
    A --> P[(PostgreSQL)]
    A --> R[(Redis)]
    A --> Q[(Qdrant)]
    A --> V[/uploads volume/]
    W[Celery Worker] --> P
    W --> R
    W --> Q
    W --> V
    S[Celery Scheduler] --> R
Loading
层 选型
API Python 3.11、FastAPI、Pydantic v2
业务数据 PostgreSQL 15、SQLModel、SQLAlchemy Async、Alembic
异步任务 Celery、Redis DB 0
缓存/会话 Redis DB 1,noeviction
向量检索 Qdrant 1.10、BGE-M3、Jieba + BM25、RRF、BGE Reranker
工作流 LangGraph、LangChain Core、OpenAI-compatible 客户端
解析 PyMuPDF、python-docx、python-pptx
前端 React 18、TypeScript、Vite、TanStack Query、Zustand
入口 Caddy,反向代理、TLS 和安全响应头

快速启动

1. 准备配置

Copy-Item .env.example .env

至少设置数据库密码、32 字符以上的 SECRET_KEY、管理员引导信息,以及实际使用的 LLM、Embedding 和 Reranker 端点。生产 HTTPS 部署还应设置 APP_ENV=production、AUTH_COOKIE_SECURE=true 和正式域名。

2. 启动服务

docker compose up -d --build
docker compose ps

访问 Caddy 暴露的地址:

首次启动会执行 Alembic 迁移并创建引导管理员。确认管理员已创建后,应从 .env 删除 BOOTSTRAP_ADMIN_PASSWORD。

3. 导入演示语料

git clone --depth 1 https://github.com/PostHog/posthog.com.git .data/posthog.com
$env:DOCMIND_ACCESS_TOKEN = "<contributor access token>"
python scripts/import_directory.py --config scenarios/software-handbook/posthog.json --root .data/posthog.com --kb-id <knowledge-base-id> --dry-run

先检查 dry-run 报告,再正式导入。导入器不会自动删除远端文件,只会生成 remove? 待确认项。

验收证据

截至 2026-08-06,当前基线已验证:

门禁 结果
单元测试 52 passed
真实 Qdrant RAG pipeline 1 passed
真实 PostgreSQL/Redis/Qdrant API 集成 29 passed
Alembic 空库迁移 0001 -> 0004 通过
alembic check No new upgrade operations detected
Ruff python -m ruff check app tests scripts 通过
Python 编译检查 compileall 通过
前端构建 npm run build 通过
Compose docker compose config --quiet、API 镜像构建通过

公开评测和历史结果见 evaluation。其中 v0.3 的公开年报集 Recall@5 为 86.99%,无答案正确拒答率为 100%;自动引用支持率为 56.09%,低于正式生产门槛,因此项目不会把自己包装成“已通过企业生产验收”。

本地验证命令

python -m compileall -q app tests migrations
python -m pytest tests/unit -q
python -m pytest tests/integration -q -m integration
npm --prefix frontend run build
docker compose config --quiet
alembic check

集成测试应使用名称以 _test 结尾的独立数据库,避免污染开发或生产数据。

代码地图

app/modules/identity/       用户、部门、认证
app/modules/knowledge/      知识库、授权、文档和版本
app/modules/ingestion/      解析、分块、索引任务
app/modules/retrieval/      混合检索、Rerank、有界工作流、诊断
app/modules/conversation/   会话、问答、缓存、反馈
app/modules/system/         健康、指标、审计、维护
app/infrastructure/         数据库、Redis、Qdrant、存储、AI 客户端
app/workers/                Celery Worker 和 Scheduler
frontend/                   React 应用与 Caddy 镜像
scripts/                    导入、评测、诊断、备份恢复
tests/                      单元测试与真实基础设施集成测试
docs/adr/                   架构决策记录

明确边界

当前版本有意保持轻量,不包含:

  • SaaS 多租户隔离、OIDC/LDAP/Keycloak;
  • Neo4j、GraphRAG、知识图谱、多 Agent 和外部工具执行;
  • Kubernetes、自动故障切换、横向扩展和强制对象存储;
  • 扫描件 OCR、复杂图表理解和机密数据外发的生产保证。

这些不是遗漏,而是单企业单机私有化基线的范围控制。扩展前应先补 ADR、容量测试、安全测试和迁移方案。

项目状态

已实现并验证:核心身份、知识库权限、文档版本、文本摄取、混合检索、有界问答、引用门禁、Docker 基线和主要测试门禁。

已实现但仍需部署验证:部分生产降级、完整审计覆盖、管理员控制台、引用原文重新鉴权、备份加密与恢复演练。

正式发布前必须完成:第二位人工引用复核、v0.4 全量评测、并发性能、干净主机恢复、一版本回退、Prompt Injection 回归和模型供应商数据治理。

文档入口

适合如何介绍

简历或面试中可以这样描述:

独立设计并实现可迁移的单企业 RAG 检索脚手架,覆盖文档版本化摄取、知识库 RBAC、Dense/Sparse 混合检索、Rerank、证据门控、引用校验、SSE 问答和公开数据集评测;通过真实 PostgreSQL/Redis/Qdrant 集成测试验证核心链路,并保留失败样本和质量边界。

不要写成已有真实企业客户、真实用户规模、生产节省成本或正式生产上线,除非后续取得可公开的真实证据。

License

当前仓库尚未声明开源许可证。若公开发布,请先补充许可证和第三方语料归属说明。

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages