642 lines
30 KiB
Markdown
642 lines
30 KiB
Markdown
# Design Document
|
||
|
||
## Overview
|
||
|
||
医科类高校 AI 学习中心系统是一个以"能力"为核心的 Web 平台,面向学生、导师与管理员三类角色,贯穿基础医学、临床医学、见习实习、住院医师培养全成长链。本设计文档描述系统的架构、组件、数据模型、错误处理与测试策略,对应需求文档中的 17 条需求。
|
||
|
||
系统的两大架构支柱是:
|
||
|
||
1. **能力图谱(Competency Graph)** —— 全系统共享的数据底座。所有模块产生的可计入能力的数据(学习成果、对练成绩、技能使用、协同评估)都映射到统一的能力标签上,使学生画像、职业规划等能在统一数据上聚合,避免模块孤岛。
|
||
2. **技能能力中心(Skill Center)** —— 统一的 AI 能力技术底座。课程对练、研究资料查询等模块本质上是技能(Skill)的具体应用,它们复用同一套技能框架(输入规格、AI 处理逻辑、知识源绑定、输出格式、可信度标注规则)。
|
||
|
||
此外,**AI 可信与可解释**与**数据安全与合规**作为两个横切关注点贯穿所有模块:任何 AI 输出都附带可信度标注与可追溯来源,任何受保护资源访问都经过合规模块的权限判定与审计。
|
||
|
||
### 技术栈假设
|
||
|
||
需求未指定技术栈,本设计采用以下技术栈作为假设(可在实现阶段调整):
|
||
|
||
- **前端**:React + TypeScript(学生端、导师端、管理端三套界面共用组件库)
|
||
- **后端**:Node.js + TypeScript(NestJS 框架,模块化、依赖注入契合本系统的模块划分)
|
||
- **数据库**:PostgreSQL(关系型主存储,含 JSONB 字段存储画像维度、技能定义等半结构化数据)
|
||
- **图/标签存储**:能力图谱的标签体系与映射关系存于 PostgreSQL(可演进至专用图数据库)
|
||
- **缓存**:Redis(画像聚合结果、能力概览等读多写少数据的缓存)
|
||
- **AI 集成**:通过统一的 AI 网关(AI Gateway)封装大模型调用,所有调用强制经过可信度标注与来源绑定
|
||
- **对象存储**:S3 兼容存储(学习成果附件)
|
||
- **检索集成**:通过资料来源适配器(Reference Source Adapter)对接 PubMed/CNKI/万方/UpToDate/Cochrane 等外部数据库 API
|
||
|
||
### 设计原则
|
||
|
||
- **可信优先**:医学场景下 AI 幻觉风险高,所有 AI 输出绑定权威来源、附带可信度标注;无法溯源的输出一律标注为"未经核验"。
|
||
- **合规默认**:敏感数据默认脱敏,画像跨用途使用必须有有效授权,所有敏感操作留审计日志。
|
||
- **能力贯通**:所有模块通过能力标签写入能力图谱,形成统一数据底座。
|
||
- **技能复用**:可复用 AI 能力统一抽象为技能,降低新增能力的成本。
|
||
|
||
## Architecture
|
||
|
||
### 系统分层架构
|
||
|
||
```mermaid
|
||
graph TB
|
||
subgraph Client["客户端层"]
|
||
StudentUI["学生端"]
|
||
MentorUI["导师端"]
|
||
AdminUI["管理端"]
|
||
end
|
||
|
||
subgraph Gateway["接入层"]
|
||
APIGW["API 网关 / 认证鉴权"]
|
||
end
|
||
|
||
subgraph CrossCutting["横切关注点"]
|
||
Compliance["合规模块<br/>Compliance_Module<br/>(权限/脱敏/授权/审计)"]
|
||
AITrust["AI 可信层<br/>(可信度标注/来源溯源)"]
|
||
end
|
||
|
||
subgraph Modules["业务模块层"]
|
||
LS["个人学习空间<br/>Learning_Space"]
|
||
AEE["AI 评估引擎<br/>AI_Evaluation_Engine"]
|
||
PE["课程对练引擎<br/>Practice_Engine"]
|
||
CDP["临床情景对话对练<br/>Clinical_Dialogue_Practice"]
|
||
PF["学生画像引擎<br/>Profile_Engine"]
|
||
CM["职业规划模块<br/>Career_Module"]
|
||
ACM["AI 协同能力培养<br/>AI_Collaboration_Module"]
|
||
end
|
||
|
||
subgraph Foundation["底座层"]
|
||
SC["技能能力中心<br/>Skill_Center"]
|
||
CG["能力图谱<br/>Competency_Graph"]
|
||
end
|
||
|
||
subgraph External["外部与基础设施"]
|
||
AIGW["AI 网关 (大模型)"]
|
||
AuthSrc["权威知识源"]
|
||
RefSrc["资料来源 (PubMed/CNKI/...)"]
|
||
DB[("PostgreSQL")]
|
||
Cache[("Redis")]
|
||
OSS[("对象存储")]
|
||
end
|
||
|
||
Client --> APIGW
|
||
APIGW --> Compliance
|
||
Compliance --> Modules
|
||
Modules --> SC
|
||
Modules --> CG
|
||
SC --> AIGW
|
||
AEE --> AIGW
|
||
CDP --> AIGW
|
||
SC --> AuthSrc
|
||
SC --> RefSrc
|
||
PE --> AuthSrc
|
||
Modules --> AITrust
|
||
AITrust --> AIGW
|
||
Modules --> DB
|
||
PF --> Cache
|
||
CG --> Cache
|
||
LS --> OSS
|
||
```
|
||
|
||
### 模块依赖关系
|
||
|
||
```mermaid
|
||
graph LR
|
||
LS["个人学习空间"] --> CG["能力图谱"]
|
||
LS --> AEE["AI评估引擎"]
|
||
PE["课程对练引擎"] --> SC["技能能力中心"]
|
||
PE --> CG
|
||
PE --> AEE
|
||
CDP["临床情景对话对练"] --> SC
|
||
CDP --> CG
|
||
RQS["研究资料查询技能"] --> SC
|
||
RQS --> CG
|
||
ACM["AI协同能力培养"] --> CG
|
||
PF["学生画像引擎"] --> CG
|
||
PF --> LS
|
||
CM["职业规划模块"] --> CG
|
||
CM --> PF
|
||
AEE --> AITrust["AI可信层"]
|
||
SC --> AITrust
|
||
PF --> Compliance["合规模块"]
|
||
CM --> Compliance
|
||
```
|
||
|
||
关键说明:
|
||
- **能力图谱**是被依赖最多的底座,几乎所有业务模块都向它写入或从它读取能力数据。
|
||
- **技能能力中心**是课程对练、临床对话对练、研究查询技能的共同底座。
|
||
- **学生画像引擎**依赖能力图谱(能力数据)与个人学习空间(成果来源)。
|
||
- **职业规划模块**依赖能力图谱(能力水平对照)与学生画像。
|
||
|
||
## Components and Interfaces
|
||
|
||
### 1. 个人学习空间(Learning_Space)
|
||
|
||
**职责**:汇聚、归档、检索学生的学习成果;触发 AI 评价与能力标签关联。
|
||
|
||
**对应需求**:需求 1。
|
||
|
||
**关键接口**:
|
||
```typescript
|
||
interface LearningSpaceService {
|
||
// 需求1.1, 1.6, 1.9: 新增成果(含元数据与字段校验)
|
||
addAchievement(studentId: string, input: AchievementInput): Result<Achievement, ValidationError>;
|
||
// 需求1.5: 分页+筛选查询(按时间倒序,每页≤50)
|
||
listAchievements(studentId: string, filter: AchievementFilter, page: Pagination): Page<Achievement>;
|
||
// 需求1.4: 标记里程碑并关联成果
|
||
markMilestone(studentId: string, milestone: MilestoneInput): Milestone;
|
||
}
|
||
```
|
||
|
||
**设计要点**:
|
||
- 保存成功后(需求 1.3)按学年、学期自动归档;若成果含临床轮转科室信息(需求 1.8)额外按科室归档。
|
||
- 保存成功后(需求 1.7)调用能力图谱进行能力标签关联;若无法匹配任何已定义标签(需求 1.10),标记为"待关联能力标签"并提示。
|
||
- 必填元数据缺失(需求 1.6)或标题超 200 字符/时间无效(需求 1.9)时拒绝保存且不创建任何记录(事务回滚)。
|
||
- 成功保存后异步触发 `AI_Evaluation_Engine` 生成形成性评价(需求 2.1)。
|
||
|
||
### 2. AI 评估引擎(AI_Evaluation_Engine)
|
||
|
||
**职责**:对学习成果生成形成性评价,对里程碑生成终结性评价,对对练报告生成改进建议。
|
||
|
||
**对应需求**:需求 2、需求 4.7-4.8。
|
||
|
||
**关键接口**:
|
||
```typescript
|
||
interface AIEvaluationEngine {
|
||
// 需求2.1: 形成性评价(30秒内)
|
||
generateFormativeEvaluation(achievement: Achievement): Result<Evaluation, EvaluationError>;
|
||
// 需求2.2, 2.7: 终结性评价(节点内须有成果)
|
||
generateSummativeEvaluation(milestone: Milestone, achievements: Achievement[]): Result<Evaluation, EvaluationError>;
|
||
// 需求4.7-4.8: 对练薄弱环节改进建议
|
||
generateImprovementSuggestions(report: PracticeReport): Suggestion[];
|
||
}
|
||
```
|
||
|
||
**设计要点**:
|
||
- 每条评价附带可信度标注,列出至少一条依据的学习成果或权威知识源(需求 2.3);每条发展建议引用至少一个能力标签(需求 2.4)。
|
||
- 内容信息不足时中止生成、保留数据不变并提示缺失内容类别(需求 2.5)。
|
||
- 生成失败或超时时中止、保留数据不变并提示失败(需求 2.6)。
|
||
- 通过 AI 可信层统一附加可信度标注(需求 16)。
|
||
|
||
### 3. 课程对练引擎(Practice_Engine)
|
||
|
||
**职责**:基于课程内容生成题目(绑定权威知识源),经导师审核后供学生对练,并生成结果诊断报告。
|
||
|
||
**对应需求**:需求 3、需求 4。
|
||
|
||
**关键接口**:
|
||
```typescript
|
||
interface PracticeEngine {
|
||
// 需求3.1: 生成题目(30秒内,5-50道)
|
||
generateQuestions(courseId: string, studentId: string): Result<Question[], GenerationError>;
|
||
// 需求3.5, 3.6: 导师审核流转
|
||
reviewQuestion(questionId: string, decision: ReviewDecision, reason?: string): Question;
|
||
// 需求4: 对练会话
|
||
startPractice(studentId: string, questionSetId: string): PracticeSession;
|
||
submitAnswer(sessionId: string, questionId: string, answer: Answer): AnswerResult;
|
||
finishPractice(sessionId: string): PracticeReport;
|
||
}
|
||
```
|
||
|
||
**题目状态机**:
|
||
```mermaid
|
||
stateDiagram-v2
|
||
[*] --> 待导师审核: 生成成功
|
||
[*] --> 已拒绝: 无法绑定权威知识源(3.8)
|
||
待导师审核 --> 可用于对练: 导师通过(3.6)
|
||
待导师审核 --> 已退回: 导师退回(3.5)
|
||
已退回 --> 待导师审核: 修订后重新提交
|
||
可用于对练 --> [*]
|
||
```
|
||
|
||
**设计要点**:
|
||
- 每道题目绑定至少一个权威知识源并记录引用标识(需求 3.2);无法绑定时不进入审核并记录原因(需求 3.8)。
|
||
- 支持 A1/A2/A3/A4、病例分析、临床决策题型(需求 3.3)。
|
||
- 课程内容不足以生成最少题量时中止并提示(需求 3.7)。
|
||
- 对练逐题呈现并采集作答(需求 4.1-4.2),单题超 120 秒未作答判错并继续(需求 4.4)。
|
||
- 报告含正确率、用时、薄弱环节(正确率<60% 的能力标签,需求 4.5),并按能力标签映射能力图谱(需求 4.6)。
|
||
|
||
### 4. 临床情景对话对练(Clinical_Dialogue_Practice)
|
||
|
||
**职责**:基于权威知识源呈现临床情景,进行多轮模拟问诊对话,生成多维评估报告。
|
||
|
||
**对应需求**:需求 5。
|
||
|
||
**关键接口**:
|
||
```typescript
|
||
interface ClinicalDialoguePractice {
|
||
// 需求5.1, 5.5: 发起对练(10秒内呈现情景,须绑定权威知识源)
|
||
startDialogue(studentId: string, scenarioId: string): Result<DialogueSession, NoSourceError>;
|
||
// 需求5.2: 多轮对话(最多50轮)
|
||
sendTurn(sessionId: string, studentInput: string): DialogueTurn;
|
||
// 需求5.3, 5.6: 结束并生成报告(30秒内,三维度)
|
||
finishDialogue(sessionId: string): Result<DialogueReport, ReportError>;
|
||
}
|
||
```
|
||
|
||
**设计要点**:
|
||
- 未绑定权威知识源时阻止启动、不创建对话记录并提示(需求 5.5)。
|
||
- 报告含问诊完整性、临床推理、医患沟通三个评估方面(需求 5.3),结果映射能力图谱(需求 5.4)。
|
||
- 报告生成失败或超时时中止、保留对话记录并提示(需求 5.6)。
|
||
|
||
### 5. 学生画像引擎(Profile_Engine)
|
||
|
||
**职责**:基于学习空间与能力图谱数据生成多维度画像;标记敏感字段,遵循数据最小化。
|
||
|
||
**对应需求**:需求 6、需求 7(与合规模块协作)。
|
||
|
||
**关键接口**:
|
||
```typescript
|
||
interface ProfileEngine {
|
||
// 需求6.1, 6.5: 生成/更新画像(5秒内,数据不足维度标记)
|
||
generateProfile(studentId: string): Result<StudentProfile, ProfileError>;
|
||
// 需求6.4: 画像结论可追溯
|
||
getProfileTraceability(studentId: string, dimensionId: string): TraceabilityRecord[];
|
||
}
|
||
```
|
||
|
||
**设计要点**:
|
||
- 六个画像维度均以 0-100 量化分值呈现(需求 6.2):知识掌握、临床技能、科研能力、人文素养、AI 协同素养、职业倾向。
|
||
- 能力图谱更新后 10 秒内完成数据同步(需求 6.3);每项结论可追溯至少一条来源记录(需求 6.4)。
|
||
- 数据不足以刻画某维度时标记"数据不足"并保留其余维度(需求 6.5)。
|
||
- 仅采集与至少一个画像维度直接相关的字段(需求 7.7,数据最小化)。
|
||
|
||
### 6. 职业规划模块(Career_Module)
|
||
|
||
**职责**:设定职业目标、关联岗位胜任力模型、对照能力图谱生成动态闭环发展规划。
|
||
|
||
**对应需求**:需求 8、需求 9。
|
||
|
||
**关键接口**:
|
||
```typescript
|
||
interface CareerModule {
|
||
// 需求8.1, 8.4, 8.5: 设定目标并关联胜任力模型(3秒内)
|
||
setCareerGoal(studentId: string, goal: CareerGoal): Result<CompetencyModel, GoalError>;
|
||
// 需求9: 生成/更新发展规划
|
||
generateDevelopmentPlan(studentId: string, goalId: string): Result<DevelopmentPlan, PlanError>;
|
||
}
|
||
```
|
||
|
||
**设计要点**:
|
||
- 岗位胜任力模型参照权威医学胜任力框架,含科学与学术、临床能力、健康与社会、职业素养四维度(需求 8.2),每维度至少 3 个能力标签(需求 8.3)。
|
||
- 无匹配模型时提示并推荐至少 3 个相近目标(需求 8.4)。
|
||
- 逐项对照能力图谱能力水平与要求水平,标记能力差距项(含缺数据项,需求 9.1);每差距项生成≥1 建议行动(需求 9.2)、推荐≥1 学习资源或对练任务(需求 9.3)、引用对应能力标签(需求 9.4)。
|
||
- 能力图谱更新后再次请求时重算全部差距项(需求 9.5,动态闭环)。
|
||
- 未选目标/模型不可用时拒绝并提示、保留能力图谱数据(需求 9.6);差距项无对应资源时保留并标注暂无推荐(需求 9.7)。
|
||
|
||
### 7. 研究资料查询技能(Research_Query_Skill,建立于 Skill_Center 之上)
|
||
|
||
**职责**:自然语言转检索式、检索筛选、总结、证据分级、引用管理。
|
||
|
||
**对应需求**:需求 10、需求 11。
|
||
|
||
**关键接口**:
|
||
```typescript
|
||
interface ResearchQuerySkill {
|
||
// 需求10.1, 10.6: NL→检索式(PICO/MeSH,10秒内,1-2000字符)
|
||
generateSearchQuery(studentId: string, question: string): Result<SearchQuery, QuestionError>;
|
||
// 需求10.2, 10.7, 10.8: 检索(30秒内,分页≤50,空结果/源不可用处理)
|
||
search(query: SearchQuery, sources: ReferenceSource[], page: Pagination): Result<Page<ReferenceItem>, SourceError>;
|
||
// 需求11.1, 11.6: 生成总结(30秒内,每结论附引用)
|
||
summarize(items: ReferenceItem[]): Result<Summary, SummaryError>;
|
||
// 需求11.3, 11.7: 生成/导出引用
|
||
generateCitation(items: ReferenceItem[], format: CitationFormat): Result<Citation[], CitationError>;
|
||
exportCitations(citations: Citation[], target: ExportTarget): Result<ExportFile, ExportError>;
|
||
}
|
||
```
|
||
|
||
**设计要点**:
|
||
- 检索结果每条仅含检索信息、摘要、原文链接,不存储或分发受版权保护全文(需求 10.4,版权安全)。
|
||
- 总结每条结论附≥1 来源引用(需求 11.1);每条资料标注唯一证据分级(需求 11.2)。
|
||
- 无法溯源的结论标注"未验证"且不作为引用输出(需求 11.4)。
|
||
- 支持 Vancouver/GB-T 7714 格式,导出 EndNote/NoteExpress(需求 11.3)。
|
||
- 呈现总结时提示"仅辅助,不替代阅读原文"(需求 11.5)。
|
||
|
||
### 8. AI 协同能力培养模块(AI_Collaboration_Module)
|
||
|
||
**职责**:提供协同训练任务,评估四维协同能力,写入能力图谱,支持导师点评。
|
||
|
||
**对应需求**:需求 12。
|
||
|
||
**关键接口**:
|
||
```typescript
|
||
interface AICollaborationModule {
|
||
// 需求12.1: 提供协同训练任务(四维度各≥1)
|
||
listTrainingTasks(dimension?: CollaborationDimension): TrainingTask[];
|
||
// 需求12.2, 12.6, 12.7: 完成任务并评估(30秒内,0-100,失败/数据不足处理)
|
||
evaluateTask(studentId: string, taskId: string, submission: TaskSubmission): Result<CollaborationAssessment, AssessmentError>;
|
||
// 需求12.5: 导师点评
|
||
addMentorComment(taskId: string, mentorId: string, comment: string): MentorComment;
|
||
}
|
||
```
|
||
|
||
**设计要点**:
|
||
- 四维度:提问能力、批判性验证、责任边界意识、协同工作流(需求 12.2)。
|
||
- 学生直接采用未核验 AI 输出时提示并要求来源核验,且计入批判性验证维度(需求 12.3)。
|
||
- 评估结果映射能力图谱并计入画像与胜任力对照(需求 12.4)。
|
||
|
||
### 9. 技能能力中心(Skill_Center,底座)
|
||
|
||
**职责**:定义、治理、调用可复用 AI 技能;统一技能框架与可信度标注。
|
||
|
||
**对应需求**:需求 13。
|
||
|
||
**关键接口**:
|
||
```typescript
|
||
interface SkillCenter {
|
||
// 需求13.6, 13.7: 配置/启用/审计技能定义
|
||
upsertSkillDefinition(actor: User, def: SkillDefinition): Result<SkillDefinition, DefinitionError>;
|
||
enableSkill(actor: User, skillId: string): Skill;
|
||
// 需求13.3, 13.4, 13.5: 调用技能(30秒内,输入校验,失败处理)
|
||
invokeSkill(studentId: string, skillId: string, input: SkillInput): Result<SkillOutput, InvocationError>;
|
||
// 需求13.9: 序列化往返
|
||
serialize(def: SkillDefinition): string;
|
||
deserialize(raw: string): SkillDefinition;
|
||
}
|
||
```
|
||
|
||
**技能定义结构(需求 13.2 五要素)**:
|
||
```typescript
|
||
interface SkillDefinition {
|
||
id: string;
|
||
name: string;
|
||
inputSpec: InputSpec; // 输入规格
|
||
processingLogic: ProcessingLogic; // AI 处理逻辑说明
|
||
knowledgeSources: SourceBinding[]; // 知识源绑定
|
||
outputFormat: OutputFormat; // 输出格式
|
||
credibilityRule: CredibilityRule; // 可信度标注规则
|
||
enabled: boolean;
|
||
}
|
||
```
|
||
|
||
**设计要点**:
|
||
- 技能库至少含 8 个技能:资料查询、检索式生成、文献综述、病例分析、鉴别诊断辅助、医患沟通模拟、医学翻译、引用生成(需求 13.1)。
|
||
- 调用前校验输入符合 inputSpec,不符则拒绝(需求 13.4);知识源不可用或处理失败时终止、不返回结果与标注、提示失败(需求 13.5)。
|
||
- 仅成功调用完成才写入能力图谱(需求 13.8)。
|
||
- **序列化往返一致性**(需求 13.9):`deserialize(serialize(def))` 等价于 `def`,这是核心属性测试点。
|
||
|
||
### 10. 能力图谱(Competency_Graph,底座)
|
||
|
||
**职责**:维护统一能力标签体系;接收各模块能力数据映射;聚合能力概览。
|
||
|
||
**对应需求**:需求 14。
|
||
|
||
**关键接口**:
|
||
```typescript
|
||
interface CompetencyGraph {
|
||
// 需求14.1: 维护统一标签体系
|
||
listTags(): CompetencyTag[];
|
||
// 需求14.2, 14.3: 映射数据(1-10标签,5秒内,未定义标签拒绝)
|
||
mapData(source: ModuleSource, data: CompetencyData, tagIds: string[]): Result<Mapping, UndefinedTagError>;
|
||
// 需求14.4, 14.5: 聚合能力概览(5秒内,0-100,数据不足标记)
|
||
getCompetencyOverview(studentId: string): CompetencyOverview;
|
||
}
|
||
```
|
||
|
||
**设计要点**:
|
||
- 每个能力标签有唯一标识与所属能力维度(需求 14.1)。
|
||
- 映射 1-10 个已定义标签(需求 14.2);引用未定义标签时拒绝、不创建记录、记录原因并提示(需求 14.3)。
|
||
- 能力概览按维度以 0-100 量化分值返回(需求 14.4);数据不足维度标记"数据不足"并保留其余(需求 14.5)。
|
||
|
||
### 11. 合规模块(Compliance_Module,横切)
|
||
|
||
**职责**:权限分级、敏感字段脱敏、画像授权校验、审计日志。
|
||
|
||
**对应需求**:需求 7、需求 15.4、需求 17。
|
||
|
||
**关键接口**:
|
||
```typescript
|
||
interface ComplianceModule {
|
||
// 需求17.1, 17.2, 17.3: 权限判定
|
||
checkAccess(user: User, resource: ProtectedResource, action: Action): AccessDecision;
|
||
// 需求7.2, 7.3, 7.4, 7.5: 画像授权与脱敏
|
||
resolveProfileView(viewer: User, profile: StudentProfile): StudentProfileView;
|
||
verifyConsent(studentId: string, purpose: Purpose): ConsentVerification;
|
||
revokeConsent(studentId: string, consentId: string): void;
|
||
// 需求17.4, 7.6: 审计日志
|
||
writeAuditLog(entry: AuditLogEntry): void;
|
||
}
|
||
```
|
||
|
||
**授权与脱敏流程**:
|
||
```mermaid
|
||
flowchart TD
|
||
A[访问学生画像] --> B{访问者是学生本人?}
|
||
B -->|是| C[返回完整画像]
|
||
B -->|否| D{持有有效知情同意授权?}
|
||
D -->|否| E[拒绝完整画像访问 7.2<br/>对未授权敏感字段脱敏 7.5]
|
||
D -->|是, 范围覆盖用途| F[校验授权有效期/范围/用途 7.3]
|
||
F -->|通过| G[按授权范围返回字段]
|
||
F -->|不通过| E
|
||
C --> H[写审计日志 7.6]
|
||
E --> H
|
||
G --> H
|
||
```
|
||
|
||
**设计要点**:
|
||
- 敏感字段:身份标识、联系方式、健康与医疗记录、心理测评结果、生物特征数据(需求 7.1)。
|
||
- 授权须仍在有效期内且范围与用途覆盖该用途(需求 7.3);不满足时阻止使用、保持数据不被使用并提示(需求 7.4)。
|
||
- 学生撤销授权后立即失效,此后按未授权处理(需求 7.8)。
|
||
- 脱敏 2 秒内、仅返回已授权字段(需求 7.5);审计日志 5 秒内记录、保留≥12 个月(需求 7.6)。
|
||
- 权限范围列出可访问资源类型与允许操作类型(需求 17.1);越权访问拒绝并记录(需求 17.3)。
|
||
|
||
### 12. 导师端(Mentor 视图,跨模块)
|
||
|
||
**职责**:题目审核、成果点评、查看带教学生画像。
|
||
|
||
**对应需求**:需求 15。
|
||
|
||
**设计要点**:
|
||
- 题目审核通过/退回并在退回时记录原因(需求 15.1,复用 Practice_Engine 审核接口)。
|
||
- 成果点评关联到学习成果并对学生可见(需求 15.2)。
|
||
- 存在带教关系时允许查看所带学生画像(需求 15.3);查看非所带学生画像时合规模块拒绝并记录越权尝试(需求 15.4)。
|
||
|
||
### 13. AI 可信层(横切)
|
||
|
||
**职责**:为所有 AI 输出统一附加可信度标注与来源溯源。
|
||
|
||
**对应需求**:需求 16。
|
||
|
||
**设计要点**:
|
||
- 任意 AI 评价/建议/总结附带可信度标注(需求 16.1),含≥1 来源与 0%-100% 置信度(需求 16.2)。
|
||
- 请求查看依据时 3 秒内展示可追溯来源条目及引用标识(需求 16.3)。
|
||
- 无法溯源的输出标注"未经核验"并在呈现时一并显示(需求 16.4)。
|
||
|
||
## Data Models
|
||
|
||
### 核心实体关系
|
||
|
||
```mermaid
|
||
erDiagram
|
||
Student ||--o{ Achievement : owns
|
||
Student ||--|| StudentProfile : has
|
||
Student ||--o{ Milestone : reaches
|
||
Student ||--o{ ConsentRecord : grants
|
||
Achievement }o--o{ CompetencyTag : "mapped to"
|
||
Milestone ||--o{ Achievement : groups
|
||
CompetencyTag }o--|| CompetencyDimension : "belongs to"
|
||
CompetencyModel ||--o{ CompetencyTag : requires
|
||
CareerGoal ||--|| CompetencyModel : maps
|
||
DevelopmentPlan ||--o{ CompetencyGap : contains
|
||
SkillDefinition ||--o{ SourceBinding : binds
|
||
Question }o--|| AuthoritativeSource : "bound to"
|
||
PracticeReport }o--o{ CompetencyTag : "scored on"
|
||
AuditLogEntry }o--|| Student : about
|
||
StudentProfile ||--o{ ProfileDimensionScore : contains
|
||
```
|
||
|
||
### 关键数据结构
|
||
|
||
```typescript
|
||
// 学习成果(需求1)
|
||
interface Achievement {
|
||
id: string;
|
||
studentId: string;
|
||
type: AchievementType; // 需求1.2 枚举
|
||
title: string; // ≤200字符 (需求1.9)
|
||
occurredAt: Date; // 有效日期 (需求1.9)
|
||
academicYear: string; // 归档维度 (需求1.3)
|
||
semester: string; // 归档维度 (需求1.3)
|
||
rotationDept?: string; // 临床轮转科室 (需求1.8)
|
||
attachments: AttachmentRef[];
|
||
competencyTagIds: string[]; // 关联标签 (需求1.7)
|
||
pendingTagAssociation: boolean; // 待关联 (需求1.10)
|
||
}
|
||
|
||
// 能力标签与维度(需求14)
|
||
interface CompetencyTag {
|
||
id: string; // 唯一标识 (需求14.1)
|
||
name: string;
|
||
dimensionId: string; // 所属维度 (需求14.1)
|
||
}
|
||
|
||
// 学生画像(需求6,7)
|
||
interface StudentProfile {
|
||
studentId: string;
|
||
dimensions: ProfileDimensionScore[]; // 六维度,0-100 (需求6.2)
|
||
generatedAt: Date;
|
||
}
|
||
interface ProfileDimensionScore {
|
||
dimension: ProfileDimension;
|
||
score: number | 'insufficient_data'; // 数据不足 (需求6.5)
|
||
traceability: TraceabilityRecord[]; // 可追溯 (需求6.4)
|
||
sensitive: boolean; // 敏感标记 (需求7.1)
|
||
}
|
||
|
||
// 知情同意授权(需求7)
|
||
interface ConsentRecord {
|
||
id: string;
|
||
studentId: string;
|
||
scope: string[]; // 授权范围 (需求7.3)
|
||
purpose: Purpose; // 授权用途 (需求7.3)
|
||
validFrom: Date;
|
||
validUntil: Date; // 有效期 (需求7.3)
|
||
revoked: boolean; // 撤销 (需求7.8)
|
||
}
|
||
|
||
// 可信度标注(需求16)
|
||
interface CredibilityAnnotation {
|
||
sources: SourceRef[]; // ≥1 来源 (需求16.2)
|
||
confidence: number; // 0-100 (需求16.2)
|
||
verified: boolean; // false => "未经核验" (需求16.4)
|
||
}
|
||
|
||
// 审计日志(需求7.6, 17.4)
|
||
interface AuditLogEntry {
|
||
actorId: string; // 操作者
|
||
timestamp: Date; // 时间
|
||
action: Action; // 操作类型
|
||
resourceScope: string; // 数据范围
|
||
outcome: 'allow' | 'deny';
|
||
reason?: string; // 拒绝原因 (需求17.3)
|
||
// 保留≥12个月 (需求7.6)
|
||
}
|
||
```
|
||
|
||
## Error Handling
|
||
|
||
系统采用统一的 `Result<T, E>` 返回模式,区分正常路径与错误路径,并遵循以下原则:
|
||
|
||
| 场景 | 处理策略 | 对应需求 |
|
||
|------|----------|----------|
|
||
| 输入校验失败(缺字段/超长/无效日期) | 拒绝操作、不创建记录(事务回滚)、返回指明问题的提示 | 1.6, 1.9, 13.4 |
|
||
| AI 生成失败或超时 | 中止生成、保留触发数据不变、返回失败提示 | 2.6, 5.6, 11.6, 12.6 |
|
||
| 内容/数据信息不足 | 标记"数据不足"或"信息不足"、保留其余结果、提示缺失类别 | 2.5, 6.5, 12.7, 14.5 |
|
||
| 无法绑定权威知识源 | 不进入审核/不启动、记录原因或提示 | 3.8, 5.5 |
|
||
| 资料来源不可用 | 中止检索、保留检索式、提示来源不可用 | 10.8 |
|
||
| 检索无匹配 | 返回空结果列表并提示 | 10.7 |
|
||
| 无法溯源 | 标注"未验证"/"未经核验"、不作为引用输出 | 11.4, 16.4 |
|
||
| 无有效授权 | 阻止使用、保持数据不被使用、提示缺少授权 | 7.4 |
|
||
| 越权访问 | 拒绝访问、保持资源不被访问、记录拒绝事件 | 9.6, 15.4, 17.3 |
|
||
| 系统错误(如目标关联失败) | 返回错误提示、保留已有数据 | 8.5, 9.6 |
|
||
|
||
**核心错误处理不变量**:任何错误路径都不得使触发数据进入不一致状态(要么完整成功,要么完整回滚保留原状)。
|
||
|
||
## Testing Strategy
|
||
|
||
### 测试层次
|
||
|
||
1. **单元测试**:各模块接口的正常路径与错误路径,覆盖每条验收标准。
|
||
2. **集成测试**:跨模块流程,重点验证能力图谱作为底座的数据贯通(学习成果→标签→画像→职业规划)。
|
||
3. **属性测试(Property-Based Testing)**:针对可形式化为不变量的核心正确性属性。
|
||
4. **合规与安全测试**:权限矩阵、脱敏、授权生命周期、审计完整性。
|
||
|
||
测试数据与模拟说明:
|
||
|
||
- AI 网关在测试中以可控的 mock 替代,便于模拟生成成功、失败、超时、无法溯源等场景。
|
||
- 资料来源适配器以 mock 模拟外部数据库的可用、不可用、空结果等状态。
|
||
- 属性测试使用生成器构造任意有效的技能定义、能力数据、授权记录等输入。
|
||
|
||
## Correctness Properties
|
||
|
||
以下属性应对任意有效输入成立,作为属性测试(Property-Based Testing)的基础:
|
||
|
||
### Property 1: 技能定义序列化往返一致性
|
||
对任意有效的 `SkillDefinition def`,有 `deserialize(serialize(def))` 等价于 `def`。
|
||
|
||
**Validates: Requirements 13.9**
|
||
|
||
### Property 2: 能力标签映射有效性
|
||
对任意提交的能力数据与标签集合,映射成功 ⟺ 所有标签均为已定义标签,且映射后标签数量在 1 到 10 之间;引用未定义标签时必然拒绝且不创建任何映射记录。
|
||
|
||
**Validates: Requirements 14.2, 14.3**
|
||
|
||
### Property 3: 画像维度分值有界性
|
||
对任意学生数据生成的画像与能力概览,每个维度的输出要么是 0 到 100 之间的数值,要么是"数据不足"标记,不存在其他取值。
|
||
|
||
**Validates: Requirements 6.2, 14.4**
|
||
|
||
### Property 4: 授权强制不变量
|
||
对任意非本人访问者与任意画像使用用途,仅当存在一条有效期内、范围与用途均覆盖的未撤销授权时,才允许完整访问/使用;授权撤销后任何后续访问都按未授权处理。
|
||
|
||
**Validates: Requirements 7.2, 7.3, 7.4, 7.8**
|
||
|
||
### Property 5: 引用可追溯不变量
|
||
对任意生成的总结,作为引用输出的每条结论都必然可追溯到至少一条来源条目;无法溯源的结论必然被标注为"未验证/未经核验"且不出现在引用输出中。
|
||
|
||
**Validates: Requirements 11.1, 11.4, 16.4**
|
||
|
||
### Property 6: 权限判定一致性
|
||
对任意(用户角色,资源,操作)三元组,访问被允许 ⟺ 该操作在该角色的权限范围内;越权访问必然被拒绝并产生一条拒绝审计记录。
|
||
|
||
**Validates: Requirements 17.2, 17.3**
|
||
|
||
### Property 7: 错误路径数据保全
|
||
对任意触发错误路径的操作,操作前后触发数据保持不变(不产生部分写入)。
|
||
|
||
**Validates: Requirements 1.6, 1.9, 2.6, 5.6, 8.5**
|
||
|
||
### Property 8: 分页边界不变量
|
||
对任意查询与分页参数,返回的单页结果数量不超过 50 条。
|
||
|
||
**Validates: Requirements 1.5, 10.2**
|
||
|
||
## Design Decisions and Rationale
|
||
|
||
1. **以能力图谱为统一底座**:医学教育成长链长、模块多,若各模块各自存储能力数据会形成孤岛。统一标签体系让画像与职业规划能在一致数据上聚合,也使"对照胜任力模型"有共同语言。代价是所有模块需遵循标签映射契约(需求 14.3 的拒绝机制保障了契约一致性)。
|
||
|
||
2. **技能能力中心作为 AI 能力底座**:课程对练、研究查询本质都是"绑定知识源的 AI 调用 + 可信度标注"。抽象为统一技能框架降低新增能力成本,并使可信度标注、知识源绑定、治理审计得以统一实现。序列化往返一致性(需求 13.9)保障技能定义可安全持久化与迁移。
|
||
|
||
3. **AI 可信层作为横切关注点**:医学场景幻觉风险高,将"可信度标注 + 来源溯源 + 未经核验标记"统一到一层,避免各模块各自实现导致遗漏,确保需求 16 在全系统一致生效。
|
||
|
||
4. **合规默认、授权可生命周期管理**:画像含敏感健康数据,采用"默认脱敏 + 用途化授权 + 撤销即时失效 + 全审计"模型,满足知情同意与数据最小化要求,并通过授权强制不变量(属性 4)可测试地保障。
|
||
|
||
5. **统一 Result 错误模型与数据保全不变量**:所有错误路径保证数据不进入部分写入状态(属性 7),契合医学数据对一致性的高要求。
|