# 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.1:5 处跨模块直接依赖 `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.3:4 个子页面重复创建 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.1:ai-chart-renderer.tsx 硬编码中文 - **位置**:[ai-chart-renderer.tsx:147](file:///e:/Desktop/CICD/src/modules/ai/components/ai-chart-renderer.tsx#L147) - **代码**:`图表数据格式错误,无法渲染` - **后果**:无法切换语言。 - **违反规则**:`项目规则 → 所有用户可见文本必须适配 i18n`。 #### 问题 2.3.2:ai-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.1:ai-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.2:ai-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.3:ai-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.1:ai-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.1:use-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.1:4 个子页面重复创建 AiClientService - 见问题 2.1.3。 #### 问题 2.7.2:ai-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 与 Khanmigo(Khan 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-3:ai-chart-renderer.tsx 硬编码中文(已实施) **实施**:添加 i18n 键 `ai.chart.parseError`,替换硬编码中文。 #### P0-4:as 断言修复(已实施) **实施**: - `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 纯函数、位置状态 Hook(localStorage + resize 校正) - `use-drag-position.ts`:拖拽状态 + pointer 事件处理 Hook(通过回调委托业务逻辑) - `use-floating-ball.ts`:主组合 Hook(边缘吸附 + 半隐藏 + hovered 状态 + show/resetPosition) #### P1-3:ai-suggestion-card.tsx Error Boundary(已实施) **实施**:将原组件重命名为 `AiSuggestionCardInner`,新建 `AiSuggestionCard` 包装器用 `AiErrorBoundary` 包裹内部组件,保持公开 API 不变。 #### P1-4:ai-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-2:VARK 学习风格评估(需新增评估模块 + DB 表) - P2-3:IEP 特殊教育计划生成(需新增特殊教育模块) - P2-4:家校沟通模板生成(需新增模板管理模块) - P2-5:多模态输入支持(需接入图像/语音 API) - P2-6:情绪识别(需接入情绪分析 API)