Files
border-red-post-nalati/docs/ARCHITECTURE.md

6.7 KiB
Raw Permalink Blame History

系统架构

Vue 3 + TS 前端
    | HTTP /api
FastAPI + Pydantic
    |-- 知识管理 API -- PostgreSQL
    |-- 问答服务
          |-- 关键词检索
          |-- Embedding 查询向量 -> pgvector 检索
          |-- 结果融合 -> 证据检查 -> LLM API
          |-- 答案 + 来源
    |-- 后台更新任务(后续)
          |-- 来源获取 -> 人工核验 -> 文本切分 -> 生成向量 -> 发布版本

当前后端实现健康/数据库就绪检查、来源与文档管理、知识增删改查、分页筛选、人工审核、历史快照、认证会话/角色权限、文本/向量快照及独立关键词/向量/RRF 检索;问答仍为占位接口。数据库由 Alembic 显式迁移并启用 pgvector,DeepSeek RAG 待明确恢复后实现。前端已接入登录/注册、个人中心、账户设置、会话恢复、路由守卫和角色菜单;实验页不伪造数据,文档、审核、完整分页、浏览器 Cookie 与 PostgreSQL 联调仍需验收。

阶段 2 数据边界

  • sources 登记来源名称、HTTP(S) 网址和备注;documents 登记所属来源、正文、分类与采集时间。
  • knowledge_items 保留基础版本全部字段,新增可选来源/文档引用、采集时间、人工审核字段、版本和软删除状态。历史条目不强行补造来源或时间。
  • audit_events 在同一事务中保存创建、修改、审核、失效、删除和迁移导入事件;知识快照包含当时关联的来源与文档。
  • version 用于内容并发控制,PATCH/审核/DELETE 必须匹配读取版本;ORM 版本检查处理并发写入冲突,引用操作对来源/文档加行锁,避免与修改和删除交错。
  • 修改知识或关联依据会撤销当前审核结论。未来正式检索必须同时限定 verification_status = 'verified' 和 is_deleted = false;当前管理列表不承担检索或索引发布功能。
  • 文档版本通过递增版本号及完整历史快照留存;chunks、Embedding 模型版本与索引发布版本在检索阶段单独实现,不能把记录版本当作已实现索引切换。
  • 旧库首次升级自动接管基础表,保留条目与导入快照。没有完整审核记录的旧 verified 状态回到待审核。启动不自动迁移,缺失或不匹配的版本会明确报错。

安全边界

新增 users、auth_sessions 与 auth_rate_limits。Argon2id 保存密码哈希,随机 Cookie 会话只保存摘要,角色逐次由数据库校验。来源白名单与会话 CSRF 保护写入;改密撤销所有会话。管理资源和检索历史均限管理员,公开检索只返回已核验资料。具体字段、来源、Cookie、预算和迁移见 认证接口契约。

当前仍供本机开发与联调;完整生产部署、网关限流、访问审计、邮箱验证、账号恢复以及浏览器端权限流程验收仍待后续工程验收。

关键词检索基线(T06)

POST /api/retrieval 在同一 SQL 语料快照中筛选有效的已审核知识,读取出处和记录版本,再进行固定中文分词、标题加权 BM25 排序和原文片段截取。语料指纹覆盖本次实际参与排序的内容与出处版本;算法标识和参数独立记录。管理页的字面子串筛选继续用于管理,正式关键词基线使用专用检索接口。

新增 retrieval_runs 保存查询、模式、语料指纹和完整结果快照,支持分页读取及按 UUID 复核。零命中如实记录;当前依据修改后失效不会改写历史,但后续检索必须重新检查审核与父记录状态。响应耗时是本次真实读取、分词、排序及片段生成耗时,不含写日志或模型调用。

关键词基线仍按知识条目检索,显示片段最长 240 字符;独立的持久化 chunks 和文本索引版本见下方。该接口不读取 chunks;chunk 与向量/RRF 的独立接口见后文。全语料计算明确限制条目数及总字符数,超限报错,适用于首批小规模资料与后续对照实验准备,不能当作生产检索性能结论。

切分与索引版本(T05)

index_versions/chunks 保存已审核语料的原文切分、出处与版本、参数、内容哈希及语料指纹。构建先保存 ready 快照,不切换当前发布;index_state 管理发布指针、代数与目录修订号,发布同一事务更新前后状态并追加 index_publications。

目录写入、构建与发布共用状态行锁,目录写入先于父记录锁获取该锁并递增修订号。发布核对代数、修订号和当前语料指纹;失败回滚,保留旧版本。目录变化后旧指针仍可追溯,但 is_current=false,不可据此绕过正式审核。历史快照不会被改写。接口均限管理员并沿用 Cookie/CSRF,完整边界见 INDEX_API.md。

这只是后续索引的文本版本基础,关键词基线行为不变;没有生成向量或宣称已实现 ANN/混合检索。同步构建和全局写锁面向当前有限语料,后续异步/增量发布须重新设计并验证并发协议。

向量与 RRF 检索(T07)

文本发布之后,固定 Embedding 空间的完整向量快照通过独立代数发布,精确余弦检索只使用当前审核与发布版本。编码在发布锁外进行,完成后重新核对语料、空间及发布状态,失败保留旧版本。运行与空间身份见 VECTOR_API.md。

新增 chunk 正文 BM25 与等权 RRF;两路限定同一文本/向量快照和分类,固定 k=60,先各取 candidate_k 再融合。保存完整候选排名、原始分数、贡献、切分/分词/BM25/模型配置及出处。旧条目关键词模式保留,评测不能混同两种证据单元。两路排序至检索记录写入共用当前性锁,面向最多 2000 chunks 的同步精确计算。字段、失败及回滚边界见 HYBRID_API.md。RAG、ANN 与真实领域质量验收仍待后续阶段。

RAG 上下文与兼容请求准备(T08)

rag_contexts 通过检索记录外键保存证据、出处/版本、选段/排除原因、提示词版本和 OpenAI 兼容 Chat Completions 请求体。准备时在发布锁内复核审核资料及文本/向量快照;已过期检索必须重查。输入与证据作为 JSON 数据放在 user message,固定规则独立保存,不允许客户端提交任意上下文或凭据。字符预算不是模型 token 校验。

准备/历史接口限管理员,写入要求会话 CSRF;历史保持当时快照。当前提供纯响应格式/引用解析,不调用生成模型;prepared_request/model_called=false 不能视为实际回答或领域实验。真实服务接入及模型 token 预算验证等待后续阶段。字段、权限、迁移和回滚见 RAG_CONTEXT_API.md。