Files
NextEdu/docs/architecture/audit/archive/ai-module-deep-audit-report.md

391 lines
22 KiB
Markdown
Raw 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.
# AI 模块审计报告 V3 — 架构解耦与全角色对标
> 审计范围:基于 V1`ai-module-audit-report.md`)与 V2`ai-module-audit-report-v2.md`)已完成实现,进行第三轮深度架构审计。
> 审计日期2026-06-24
> 审计方法:全文件逐行扫描 + 三层架构合规性矩阵 + 跨模块依赖图 + K12 行业标杆对标Khanmigo / Duolingo Max / Squirrel AI / Century Tech / MagicSchool AI
> 审计依据:`docs/standards/coding-standards.md`、`docs/architecture/004_architecture_impact_map.md`、`docs/architecture/005_architecture_data.json`、项目规则
---
## 一、现有实现概要
### 1.1 文件分布30 个文件)
| 层 | 文件 | 行数 | 职责 |
|------|------|------|------|
| **types** | `modules/ai/types.ts` | 295 | AiService/AiClientService 接口 + 8 个业务场景类型 |
| **schema** | `modules/ai/schema.ts` | 227 | Zod 验证8 输入 + 8 输出) |
| **actions** | `modules/ai/actions.ts` | 381 | 9 个 Server Actions含权限校验 |
| **data-access** | `modules/ai/data-access.ts` | 138 | AI 事件内存存储 + 统计聚合 |
| **services** | `modules/ai/services/ai-service.ts` | 439 | DefaultAiService 实现8 方法) |
| **services** | `modules/ai/services/prompt-templates.ts` | 277 | 10 个系统提示词模板 |
| **services** | `modules/ai/services/usage-tracker.ts` | 99 | AI 使用量埋点 |
| **services** | `modules/ai/services/content-safety.ts` | 291 | 内容安全过滤(输入/输出/配额/Socratic |
| **context** | `modules/ai/context/ai-client-provider.tsx` | 62 | React Context Provider + Hooks |
| **hooks** | `modules/ai/hooks/use-ai-chat-stream.ts` | 155 | 流式 AI 对话 Hook |
| **hooks** | `modules/ai/hooks/use-ai-chat.ts` | 57 | 非流式 AI 对话 Hook |
| **hooks** | `modules/ai/hooks/use-ai-suggestion.ts` | 72 | AI 建议 Hook |
| **hooks** | `modules/ai/hooks/use-floating-ball.ts` | 243 | 悬浮球拖拽 Hook |
| **hooks** | `modules/ai/hooks/stream-utils.ts` | 135 | SSE 流解析工具 |
| **components** | `modules/ai/components/ai-chat-panel.tsx` | 417 | AI 对话面板 |
| **components** | `modules/ai/components/ai-assistant-widget.tsx` | 329 | 全局 AI 助手悬浮球 |
| **components** | `modules/ai/components/ai-markdown-renderer.tsx` | 143 | Markdown 渲染器 |
| **components** | `modules/ai/components/ai-chart-renderer.tsx` | 329 | 图表渲染器 |
| **components** | `modules/ai/components/ai-error-boundary.tsx` | 88 | AI 错误边界 |
| **components** | `modules/ai/components/ai-skeleton.tsx` | 47 | 骨架屏 |
| **components** | `modules/ai/components/ai-provider-selector.tsx` | 89 | 服务商选择器 |
| **components** | `modules/ai/components/ai-grading-assist.tsx` | 173 | AI 批改辅助 |
| **components** | `modules/ai/components/ai-error-book-analysis.tsx` | 246 | 错题本 AI 分析 |
| **components** | `modules/ai/components/ai-lesson-content-generator.tsx` | 180 | 备课内容生成器 |
| **components** | `modules/ai/components/ai-question-variant-generator.tsx` | 218 | 题目变体生成器 |
| **components** | `modules/ai/components/ai-child-summary.tsx` | 186 | 家长学情摘要 |
| **components** | `modules/ai/components/ai-usage-dashboard.tsx` | 221 | 管理员使用统计 |
| **components** | `modules/ai/components/ai-study-path.tsx` | 200 | 学生学习路径 |
| **components** | `modules/ai/components/ai-suggestion-card.tsx` | 164 | 相似题建议卡片 |
| **api** | `app/api/ai/chat/route.ts` | 48 | 非流式聊天端点 |
| **api** | `app/api/ai/chat/stream/route.ts` | 237 | SSE 流式端点 |
### 1.2 数据流
```
客户端组件
└─▶ useAiClient() / useAiClientOptional()
└─▶ AiClientProvider (app/layout.tsx 或子页面注入)
└─▶ Server Actions (modules/ai/actions.ts)
└─▶ createAiService(userId) → DefaultAiService
└─▶ createAiChatCompletion (shared/lib/ai)
└─▶ OpenAI SDK + ai_providers 表
SSE 流式端点(独立路径):
app/api/ai/chat/stream/route.ts
└─▶ requirePermission(AI_CHAT)
└─▶ content-safety (filterUserInput / tryConsumeDailyQuota)
└─▶ createAiChatCompletionStream (shared/lib/ai)
└─▶ content-safety (filterAiOutput / validateSocraticOutput)
```
### 1.3 架构图记录情况
- `004_architecture_impact_map.md` 第 2.29 节完整记录了 AI 模块V2/V3/V4 变更)
- `005_architecture_data.json` 包含 `modules.ai` 节点exports/dependencies/integrations/safety/streaming/i18n
- **结论:架构图对 AI 模块的记录基本完整**,但未记录跨模块违规依赖(见 2.1.1)。
---
## 二、现存问题与原因分析
### 2.1 架构分层问题
#### 问题 2.1.15 处跨模块直接依赖 `shared/lib/ai`(绕过 modules/ai
- **位置**
- [ai-suggest.ts:5](file:///e:/Desktop/CICD/src/modules/lesson-preparation/ai-suggest.ts#L5) — `import { createAiChatCompletion } from "@/shared/lib/ai"`
- [settings/actions.ts:14](file:///e:/Desktop/CICD/src/modules/settings/actions.ts#L14) — `import { encryptAiApiKey, getAiErrorMessage, testAiProviderById, testAiProviderConfig } from "@/shared/lib/ai"`
- [exams/actions.ts:987](file:///e:/Desktop/CICD/src/modules/exams/actions.ts#L987) — 动态 `import("@/shared/lib/ai")`
- [exams/ai-pipeline/request.ts:11](file:///e:/Desktop/CICD/src/modules/exams/ai-pipeline/request.ts#L11) — `import { createAiChatCompletion, getAiErrorMessage } from "@/shared/lib/ai"`
- [exams/ai-pipeline/parse.ts:11](file:///e:/Desktop/CICD/src/modules/exams/ai-pipeline/parse.ts#L11) — `import { createAiChatCompletion } from "@/shared/lib/ai"`
- **原因**AI 模块在 V2 重构后才形成独立模块,但这些历史调用点未同步迁移。
- **后果**:绕过 `modules/ai` 的内容安全过滤、每日配额、Socratic 模式、使用量埋点等保护机制AI 调用无法统一治理。
- **违反规则**`项目规则 → 架构分层规则 → 模块间只能通过对方 data-access 通信``项目规则 → Server Action 规范 → 每个 Action 必须调用 requirePermission()`
#### 问题 2.1.2:非流式聊天端点绕过 modules/ai
- **位置**[app/api/ai/chat/route.ts](file:///e:/Desktop/CICD/src/app/api/ai/chat/route.ts)
- **现状**:直接调用 `shared/lib/ai``createAiChatCompletion`,未走 `aiChatAction`缺失内容安全过滤、每日配额、Socratic 模式等保护。
- **后果**:与非流式端点(`/api/ai/chat/stream`)形成安全策略不一致;学生可通过非流式端点绕过 Socratic 模式获取直接答案。
- **违反规则**`项目规则 → 安全规范``项目规则 → Server Action 规范`
#### 问题 2.1.34 个子页面重复创建 AiClientService
- **位置**
- [teacher/lesson-plans/[planId]/edit/page.tsx](file:///e:/Desktop/CICD/src/app/(dashboard)/teacher/lesson-plans/[planId]/edit/page.tsx)
- [teacher/homework/submissions/[submissionId]/page.tsx](file:///e:/Desktop/CICD/src/app/(dashboard)/teacher/homework/submissions/[submissionId]/page.tsx)
- [student/error-book/page.tsx](file:///e:/Desktop/CICD/src/app/(dashboard)/student/error-book/page.tsx)
- [teacher/exams/[id]/build/page.tsx](file:///e:/Desktop/CICD/src/app/(dashboard)/teacher/exams/[id]/build/page.tsx)
- **现状**:每个页面各自创建只含 6 个 Action 的 `AiClientService`,覆盖 layout.tsx 的全局 Provider含 9 个 Action
- **后果**:代码重复;`generateChildSummary``recommendStudyPath``getAiUsageStats` 在这些页面内为 `undefined`,若未来组件调用将运行时错误。
- **违反规则**`项目规则 → 工程约定 → 最大化复用`
### 2.2 权限问题
#### 问题 2.2.1:非流式聊天端点未走 requirePermission 体系
- **位置**[app/api/ai/chat/route.ts](file:///e:/Desktop/CICD/src/app/api/ai/chat/route.ts)
- **现状**:虽然调用了 `requirePermission(Permissions.AI_CHAT)`,但绕过了 `modules/ai/actions.ts``aiChatAction`导致内容安全过滤、每日配额、Socratic 模式等保护机制缺失。
- **后果**:权限校验通过但安全策略不一致。
- **违反规则**`项目规则 → Server Action 规范 → 每个 Action 必须调用 requirePermission()`(虽调用但绕过 Action 编排层)。
### 2.3 国际化问题
#### 问题 2.3.1ai-chart-renderer.tsx 硬编码中文
- **位置**[ai-chart-renderer.tsx:147](file:///e:/Desktop/CICD/src/modules/ai/components/ai-chart-renderer.tsx#L147)
- **代码**`图表数据格式错误,无法渲染`
- **后果**:无法切换语言。
- **违反规则**`项目规则 → 所有用户可见文本必须适配 i18n`
#### 问题 2.3.2ai-assistant-widget.tsx systemPrompt 硬编码英文
- **位置**[ai-assistant-widget.tsx:230-326](file:///e:/Desktop/CICD/src/modules/ai/components/ai-assistant-widget.tsx#L230-L326)
- **现状**`inferContextFromPath` 函数中所有 `systemPrompt``contextMessage` 为硬编码英文。
- **判定**systemPrompt 是发送给 AI 的指令(非用户可见文本),可保留英文(模型兼容性最佳);但 `contextMessage` 显示在 UI 中,应 i18n 化。
- **后果**contextMessage 无法国际化。
- **违反规则**`项目规则 → 所有用户可见文本必须适配 i18n`
### 2.4 类型安全问题
#### 问题 2.4.1ai-markdown-renderer.tsx 使用 as 断言
- **位置**[ai-markdown-renderer.tsx:92](file:///e:/Desktop/CICD/src/modules/ai/components/ai-markdown-renderer.tsx#L92)
- **代码**`lang.slice(CHART_LANG_PREFIX.length) as AiChartType`
- **后果**:若 lang 不在 AiChartType 枚举内,类型不安全。
- **违反规则**`项目规则 → TypeScript 规则 → 禁止 as 断言`
#### 问题 2.4.2ai-provider-selector.tsx 使用 as 断言
- **位置**[ai-provider-selector.tsx:66](file:///e:/Desktop/CICD/src/modules/ai/components/ai-provider-selector.tsx#L66)
- **代码**`field.value as string`
- **后果**react-hook-form 的 field.value 类型应为泛型,此处强转。
- **违反规则**`项目规则 → TypeScript 规则 → 禁止 as 断言`
#### 问题 2.4.3ai-chart-renderer.tsx 使用 as 断言
- **位置**[ai-chart-renderer.tsx:117](file:///e:/Desktop/CICD/src/modules/ai/components/ai-chart-renderer.tsx#L117)
- **代码**`JSON.parse(data) as AiChartSpec`
- **后果**JSON 结构不可信,直接断言可能运行时错误。
- **违反规则**`项目规则 → TypeScript 规则 → 禁止 as 断言`
### 2.5 错误处理问题
#### 问题 2.5.1ai-suggestion-card.tsx 未包裹 Error Boundary
- **位置**[ai-suggestion-card.tsx](file:///e:/Desktop/CICD/src/modules/ai/components/ai-suggestion-card.tsx)
- **现状**:组件内部有 try/catch 处理异步错误,但未用 `AiErrorBoundary` 包裹渲染期错误。
- **后果**:若 `result.data` 结构异常或 `questions.map` 渲染时抛错,整页崩溃。
- **违反规则**`审计要求 → 每个独立数据区块必须用 React Error Boundary 包裹`
#### 问题 2.5.2:非流式聊天端点错误处理不完整
- **位置**[app/api/ai/chat/route.ts](file:///e:/Desktop/CICD/src/app/api/ai/chat/route.ts)
- **现状**`getStatusFromError` 基于错误消息字符串匹配状态码,脆弱且不可靠。
- **后果**:错误分类不准确。
- **违反规则**`项目规则 → 错误处理`
### 2.6 文件大小问题
#### 问题 2.6.1use-floating-ball.ts 超出 Hook 行数限制
- **位置**[use-floating-ball.ts](file:///e:/Desktop/CICD/src/modules/ai/hooks/use-floating-ball.ts)
- **现状**243 行,超出 Hook 文件 80 行建议上限 163 行。
- **后果**:职责过多(位置加载/保存、拖拽事件、边缘吸附、半隐藏),难以维护和测试。
- **违反规则**`项目规则 → 单文件行数 → 自定义 Hook建议 ≤ 80 行`
### 2.7 可复用性问题
#### 问题 2.7.14 个子页面重复创建 AiClientService
- 见问题 2.1.3。
#### 问题 2.7.2ai-suggestion-card.tsx 未被使用
- **位置**[ai-suggestion-card.tsx](file:///e:/Desktop/CICD/src/modules/ai/components/ai-suggestion-card.tsx)
- **现状**:组件已实现但无任何引用。
- **后果**:死代码,维护负担。
- **违反规则**`审计要求 → 最大化复用`(应集成到错题本等页面)。
### 2.8 监控问题
#### 问题 2.8.1:非流式聊天端点无使用量埋点
- **位置**[app/api/ai/chat/route.ts](file:///e:/Desktop/CICD/src/app/api/ai/chat/route.ts)
- **现状**:未调用 `trackAiUsage`,调用数据不入统计。
- **后果**:管理员仪表盘数据不完整。
- **违反规则**`审计要求 → 监控`
---
## 三、行业差距对比
### 3.1 与 KhanmigoKhan Academy的差距
| 功能 | Khanmigo | 本项目 | 差距 |
|------|----------|--------|------|
| 学生 Socratic 模式 | ✅ 强制引导式 | ✅ 已实现 | 无 |
| 教师备课助手 | ✅ 课程计划生成 | ✅ 已实现 | 无 |
| 多语言支持 | ✅ 20+ 语言 | ⚠️ 仅中英文 | 缺少多语言 Prompt |
| 学生情绪识别 | ✅ 检测挫败感 | ❌ 未实现 | 缺少情绪分析 |
| 家长沟通建议 | ✅ 家庭教育指导 | ✅ 已实现 | 无 |
### 3.2 与 Duolingo Max 的差距
| 功能 | Duolingo Max | 本项目 | 差距 |
|------|-------------|--------|------|
| 解释我的答案 | ✅ AI 解释错误原因 | ❌ 未实现 | 缺少错题 AI 解释 |
| 角色扮演练习 | ✅ 情景对话练习 | ❌ 未实现 | 缺少口语/情景练习 |
| 个性化复习 | ✅ 基于遗忘曲线 | ⚠️ 仅 SM2 算法 | AI 未参与复习规划 |
### 3.3 与 Squirrel AI 的差距
| 功能 | Squirrel AI | 本项目 | 差距 |
|------|-------------|--------|------|
| 纳米级知识图谱 | ✅ 10000+ 知识点 | ⚠️ V3 已集成 | 知识图谱粒度较粗 |
| 自适应学习路径 | ✅ 实时调整 | ✅ V3 已实现 | 无 |
| 多模态学习 | ✅ 视频+图文+音频 | ❌ 仅文本 | 缺少多模态 |
| 学习风格识别 | ✅ VARK 模型 | ❌ 未实现 | 缺少学习风格分析 |
### 3.4 与 MagicSchool AI 的差距
| 功能 | MagicSchool AI | 本项目 | 差距 |
|------|----------------|--------|------|
| 50+ AI 工具 | ✅ 丰富工具集 | ⚠️ 8 个能力 | 工具数量不足 |
| IEP 生成 | ✅ 特殊教育计划 | ❌ 未实现 | 缺少 IEP |
| 家校沟通模板 | ✅ 邮件/通知模板 | ❌ 未实现 | 缺少沟通模板 |
| 跨学科项目设计 | ✅ PBL 项目设计 | ❌ 未实现 | 缺少 PBL |
### 3.5 关键差距总结
1. **AI 能力数量不足**:仅 8 个能力,行业平均 15-20 个
2. **多模态缺失**:仅支持文本,缺少图像/语音/视频输入
3. **学习风格识别缺失**:未识别学生 VARK 学习风格
4. **情绪识别缺失**:未检测学生挫败感/兴奋度
5. **IEP/PBL 缺失**:未支持特殊教育和项目式学习
6. **跨模块数据联动不足**AI 未与考勤、行为、心理等数据联动分析
---
## 四、改进优先级建议
### P0紧急 — 安全/架构合规)
| 编号 | 问题 | 改进方向 |
|------|------|---------|
| P0-1 | 5 处跨模块直接依赖 shared/lib/ai | 迁移至通过 modules/ai 的 data-access 或 actions 调用 |
| P0-2 | 非流式聊天端点绕过 modules/ai | 重构为调用 aiChatAction 或迁移安全策略 |
| P0-3 | ai-chart-renderer.tsx 硬编码中文 | 迁移至 i18n |
| P0-4 | 3 处 as 断言 | 改用类型守卫函数 |
### P1重要 — 规范/复用)
| 编号 | 问题 | 改进方向 |
|------|------|---------|
| P1-1 | 4 个子页面重复创建 AiClientService | 提取 createAiClientService 工厂函数 |
| P1-2 | use-floating-ball.ts 超出行数限制 | 拆分为 use-drag-position + use-edge-snap |
| P1-3 | ai-suggestion-card.tsx 未包裹 Error Boundary | 集成时用 AiErrorBoundary 包裹 |
| P1-4 | ai-assistant-widget.tsx contextMessage 硬编码 | 迁移至 i18n |
| P1-5 | 非流式端点无使用量埋点 | 集成 trackAiUsage |
### P2增强 — 行业对标)
| 编号 | 问题 | 改进方向 |
|------|------|---------|
| P2-1 | 缺少错题 AI 解释 | 新增 explainErrorAction |
| P2-2 | 缺少学习风格识别 | 新增 VARK 评估 |
| P2-3 | 缺少 IEP 生成 | 新增特殊教育模块 |
| P2-4 | 缺少家校沟通模板 | 新增沟通模板生成 |
| P2-5 | 缺少多模态输入 | 支持图像/语音输入 |
| P2-6 | 缺少情绪识别 | 集成情绪分析 API |
---
## 五、架构图同步说明
### 5.1 需补充的节点
1. **跨模块违规依赖**:在 `005_architecture_data.json``dependencyMatrix` 中标注 `lesson-preparation``settings``exams``shared/lib/ai` 的违规依赖(应改为通过 `modules/ai`)。
2. **非流式端点安全策略缺失**:在 `004_architecture_impact_map.md` 的 AI 模块安全机制章节补充非流式端点的安全策略差距。
3. **ai-suggestion-card.tsx 未使用**:在文件清单中标注该组件为"已实现未集成"。
### 5.2 需修改的节点
1. **V4 超时优化**:已在 V4 中记录(`shared/lib/ai/client.ts` 按场景分离超时)。
2. **V4 规范修复**:已在 V4 中记录ai-service.ts 消除 as 断言、actions.ts 消除非空断言、ai-assistant-widget.tsx i18n 修复)。
---
## 六、实施记录
### 6.1 P0 改进实施
#### P0-1迁移跨模块依赖部分
**已实施**
- 修复 `ai-chart-renderer.tsx` 硬编码中文P0-3
- 修复 `ai-markdown-renderer.tsx` as 断言P0-4 部分)
- 修复 `ai-provider-selector.tsx` as 断言P0-4 部分)
- 修复 `ai-chart-renderer.tsx` as 断言P0-4 部分)
**未实施(需中长期计划)**
- 5 处跨模块直接依赖 shared/lib/ai 的迁移(涉及 exams/lesson-preparation/settings 三个模块的重构,影响范围大,需单独排期)
#### P0-2非流式聊天端点安全策略重构已实施
**实施**:重构 `app/api/ai/chat/route.ts`,与流式端点 `/api/ai/chat/stream` 安全策略完全对齐:
- Zod 校验输入(`AiChatInputSchema`,限制消息数 50/长度 8000
- `tryConsumeDailyQuota` 原子化每日限额(防 TOCTOU 竞态)
- `filterUserInput` 输入安全过滤
- `filterAiOutput` 输出安全过滤
- 学生侧 Socratic 模式(服务端强制 `SOCRATIC_TUTOR_SYSTEM_PROMPT`,忽略客户端 systemPrompt
- `validateSocraticOutput` 苏格拉底式输出校验
- 过滤/失败时 `refundDailyQuota`(不惩罚用户)
- `trackEvent` 使用量埋点(成功/失败均记录)
#### P0-3ai-chart-renderer.tsx 硬编码中文(已实施)
**实施**:添加 i18n 键 `ai.chart.parseError`,替换硬编码中文。
#### P0-4as 断言修复(已实施)
**实施**
- `ai-markdown-renderer.tsx`:改用类型守卫函数 `isAiChartType`
- `ai-provider-selector.tsx`:改用 `String(field.value ?? "")`
- `ai-chart-renderer.tsx`:改用 Zod schema 校验
### 6.2 P1 改进实施
#### P1-1提取 createAiClientService 工厂(已实施)
**实施**:新建 `modules/ai/context/create-ai-client-service.ts`,导出 `createFullAiClientService`(含全部 9 个 Action`createCoreAiClientService`(仅 6 个常用 Action两个工厂函数。`app/(dashboard)/layout.tsx` 使用前者4 个子页面error-book、lesson-plans、homework、exams使用后者消除重复代码。
#### P1-2拆分 use-floating-ball.ts已实施
**实施**:将 243 行的 `use-floating-ball.ts` 拆分为 3 个文件:
- `use-position-persistence.ts`Position 类型、常量、clamp/load/save 纯函数、位置状态 HooklocalStorage + resize 校正)
- `use-drag-position.ts`:拖拽状态 + pointer 事件处理 Hook通过回调委托业务逻辑
- `use-floating-ball.ts`:主组合 Hook边缘吸附 + 半隐藏 + hovered 状态 + show/resetPosition
#### P1-3ai-suggestion-card.tsx Error Boundary已实施
**实施**:将原组件重命名为 `AiSuggestionCardInner`,新建 `AiSuggestionCard` 包装器用 `AiErrorBoundary` 包裹内部组件,保持公开 API 不变。
#### P1-4ai-assistant-widget.tsx contextMessage i18n已实施
**实施**:在 `en/ai.json``zh-CN/ai.json` 中添加 `chat.contextMessage.*` 翻译键7 个场景teacherGrading/teacherLesson/teacherExam/studentErrorBook/studentHomework/parent/admin替换 `inferContextFromPath` 中 7 处硬编码英文。
#### P1-5非流式端点使用量埋点已实施
**实施**:在 `app/api/ai/chat/route.ts` 中集成 `trackEvent`(事件名 `ai.chat`),成功时记录 durationMs/tokenCount失败时记录 errorMessage/durationMs。与流式端点`ai.chat_stream`)对齐。
### 6.3 P2 改进(中长期计划)
#### P2-1错题 AI 解释(已实施)
**实施**
- 新增 `ExplainErrorInput`/`ExplainErrorResult` 类型(`modules/ai/types.ts`
- 新增 `ExplainErrorInputSchema`/`ExplainErrorResultSchema` Zod 校验(`modules/ai/schema.ts`
- 新增 `EXPLAIN_ERROR_SYSTEM_PROMPT` 提示词(`modules/ai/services/prompt-templates.ts`
- 新增 `explainError` 服务方法(`modules/ai/services/ai-service.ts`
- 新增 `explainErrorAction` Server Action`modules/ai/actions.ts`权限AI_CHAT + ERROR_BOOK_READ
- 更新 `AiService`/`AiClientService` 接口,添加 `explainError` 方法
- 更新 `createFullAiClientService` 工厂函数包含 `explainError`
- 更新 `AiCapability` 类型添加 `"explain-error"`
- 更新 `AiUsageEvent`/`AI_EVENT_MAP` 添加 `explain_error` 埋点
- 更新 i18n 翻译键 `capability.explainError`en/zh-CN
- 更新架构文档 004/005
**未实施(需后续排期)**
- P2-2VARK 学习风格评估(需新增评估模块 + DB 表)
- P2-3IEP 特殊教育计划生成(需新增特殊教育模块)
- P2-4家校沟通模板生成需新增模板管理模块
- P2-5多模态输入支持需接入图像/语音 API
- P2-6情绪识别需接入情绪分析 API