startup-plan/技术设计/api-server/已完成/[已完成]-AI架构决策清单.md

214 lines
7.8 KiB
Markdown
Raw Normal View History

# 知习 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 | DeepSeekV4-Flash 便宜V4-Pro 强推理) | ✅ |
| D | 第二个 Provider | MiniMax M2.7Coding 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/aiai-analysis 迁到新 gateway | ✅ |
---
# 三、当前文件结构
```
src/modules/ai/
├── ai.module.ts # NestJS DIMap<string, AiProvider>
├── 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 APIOpenAI 兼容)
│ └── minimax.provider.ts # MiniMax M2.7OpenAI 兼容)
├── 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.7fallback: 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 隧道连通后执行
---
# 六、可执行任务状态
## 阶段 0AI 地基 ✅ 14/14
| # | 任务 | 状态 |
|---|------|------|
| 1 | AiUsageLog 表prisma schema | ✅ |
| 2 | 统一 AiProvider 接口generate + signal | ✅ |
| 3 | ModelRoutercheap / primary / strong | ✅ |
| 4 | AiGatewayService统一入口 + JSON 容错 + 超时重试) | ✅ |
| 5 | PromptTemplateServicekey + version | ✅ |
| 6 | DeepSeekProvider | ✅ |
| 7 | MiniMaxProvider | ✅ |
| 8 | Zod SchemaActiveRecallAnalysisResult | ✅ |
| 9 | AiUsageLogService + AiCostCalculatorService | ✅ |
| 10 | ActiveRecallAnalysisWorkflow | ✅ |
| 11 | AiModuleDI 注入) | ✅ |
| 12 | AiControlleranalyze-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 个业务 Repositoryin-memory Map → Prisma |
| 22 | 所有 Controller 加 JwtAuthGuard |
| 23 | 真实 AI 联调 + 样本测试 + Prompt 调优 |
| 24 | 更多 Workflow知识导入、费曼分析、复习卡片、长期趋势 |
---
# 七、一句话总结
```text
DeepSeek 只是第一个模型,不是 AI 架构本身。
知习现在有了「可替换模型、可追踪成本、可校验输出、可沉淀学习结果」的三层 AI 工作流架构:
Provider → Gateway → Workflow。
阶段 0 全部完成,阶段 1 基本完成。
```