系统架构

mindvaults 采用经典的三层 Web 架构,前端 Next.js → 后端 FastAPI → 数据层 PostgreSQL/pgvector + Redis,AI 引擎层可选本地 Ollama 或云端 API。

┌─────────────────────────────────────────────────────────┐
│                     🖥️ 用户浏览器                         │
│                  http://localhost:80                      │
└─────────────────────┬───────────────────────────────────┘
                      │
                      ▼
┌─────────────────────────────────────────────────────────┐
│               🔀 Nginx :80 (反向代理)                     │
│         / → Frontend :3000   /api/* → Backend :8000     │
│         SSE 流式免缓冲 (proxy_buffering off)              │
└─────────────────────┬───────────────────────────────────┘
                      │
        ┌─────────────┴──────────────┐
        ▼                            ▼
┌──────────────────┐    ┌──────────────────────────────────┐
│ 🎨 Frontend      │    │ ⚙️ Backend :8000                  │
│ Next.js 14       │    │ FastAPI + Uvicorn                 │
│ App Router       │    │                                    │
│ TailwindCSS      │    │ ┌────────────────────────────┐   │
│ TypeScript       │    │ │ RAG Engine                  │   │
└──────────────────┘    │ │ • 意图识别                   │   │
                         │ │ • pgvector HNSW 向量检索    │   │
                         │ │ • BCE Reranker 精排        │   │
                         │ │ • LLM 流式推理             │   │
                         │ └────────────────────────────┘   │
                         │                                    │
                         │ ┌────────────────────────────┐   │
                         │ │ 文档摄入管道                 │   │
                         │ │ Parser → Chunker →          │   │
                         │ │ Embedder → Ingester         │   │
                         │ └────────────────────────────┘   │
                         └──────────┬───────────────────────┘
                                    │
            ┌───────────────────────┼───────────────────────┐
            ▼                       ▼                       ▼
┌──────────────────┐  ┌──────────────────┐  ┌──────────────────┐
│ 💾 PostgreSQL    │  │ 📦 Redis :6379   │  │ 🧠 Ollama        │
│ pgvector :5432   │  │ (全栈模式)        │  │ :11434 (全栈模式) │
│                  │  │                   │  │                   │
│ • kb_documents   │  │ • 检索缓存        │  │ • LLM 推理        │
│ • kb_chunks      │  │ • 限流计数器      │  │ • Embedding 向量化│
│ • kb_sessions    │  │ • 会话状态        │  │                   │
│ • kb_qa_records  │  │                   │  │                   │
│ • kb_config      │  │                   │  │                   │
└──────────────────┘  └──────────────────┘  └──────────────────┘

RAG 检索流水线

第一级:向量粗排 (HNSW)

用户提问经 Embedding 模型转换为 1024 维稠密向量 → pgvector HNSW 索引以亚毫秒级在图结构中跳跃搜索 → 从所有文档分块中快速锁定 Top-50 候选,耗时约 12ms。

第二级:BCE Reranker 精排

50 个候选分块进入 BCE Reranker 交叉编码器 → 用户提问与每个候选拼接后做深度语义交互打分 → 精确评估每个分块对回答的真实贡献度 → 保留 Top-5 高分片段注入 LLM 上下文。

第三级:LLM 生成 + 引用溯源

Top-5 分块 + 系统提示词 + 对话历史 → 组装为 Prompt → 发送至 LLM 推理 → SSE 流式逐 token 返回 → 前端打字机效果实时渲染 → 引用角标精确标注来源文档和相似度评分。

数据库设计

表名说明关键字段
kb_knowledge_bases知识库id, name, description, created_at
kb_documents文档元数据id, kb_id, filename, status, chunk_count, file_size, uploaded_at
kb_chunks文档切片 + 向量id, document_id, kb_id, content, embedding (pgvector), chunk_index
kb_sessions对话会话id, kb_id, title, created_at
kb_qa_records问答记录id, session_id, question, answer, ref_chunks, model_name, created_at
kb_config系统配置(单行)id, llm_provider, llm_model, chunk_size, top_k, ...

文档摄入管道

文档上传后进入异步摄入管道,顺序执行以下阶段:

用户上传文件 (multipart/form-data)
  │
  ▼
① Parser (parser_service.py)
    PyPDF2 / python-docx / markdown → 提取纯文本
  │
  ▼
② Chunker (chunking_service.py)
    按 chunk_size 分割 + chunk_overlap 重叠 → 生成切片列表
  │
  ▼
③ Embedder (embedding_service.py)
    BGE-large-zh-v1.5 / OpenAI → 每个切片生成 1024d 向量
  │
  ▼
④ Ingester (ingestion_service.py)
    批量 INSERT INTO kb_chunks → pgvector HNSW 索引自动构建
  │
  ▼
⑤ 更新 kb_documents.status = 'success' (或 'failed')

⚠️ 摄入管道是异步的。上传 API 立即返回,前端通过轮询文档状态获取进度。