# 知习 AI 架构 V1:决策与执行清单 > **2026-05-16 已确认并完成**:三层架构(Provider → Gateway → Workflow),阶段 0 全部完成。 > 设计方向文档:[AI架构设计.md](./[设计中]-AI架构设计.md) > > **状态:✅ 阶段 0 完成 | 阶段 1 基本完成 | 阶段 2 待推进** --- # 一、架构原则 ## 核心分层 ```text 业务模块层(ActiveRecall / ai-analysis) ↓ 调用 AI Workflow 层(ActiveRecallAnalysisWorkflow) ↓ 调用 AI Gateway 层(AiGatewayService:选模型、记日志、解析 JSON、超时重试) ↓ 调用 AI Provider 层(DeepSeekProvider / MiniMaxProvider / MockAiProvider) ``` **每一层的职责边界**: | 层 | 知道什么 | 不知道什么 | |----|---------|-----------| | Provider | messages, model, temperature, signal | 知识点、主动回忆、FocusItem | | Gateway | feature, promptVersion, cost, retry | 业务 Workflow 细节 | | Workflow | 知识点、回答、分析逻辑 | 模型 API 细节 | | 业务模块 | 自己的 CRUD | AI 调用细节 | --- # 二、已确认决策(全部实现) | 编号 | 决策 | 结论 | 状态 | |------|------|------|------| | A | 架构分层 | Provider → Gateway → Workflow 三层 | ✅ | | B | Mock 保留 | Mock 跑通闭环,永久保留 | ✅ | | C | 第一个 Provider | DeepSeek(V4-Flash 便宜,V4-Pro 强推理) | ✅ | | D | 第二个 Provider | MiniMax M2.7(Coding Plan 已付费,主力分析) | ✅ | | E | Model Router | 三层:cheap / primary / strong,显式 fallback | ✅ | | F | Gateway 超时 | AbortController 30s + 自动重试 + fallback | ✅ | | G | Prompt 管理 | 代码文件 + promptKey / promptVersion 追踪 | ✅ | | H | JSON 校验 | Zod Schema + 三层容错(parse → fence → extract) | ✅ | | I | 成本控制 | AiUsageLog + AiCostCalculatorService | ✅ | | J | 旧代码清理 | 删除 infrastructure/ai,ai-analysis 迁到新 gateway | ✅ | --- # 三、当前文件结构 ``` src/modules/ai/ ├── ai.module.ts # NestJS DI:Map ├── ai.controller.ts # POST /ai/analyze-recall · GET /ai/models ├── model-router.ts # cheap / primary / strong 三档路由 ├── gateway/ │ ├── ai-gateway.types.ts # GatewayRequest / GatewayResponse / ModelTier │ └── ai-gateway.service.ts # 统一入口:选模型、30s超时、重试、JSON三层容错、记日志 ├── providers/ │ ├── ai-provider.interface.ts # AiGenerateInput(signal) / AiGenerateOutput │ ├── mock-ai.provider.ts # 永久保留,返回 simulated 分析结果 │ ├── deepseek.provider.ts # DeepSeek API(OpenAI 兼容) │ └── minimax.provider.ts # MiniMax M2.7(OpenAI 兼容) ├── prompts/ │ ├── prompt-template.service.ts # key + version 注册表 │ ├── active-recall-analysis.prompt.ts # System Prompt │ └── schemas/ │ └── active-recall-analysis.schema.ts # Zod Schema + JSON 输出示例 ├── usage/ │ ├── ai-cost-calculator.service.ts # 按模型计算费用 │ └── ai-usage-log.service.ts # 写 AiUsageLog └── workflows/ └── active-recall-analysis.workflow.ts # 第一个 Workflow:主动回忆分析 ``` ## 关联模块 ``` src/modules/ai-analysis/ # 导入 AiModule,用 ActiveRecallAnalysisWorkflow ├── ai-analysis.module.ts ├── ai-analysis.controller.ts # POST /ai-analysis · GET /ai-analysis/:id ├── ai-analysis.service.ts └── ai-analysis.repository.ts src/modules/active-recall/ # 导入 AiModule,提交答案异步触发分析 ├── active-recall.module.ts ├── active-recall.controller.ts # POST /active-recalls/:id/submit ├── active-recall.service.ts └── active-recall.repository.ts src/infrastructure/ai/ # ❌ 已删除(旧 AiService + 旧 MockAiProvider) ``` --- # 四、数据流(主动回忆分析) ```text 1. POST /active-recalls/:id/submit ↓ 2. ActiveRecallService.submit() 保存回答 + 异步 analysisWorkflow.execute() ↓ 3. ActiveRecallAnalysisWorkflow.execute({ userId, questionText, knowledgeItemContent, userAnswer }) ↓ 4. PromptTemplateService.get('active-recall-analysis', '1.0.0') ↓ 5. AiGatewayService.generate({ feature, userId, tier:'primary', promptKey, messages, outputSchema }) ↓ 6. ModelRouter.resolve('primary') → minimax-m2.7(fallback: deepseek-v4-pro) ↓ 7. Provider.generate() + AbortController(30s) → fetch() ↓ 8. JSON 三层容错:直接 parse → 提取 markdown fence → 提取 { } 对象 ↓ 9. Zod Schema 校验 → ActiveRecallAnalysisResult ↓ 10. AiUsageLogService.log() 记 tokens / cost / latency ↓ 11. GatewayResponse { parsed, usage } ↓ 12. Workflow 返回 ActiveRecallAnalysisResult ``` --- # 五、数据库 ## AiUsageLog(已加入 schema,待 db push) ```prisma model AiUsageLog { id String @id @default(cuid()) userId String feature String @db.VarChar(64) provider String @db.VarChar(32) model String @db.VarChar(100) tier String @db.VarChar(32) promptKey String @db.VarChar(128) promptVersion String @db.VarChar(32) inputTokens Int @default(0) outputTokens Int @default(0) estimatedCost Float @default(0) latencyMs Int @default(0) success Boolean @default(true) errorMessage String? @db.VarChar(500) createdAt DateTime @default(now()) user User @relation(fields: [userId], references: [id]) @@index([userId]) @@index([feature]) @@index([createdAt]) } ``` > ⚠️ `prisma db push` 待 SSH 隧道连通后执行 --- # 六、可执行任务状态 ## 阶段 0:AI 地基 ✅ 14/14 | # | 任务 | 状态 | |---|------|------| | 1 | AiUsageLog 表(prisma schema) | ✅ | | 2 | 统一 AiProvider 接口(generate + signal) | ✅ | | 3 | ModelRouter(cheap / primary / strong) | ✅ | | 4 | AiGatewayService(统一入口 + JSON 容错 + 超时重试) | ✅ | | 5 | PromptTemplateService(key + version) | ✅ | | 6 | DeepSeekProvider | ✅ | | 7 | MiniMaxProvider | ✅ | | 8 | Zod Schema(ActiveRecallAnalysisResult) | ✅ | | 9 | AiUsageLogService + AiCostCalculatorService | ✅ | | 10 | ActiveRecallAnalysisWorkflow | ✅ | | 11 | AiModule(DI 注入) | ✅ | | 12 | AiController(analyze-recall / models) | ✅ | | 13 | MockAiProvider(保留不动) | ✅ | | 14 | 删除旧 infrastructure/ai | ✅ | ## 阶段 1:集成打通 ✅ 4/6 | # | 任务 | 状态 | |---|------|------| | 15 | ai-analysis 改用 ActiveRecallAnalysisWorkflow | ✅ | | 16 | ai-analysis.module 导入 AiModule | ✅ | | 17 | active-recall 提交答案触发分析 | ✅ | | 18 | Gateway AbortController 30s 超时 | ✅ | | 19 | prisma db push 建 AiUsageLog 表 | ⚠️ 等隧道 | | 20 | 真实 AI 切换 + Prompt 调优 | ⏳ 后续 | ## 阶段 2:待推进 | # | 任务 | |---|------| | 21 | 11 个业务 Repository:in-memory Map → Prisma | | 22 | 所有 Controller 加 JwtAuthGuard | | 23 | 真实 AI 联调 + 样本测试 + Prompt 调优 | | 24 | 更多 Workflow(知识导入、费曼分析、复习卡片、长期趋势) | --- # 七、一句话总结 ```text DeepSeek 只是第一个模型,不是 AI 架构本身。 知习现在有了「可替换模型、可追踪成本、可校验输出、可沉淀学习结果」的三层 AI 工作流架构: Provider → Gateway → Workflow。 阶段 0 全部完成,阶段 1 基本完成。 ```