doctorAI/docs/SPEC_tri_domain_knowledge_architecture.md

11 KiB
Raw Permalink Blame History

SPEC: 三元知识域架构 (Tri-Domain Knowledge Architecture)

版本: v1.0
前置依赖: SPEC_deepview_metadata_scoping_v3.md (Prosumer-First 沙箱隔离)
设计哲学: DESIGN_PHILOSOPHY_AI_NATIVE.md (AI-Native 产品心法)
状态: 草案 (Proposal)


1. 问题陈述

V3 SPEC 成功地将用户数据(客户档案、录音、个人风格)锁死在 storage/users/{userId}/ 的物理沙箱内。但当前的 storage/wiki/ 仍然是一个无主的全局公域——任何经过认证的用户上传的知识库文件,都会落入这个公有池,并被所有用户的 Agent 无差别读取。

在单机构运营阶段,这不构成安全问题。但本产品作为一款轻量级 SaaS 工具,将很快遇到多家医疗机构同时使用的场景。届时:

风险 场景
知识污染 A 机构的"报价策略.md"被 B 机构医生的 Agent 读取,导致 AI 输出了竞争对手的定价策略
方法论冲突 A 机构上传的"保守型话术规范"与 B 机构的"激进型破冰话术"同在一个池中Agent 无法判断听谁的
逆向泄密 医生在对话中追问"知识库里有什么内容"Agent 如实汇报,变相暴露了其他机构的核心商业资产

结论wiki/ 需要从"一个桶"裂变为"三元域",否则沙箱隔离只做了一半。


2. 三元域模型 (Tri-Domain Model)

2.1 架构总览

storage/
├── platform/                          ← 🌐 Domain 1: 平台域 (Platform)
│   └── wiki/                          
│       ├── system_instructions.md     # 系统级行为约束
│       └── medical_ethics_baseline.md # 医疗合规底线
│
├── orgs/                              ← 🏢 Domain 2: 机构域 (Organization)
│   ├── {orgId_A}/
│   │   └── wiki/
│   │       ├── rfm_rules.md           # A机构的 RFM 客群规则
│   │       ├── pricing_2026.md        # A机构的报价表
│   │       └── talk_track_v3.md       # A机构的话术规范
│   │
│   └── {orgId_B}/
│       └── wiki/
│           └── ...                    # B机构的独立知识库
│
└── users/                             ← 👤 Domain 3: 个人域 (User)
    └── {userId}/
        ├── clients/                   # 私有客户档案 (V3 已实现)
        ├── inbox/                     # 未归档录音 (V3 已实现)
        └── doctor_profile.md          # 个人风格画像 (V3 已实现)

2.2 三元域的职责定义

物理路径 写入权限 读取权限 内容特征
平台域 platform/wiki/ 仅运维/开发者 所有用户(只读) 通用底线医疗合规、AI 行为红线、系统级兜底 Prompt
机构域 orgs/{orgId}/wiki/ 机构管理员 该机构下所有用户 企业差异化资产RFM 规则、定价表、话术方法论、培训心法
个人域 users/{userId}/ 用户本人 仅用户本人 私有工作数据客户、录音、个人风格、Inbox

2.3 上下文注入优先级

当 Agent 构建 System Prompt 时,三元域按由近及远的优先级叠加注入:

[优先级 1] 个人域  →  doctor_profile.md, 当前客户 profile.md
[优先级 2] 机构域  →  orgs/{orgId}/wiki/*
[优先级 3] 平台域  →  platform/wiki/*

冲突解决原则:近域覆盖远域。如果个人域的 doctor_profile.md 声明了"我不使用激进话术",即使机构域的 talk_track_v3.md 中含有激进话术范例Agent 应优先遵从个人偏好。


3. 用户与机构的关系模型

3.1 Prosumer 生命周期

┌──────────────────────────────────────────────────────────────┐
│  Phase 1: 自由人 (Freelancer)                                 │
│  ─ 注册即可用,无需任何机构归属                                   │
│  ─ Agent 读取: platform/wiki/* + users/{userId}/*              │
│  ─ orgs 层级对该用户透明(不存在)                                │
├──────────────────────────────────────────────────────────────┤
│  Phase 2: 受邀加入机构 (Org Member)                            │
│  ─ 机构管理员发出邀请码,用户确认加入后绑定 orgId                    │
│  ─ Agent 读取: platform/* + orgs/{orgId}/* + users/{userId}/*  │
│  ─ 个人域数据对机构管理员不可见(除非显式授权移交)                    │
├──────────────────────────────────────────────────────────────┤
│  Phase 3: 授权联邦 (Federation)                     [远期预留]  │
│  ─ 医生主动授权特定客户档案向机构汇报系统开放                       │
│  ─ 机构管理层获得聚合视图(只读),不触碰个人原始录音                  │
└──────────────────────────────────────────────────────────────┘

3.2 数据流向的不可逆栅栏

  • 上行不可逆:个人域数据只有经用户显式确认后,才可拷贝(非移动)至机构域的聚合报告。机构管理员永远不可直接遍历 users/{userId}/ 目录。
  • 下行只读注入:机构域和平台域对个人域的影响仅限于"知识注入"Agent Prompt 中追加上下文)。任何域都不能向个人域写入文件。
  • 跨机构绝对隔离orgs/{orgId_A}/orgs/{orgId_B}/ 之间零交集。一个用户同时隶属两家机构时Agent 只加载当前活跃会话所选的机构上下文。

4. 现有 wiki/ 的迁移路径

当前 storage/wiki/gemini_rfm_rules.md 实质上是某一家机构的商业方法论,不应继续驻留在全局公域。

4.1 迁移策略(渐进式)

阶段 动作 影响
Phase 0 (当前) storage/wiki/ 保持原址不动 继续服务单机构运营,无破坏性
Phase 1 (首次多机构) 引入 storage/platform/wiki/ 存放通用底线;将 storage/wiki/ 整体 rename 为 storage/orgs/{首个orgId}/wiki/ 一次性 rename后端路径切换
Phase 2 (稳态) 新机构入驻时,由运维在 storage/orgs/{newOrgId}/wiki/ 下初始化空目录 零干扰,增量部署

4.2 后端改动影响面预估

需改动的位置与 V3 沙箱重构完全同构,核心变量仅从 storageDir + "/wiki" 变为 storageDir + "/orgs/" + orgId + "/wiki"

文件 函数 变更内容
deepview_sse.py _handleChat Prompt 中 wiki 路径追加 orgId
deepview_sse.py _handleReportGenerate 同上
deepview_materials.py process_uploaded_material_oss wiki: 上下文路由至 orgs/{orgId}/wiki/
deepview_sse.py _handleMaterialsList 列表查询时过滤至当前用户 orgId

4.3 前端改动

  • 零改动(与 V3 一致。orgId 通过 JWT Token 中的 claimorg 字段)透传,前端感知不到域的存在。

5. 安全边界与防御策略

5.1 物理隔离防线

# 防路径穿越攻击:所有用户可控的 path 片段必须经过白名单校验
def _sanitizePath(segment: str) -> str:
    """只允许字母数字下划线连字符,严禁 .. / \\ 等"""
    import re
    if not re.match(r'^[a-zA-Z0-9_\-]+$', segment):
        raise ValueError(f"Invalid path segment: {segment}")
    return segment

5.2 Agent 工具权限矩阵

Agent 工具 平台域 机构域 (本org) 机构域 (他org) 个人域 (本人) 个人域 (他人)
file_read
file_write
file_list

5.3 审计日志(远期)

orgs/{orgId}/wiki/ 目录的任何写入操作,应记录 (timestamp, userId, action, filePath) 至审计表,支持机构管理员追溯"谁在什么时候传了什么"。


6. 与 V3 SPEC 的关系

本 SPEC 是 V3 的正统延伸,不是替代。二者的关系为:

  • V3 SPEC 解决了"个人域"的物理隔离问题(users/{userId}/
  • 本 SPEC 在 V3 之上,向外延伸了"机构域"orgs/{orgId}/)和"平台域"platform/),形成完整的三元安全边界

三者合并后的完整隔离模型

┌─────────────────────────────────────────────┐
│  Platform Domain (只读注入, 运维独占写)         │
│  ┌─────────────────────────────────────────┐ │
│  │  Org Domain (机构管理员写, 成员只读)       │ │
│  │  ┌─────────────────────────────────────┐ │ │
│  │  │  User Domain (用户独占读写)           │ │ │
│  │  │  ┌──────────────────────┐            │ │ │
│  │  │  │  Client Data (归档后) │            │ │ │
│  │  │  └──────────────────────┘            │ │ │
│  │  │  ┌──────────────────────┐            │ │ │
│  │  │  │  Inbox (裸推演态)     │            │ │ │
│  │  │  └──────────────────────┘            │ │ │
│  │  └─────────────────────────────────────┘ │ │
│  └─────────────────────────────────────────┘ │
└─────────────────────────────────────────────┘

本规范为深维医生助理三元知识域架构草案,经审阅确认后,将指导后续的机构域隔离实现。