doctorAI/docs/SPEC_tri_domain_knowledge_architecture.md

194 lines
11 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# SPEC: 三元知识域架构 (Tri-Domain Knowledge Architecture)
> **版本**: v1.0
> **前置依赖**: [SPEC_deepview_metadata_scoping_v3.md](./SPEC_deepview_metadata_scoping_v3.md) (Prosumer-First 沙箱隔离)
> **设计哲学**: [DESIGN_PHILOSOPHY_AI_NATIVE.md](./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 中的 claim`org` 字段)透传,前端感知不到域的存在。
---
## 5. 安全边界与防御策略
### 5.1 物理隔离防线
```python
# 防路径穿越攻击:所有用户可控的 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 (裸推演态) │ │ │ │
│ │ │ └──────────────────────┘ │ │ │
│ │ └─────────────────────────────────────┘ │ │
│ └─────────────────────────────────────────┘ │
└─────────────────────────────────────────────┘
```
---
> *本规范为深维医生助理三元知识域架构草案,经审阅确认后,将指导后续的机构域隔离实现。*