Files
Edu/services/ai/docs/01-understanding.md
SpecialX faaaf29f67 docs: ai 协作文档体系重构与多 ai 仲裁结果落地
1.AI 协作文档体系重构(objections/worklines/contracts+matrix.md)

2.coord 仲裁文档(final-decisions/cross-review/final-rulings/orchestration)

3.各服务 01/02 文档补全

4.共享包初始化(shared-ts/shared-go/hooks/ui-components/ui-tokens)

5.Proto 契约补全

6.004 架构影响地图更新

7.端口分配表

8.设计规格文档
2026-07-10 12:58:22 +08:00

385 lines
36 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
> AI 标识ai12复核与长期演进接手← ai06初稿2026-07-09
> 负责模块aiP5— 按 [ai-allocation.md §3.2](../../../docs/architecture/ai-allocation.md) v1.0 最新分配ai 由 ai12 专责
> 语言Python 3.12+ / FastAPI 0.115+
> 阶段:架构设计外包 · 阶段 1全局理解ai06 初稿 + ai12 长期演进复核)
> 日期2026-07-09ai06 初稿)/ 2026-07-09ai12 复核与补充)
> 关联文档:[ai-allocation.md](../../../docs/architecture/ai-allocation.md)、[004 架构影响地图](../../../docs/architecture/004_architecture_impact_map.md)、[pending-features.md](../../../docs/architecture/roadmap/pending-features.md)、[coord 交叉审查报告](../../../docs/architecture/coord-cross-review.md)、[known-issues.md](../../../docs/troubleshooting/known-issues.md)
>
> **ai12 接手说明**:本确认书初稿由 ai06 在 ai-allocation v0.x 阶段ai06 同时负责 data-ana + ai撰写。ai-allocation.md v1.0 将 ai 模块独立分配给 ai12。ai12 在 ai06 初稿基础上执行作者归属更正、长期架构演进补充、P5 交付物覆盖度核对、向前兼容性铺垫。**所有 ai12 新增内容用「ai12 增补」标注**ai06 原文保留并标注「ai06 初稿」。
---
## 阶段 1 必读清单完成确认
按 ai-allocation.md §4ai12 必读 7 份全局文档 + 全部 `.proto` + `services/data-ana/``services/ai/` 骨架源码:
| # | 文档 | 状态 |
| --- | ------------------------------------------------------------------------------------ | ----------------------------------------------------------------------------------- |
| 1 | [README.md](../../../README.md) | ✅ 已读 |
| 2 | [MIGRATION_GUIDE.md](../../../MIGRATION_GUIDE.md) | ✅ 已读 |
| 3 | [004 架构影响地图](../../../docs/architecture/004_architecture_impact_map.md) | ✅ 已读(重点 §1.2/§4.1/§4.2/§7.2/§9.3/§11.5/§12.2/§15 |
| 4 | [pending-features.md](../../../docs/architecture/roadmap/pending-features.md) | ✅ 已读(重点 P5 沟通与 AI 阶段) |
| 5 | [project_rules.md](../../../.trae/rules/project_rules.md) | ✅ 已读workspace 规则,重点 §3.6 Python/§6 事件驱动/§9 问题记录/§10 AI 工作流程) |
| 6 | [coding-standards.md](../../../docs/standards/coding-standards.md) | ✅ 已读(重点 §4 Python 规范) |
| 7 | [multi-ai-collaboration.md](../../../docs/standards/multi-ai-collaboration.md) | ✅ 已读 |
| 8 | `packages/shared-proto/proto/*.proto`8 份) | ✅ 已读(重点 ai.proto/analytics.proto/content.proto/events.proto |
| 9 | `services/ai/src/` 全部源码main.py/config.py/llm_client.py/health/health.py | ✅ 已读 |
| 10 | `services/data-ana/src/` 全部源码(参考 Python 服务实现模式 + 跨服务 gRPC 契约对齐) | ✅ 已读ai12 增补:跨服务 gRPC 契约对齐用) |
| 11 | [coord 交叉审查报告](../../../docs/architecture/coord-cross-review.md) | ✅ 已读ai12 增补:理解 7 项已仲裁共性问题) |
> ai12 与 ai06 不同ai-allocation.md v1.0 §4 矩阵 ai06 列对黄金模板为 "—"ai12 列同为 "—"Python 服务无需对照 TS 黄金模板),但需对照 `services/data-ana/` 作为 Python 服务实现参考lifespan/structlog/OTel/metrics 模式)。
---
## 1. 我在架构中的位置
### 1.1 架构定位ai06 初稿 + ai12 增补)
- **层级**业务微服务层L5**D6 智能洞察领域**004 §1.1b,与 data-ana 共享领域)
- **领域细分**ai12 增补D6 内部分两个子域
- **D6.a 分析子域**data-ana 负责):基于历史数据计算学情、掌握度、趋势
- **D6.b 生成子域**ai 负责):基于学情上下文 + LLM 推理生成教学内容
- 两子域通过 gRPC 同步查询耦合,构成"分析→生成"闭环
- **上游**
- api-gateway 直接 HTTP 代理 `/api/v1/ai/*` → ai:3008见 [api-gateway main.go](../../api-gateway/main.go)
- teacher-bff 聚合 AI 出题/优化能力004 §4.1BFF → aiP5 起转 gRPC
- **ai12 增补**student-bffP3+/ parent-bffP4+)未来可能调用 AI 服务用于学生自适应学习、家长学情报告 AI 解读
- **下游**
- content 服务gRPC 查询知识点 / 题库004 §4.1AI → Content gRPC
- data-ana 服务gRPC 查询学情数据004 §4.1AI → DataAna gRPC
- LLM Provider外部 HTTPOpenAI 兼容 REST API
- **ai12 增补**iam 服务gRPC 查询 `GetEffectiveDataScope`,用于多租户/多学校用量配额校验;当前 iam.proto 未提供此 RPCcoord 已仲裁 P4 补全)
- **ai12 增补**msg 服务Kafka 事件 `edu.notification.events` 由 msg 消费ai 不直接调用;但 AI 异常告警可能走 msg 推送给管理员,长期可考虑)
- **通信方式**
- 入口:当前 REST`/ai/chat``/ai/chat/stream``/ai/generate/question``/ai/optimize/expression`目标态ai.proto**gRPC** 暴露 `AiService`(含 `StreamChat` 流式 RPC004 §4.2 明确 P5 启用
- 出口gRPC 调 content / data-ana**当前未实现,仅 LLM HTTP 调用**SSE 流式对前端Kafka 事件外发用量计费
- **端口**3008HTTP+ 50058gRPC**ai12 增补**004 §1.2 gRPC 端口规则 `HTTP+10050`,需在 §1.2 端口矩阵补登,提请 coord 同步)
### 1.2 服务边界与无状态原则ai12 增补)
ai 是**严格无状态服务**,这与 data-ana 的"无 MySQL 写但有 ClickHouse 读模型"形成鲜明对比。无状态原则的含义与边界:
| 维度 | ai无状态 | data-ana有读模型 |
| ---------- | ----------------------------------------------------- | ----------------------------------------- |
| 持久化存储 | 无独占 DB | ClickHouse 宽表(读模型) |
| 会话状态 | 单次请求内(无跨请求会话,聊天历史由前端维护) | 无 |
| 缓存 | RedisPrompt 模板、限流计数、响应缓存) | RedisDataScope 缓存) |
| 事件发布 | `AIUsageRecorded`(派生数据,豁免 Outbox004 §12.2 | `MasteryUpdated`(派生数据,豁免 Outbox |
| 水平扩展 | 直接加副本,无状态同步问题 | CDC 消费者需 consumer group 协调 |
**无状态原则的例外**(需 coord 长期跟踪):
- 长运行工作流(备课工作流的"教师审核"步骤可能跨越数小时甚至数天的状态需持久化不能依赖内存。ai12 提请 coord 在 P6 评估引入 Temporal 或自建 workflow_state 表(详见 02-architecture-design.md §2.4
## 2. 我的限界上下文
### 2.1 聚合职责ai06 初稿 + ai12 增补)
- **聚合职责**LLM 调用网关 + 教学场景 AI 编排(备课 / 出题 / 表达优化),承载 **D6 智能洞察领域**的"生成"子域
- **聚合根 / 实体**
- `ChatConversation`(聊天会话,**待实现**,当前无状态)
- `GeneratedQuestion`(生成的题目,待审核入库)
- `PromptTemplate`Prompt 模板,**待实现**
- `UsageRecord`(用量计费记录,**待实现**,通过事件外发不落本服务 DB
- **ai12 增补**`LessonPreparationWorkflow`(备课工作流实例,长运行状态需持久化)
- **ai12 增补**`EvaluationResult`(生成结果质量评估结果,待实现,用于 RLHF 数据收集与质量门禁)
- **业务领域**D6 智能洞察(与 data-ana 共享data-ana 偏"分析"ai 偏"生成"
- **我不负责**
- 不负责题库存储(→ content 服务ai 生成后调 content.CreateQuestions 入库)
- 不负责学情计算(→ data-ana 服务ai 查询学情用于个性化出题)
- 不负责通知投递(→ msg 服务)
- 不负责用户身份认证(→ iam + Gatewayai 信任 `x-user-id`/`x-user-roles` 头)
- **ai12 增补**:不负责教学大纲管理(→ content 服务的 Textbook/Chapter/KnowledgePoint
- **ai12 增补**:不负责学生作业批改(→ core-eduai 仅生成题目与解析,不批改学生作答)
- **数据自治****无独占数据库**(设计上无状态;用量计费通过 Kafka 事件外发;长运行工作流状态待 P6 决策是否引入持久化)
### 2.2 ai12 增补:与 content / data-ana / msg 的边界精细化
为避免未来跨服务职责漂移,明确以下边界(参考 004 §1.1b D6/D4/D5 划分):
| 业务能力 | 归属服务 | 边界说明 |
| -------------------- | ---------- | ----------------------------------------------------------------- |
| 题目生成LLM 调用) | ai | ai 调 LLM 生成题目文本,返回给 BFF不入 content 题库 |
| 题目入库 | content | BFF 拿 ai 生成的题目 → 调 content.CreateQuestions 入库 |
| 知识点前置依赖查询 | content | ai 调 content.KnowledgeGraphService.GetPrerequisites |
| 学生学情查询 | data-ana | ai 调 data-ana.AnalyticsService.GetStudentWeakness |
| 班级整体学情查询 | data-ana | ai 调 data-ana.AnalyticsService.GetClassPerformance |
| 生成结果质量评估 | ai | ai 内部 LLM-as-judge / 规则校验,不外发 |
| 用量计费落库 | data-ana | ai 发 `edu.insight.ai.usage` 事件data-ana 消费落 ClickHouse |
| AI 异常告警通知 | msg | ai 异常 → 日志 + metrics告警由 Prometheus Alertmanager 触发 msg |
| 教师审核备课结果 | BFF + 前端 | ai 仅生成与暂存Redis 短期),审核状态由 BFF 编排 |
## 3. 我与外部的契约
### 3.1 消费的 proto messageai06 初稿 + ai12 增补)
| 来源 | message / service | 用途 | 状态 |
| --------------- | ---------------------------------------------------------- | ----------------------------------------- | ------------------------- |
| content.proto | `KnowledgeGraphService.GetPrerequisites` | 查询知识点前置依赖用于出题上下文 | proto 已定义 |
| content.proto | `KnowledgeGraphService.GetLearningPath` | 查询学生学习路径用于个性化出题 | proto 已定义 |
| content.proto | `TextbookService.ListTextbooks` | 查询教材上下文(章节关联知识点) | proto 已定义ai12 增补) |
| analytics.proto | `AnalyticsService.GetStudentWeakness` | 查询学生薄弱知识点用于靶向出题 | proto 已定义 |
| analytics.proto | `AnalyticsService.GetLearningTrend` | 查询学习趋势用于难度调节 | proto 已定义 |
| analytics.proto | `AnalyticsService.GetClassPerformance` | 查询班级整体学情用于备课工作流 | proto 已定义ai12 增补) |
| iam.proto | `IamService.GetEffectiveDataScope`**待 coord P4 补全** | 查询用户 DataScope 用于多学校用量配额校验 | proto 待补全ai12 增补) |
| ai.proto | `ChatRequest` 等 | gRPC 暴露契约(**待实现 gRPC server** | proto 已定义 |
### 3.2 暴露的 API / 事件
**HTTP 端点**(当前实现,见 [main.py](../src/ai/main.py)
| method | path | 说明 |
| ------ | ------------------------- | ---------------------------- |
| GET | `/healthz` | liveness |
| GET | `/readyz` | readiness含 LLM 是否配置) |
| GET | `/metrics` | Prometheus 指标 |
| POST | `/ai/chat` | LLM 聊天(非流式) |
| POST | `/ai/chat/stream` | LLM 流式聊天SSE |
| POST | `/ai/generate/question` | 生成题目 |
| POST | `/ai/optimize/expression` | 优化表达 |
**ai12 增补:待新增 HTTP 端点**P5 交付):
| method | path | 说明 |
| ------ | ------------------------------------- | ---------------------------------------------- |
| POST | `/ai/lesson/preparation` | 备课工作流启动(分析学情→推荐知识点→生成题目) |
| GET | `/ai/lesson/preparation/{id}` | 查询备课工作流状态(异步流程) |
| POST | `/ai/lesson/preparation/{id}/confirm` | 教师确认入库(触发 content.CreateQuestions |
| GET | `/ai/prompts` | Prompt 模板列表CRUD |
| POST | `/ai/prompts` | 创建 Prompt 模板 |
| PUT | `/ai/prompts/{id}` | 更新 Prompt 模板(版本化) |
| GET | `/ai/usage/me` | 当前用户用量统计(短期查询,长期查 data-ana |
**gRPC 契约**ai.proto**待实现 server**
- `Chat(ChatRequest) → ChatResponse`
- `StreamChat(ChatRequest) → stream ChatChunk`(流式 RPC
- `GenerateQuestion(GenerateQuestionRequest) → GeneratedQuestion`
- `OptimizeExpression(OptimizeExpressionRequest) → OptimizedExpression`
**ai12 增补proto 待补全项**(提请 coord 在 P5 前补全):
- `GenerateLessonPlan(GenerateLessonPlanRequest) → LessonPlanResponse`:备课工作流 RPC
- `StreamGenerateQuestion(...) → stream GeneratedQuestionChunk`:题目逐字流式生成(满足 ai-allocation.md §5 "题目逐字生成"
- `ChatRequest` 增加可选字段:`user_id`(透传,用于个性化)、`session_id`(用于多轮对话上下文)、`data_scope`(透传 DataScope 元数据)
- `GenerateQuestionRequest` 增加字段:`grade``knowledge_point_ids``question_type``count`
**ai12 增补:发布的领域事件**
- 当前无发布ai06 初稿)
- 设计上发布 `AIUsageRecorded` 事件(用量计费),由 data-ana 消费落 ClickHouse。**004 §7.2 已确认 topic `edu.insight.ai.usage`**coord 仲裁已通过§15.3 #4
- **ai12 增补:长期可发布事件**P6+ 评估):
- `AIContentGenerated`topic: `edu.insight.ai.generated`):生成内容审计事件,供 data-ana 落库用于质量分析
- `AIFeedbackRecorded`topic: `edu.insight.ai.feedback`):教师对生成结果的反馈(采纳/拒绝/修改),用于 RLHF 数据集构建
- **错误码前缀**`AI_*`(详见阶段 2 §6.2
- **降级策略**LLM API key 为空或调用失败时返回 `degraded: true` 骨架响应(见 [llm_client.py](../src/ai/llm_client.py)
### 3.3 ai12 增补:响应信封对齐
按 004 §11.5 强制约束coord 仲裁Python 服务信封必须改为 ActionState禁止 `{success, data, degraded}` 偏离结构):
- 当前 ai 实现违反约束main.py 返回 `{success: true, data: ..., degraded: false}`
- P5 实施必须改为 ActionState
- 成功:`{success: true, data: T}`
- 失败:`{success: false, error: {code, message, details?, traceId?}}`
- 降级:`details: {degraded: true}`degraded 作为 details 子字段,非顶层字段)
- 提请 coord 在 known-issues.md §2.9 ai-gateway 分区记录此约束
## 4. 我的技术栈
### 4.1 当前技术栈ai06 初稿)
- 语言Python 3.12+
- 框架FastAPI 0.115+ / uvicorn
- LLM 客户端:`httpx` 异步直接调 OpenAI 兼容 REST API**不依赖 openai SDK**,见 [llm_client.py:1-7](../src/ai/llm_client.py)
- 配置:`pydantic-settings` BaseSettingsenv_prefix=""
- 可观测:
- 日志:`structlog`
- 指标:`prometheus-client` + `make_asgi_app()`
- 链路:`opentelemetry-sdk` + `OTLPSpanExporter` + `FastAPIInstrumentor`dev_mode=true 时跳过 exporter 初始化避免本地无 collector 报错)
- 流式响应FastAPI `StreamingResponse` + `AsyncGenerator`SSE 格式 `data: <chunk>\n\n`
- 测试pytest**当前 0% 覆盖率**
### 4.2 ai12 增补:长期技术栈演进路线
为支撑 P5 交付物 + 未来多模态/RAG/Agent 演进,规划如下技术栈演进:
| 类别 | 当前 | P5M14-M16 | P6+(长期演进) | 选型理由 |
| ---------- | ---------- | --------------------------- | ------------------------------------------ | ---------------------------------------------------------- |
| LLM 客户端 | httpx 直连 | LLMProvider 抽象 + 4 适配器 | + Embedding Provider + Multimodal Provider | 抽象隔离 Provider API 差异,便于切换 |
| 工作流编排 | 无 | FastAPI BackgroundTasks | Temporal如 coord 仲裁引入) | 简单 4 步用 BackgroundTasks长运行教师审核需 Temporal |
| RAG 检索 | 无 | gRPC 调 content 查询 | + 向量库pgvector / Chroma+ Embedding | P5 复用 contentP6+ 评估独立向量库支持语义检索 |
| 模板管理 | 硬编码 | YAML 文件 + Jinja2 | + DB 持久化 + 版本化 + A/B 测试 | P5 用文件简单P6+ 评估迁移 DB 支持动态更新 |
| 缓存 | 无 | Redishash + 令牌桶) | + 语义缓存embedding 相似度) | P5 用 hash 缓存P6+ 评估语义缓存减少重复 LLM 调用 |
| 限流 | 无 | Redis 令牌桶(用户/IP | + 学校级配额 + token 级预算 | P5 用户/IP 级P6+ 多租户配额管理 |
| 评估 | 无 | 规则校验 + LLM-as-judge | + 人工评估 + 在线指标 + RLHF 数据集 | P5 自动化校验P6+ 闭环反馈持续提升质量 |
| 测试 | 0% | pytest ≥ 80% | + 集成测试 + 契约测试 + LLM 评估测试 | P5 单元 + 集成P6+ 评估测试保证生成质量 |
**关键选型决策记录**ai12 增补,供 coord 备案):
1. **不引入 openai SDK**:保持 httpx 直连,避免 SDK 版本绑定 + 减少 attack surfaceOpenAI 兼容 REST API 已成为事实标准(百川/Ollama/vLLM 均兼容)
2. **P5 不引入 LangChain**LangChain 抽象过重,与 LLMProvider 抽象层职责重叠;按 004 §2.3 列出的 LangGraph 待 P6+ 评估时再决定
3. **P5 不引入向量库**RAG 检索复用 content 服务的 Neo4j + EScontent 已规划 ES避免数据冗余
4. **不引入 openai SDK 但保留兼容性**:所有 LLM Provider 适配器实现 OpenAI 兼容 REST 接口,便于切换;非兼容 Provider如 Anthropic 原生 API在适配器内部转换
## 5. 我的阶段归属
### 5.1 阶段定位ai06 初稿 + ai12 增补)
- **P5 沟通与 AI 阶段M14-M16**:建 AI 网关 + LLM Provider 适配 + 流式 SSE + 用量计费
- **退出标准**pending-features P5
- AI 辅助出题流式返回
- 题库全文检索 < 200ms**注**ES 部分由 content 服务承担ai 不直接负责)
- AI 网关流式 SSE 三层透传AI → BFF → 前端)
- **ai12 增补细化**(基于 ai-allocation.md §5 ai12 交付清单):
- LLM Provider 适配器模式OpenAI/百川/本地模型,统一接口)✅
- SSE 流式响应(题目逐字生成 + 前端打字机效果)✅
- 出题 Prompt 模板管理(模板 CRUD + 参数注入:年级/学科/难度/知识点)✅
- 备课工作流编排(分析学情 → 推荐知识点 → 生成题目 → 教师审核 → 入库)✅
- 用量计费/频率限制(按用户/按 IP/按 token 消耗)✅
- **依赖上游**
- P1 地基api-gateway 路由
- P2 身份iam 服务(鉴权 + DataScope
- P4 内容分析content 服务gRPC 查询知识点 / 题库)+ data-ana 服务gRPC 查询学情)
- 外部LLM Provider API keyOpenAI / Anthropic / 百川 / 本地模型 Ollama
- **下游依赖我**
- P5 teacher-bff 聚合 AI 出题 mutation004 §9.3:教师用 AI 出题并发布到班级)
- P5 teacher-portal SSE 流式 AI 对话(前端)
- **ai12 增补**P5+ student-bff学生自适应学习未来阶段
- **ai12 增补**P5+ parent-bff家长学情报告 AI 解读,未来阶段)
### 5.2 ai12 增补:阶段交付里程碑细分
将 P5M14-M163 个月)细分为 3 个里程碑,便于优先级排序:
| 里程碑 | 时间 | 交付内容 | 退出标准 |
| ------ | ----- | ----------------------------------------------------------------------------------------- | ----------------------------------------------- |
| M14 | 第1月 | LLMProvider 抽象 + OpenAI/百川/Ollama 适配器 + gRPC serverChat/StreamChat+ Redis 限流 | gRPC 流式 RPC 可调通,多 Provider 切换可用 |
| M15 | 第2月 | Prompt 模板管理YAML + Jinja2+ 出题工作流 + 题目逐字流式生成 + 用量计费事件 | 教师可发起 AI 出题,流式返回,用量落 ClickHouse |
| M16 | 第3月 | 备课工作流 4 步编排 + 教师审核 + 入库 + 评估框架(规则 + LLM-as-judge | 备课工作流端到端跑通,质量门禁生效 |
## 6. 我需要对齐的黄金模板项(对照 classes 服务 + Python 规范)
### 6.1 对齐清单ai06 初稿 + ai12 增补)
- [ ] 权限装饰器等价物:**当前 HTTP 端点全部裸露,无权限校验**。阶段 2 需设计 FastAPI Depends 权限依赖AI 出题需 `AI_QUESTION_GENERATE` 权限,表达优化需 `AI_EXPRESSION_OPTIMIZE`
- [ ] 错误码前缀统一:**当前无错误码体系**,降级时返回 `degraded: true` 但无业务错误码。**阶段 2 需定义 `AI_*` 错误码清单**
- [x] logger / metrics / tracer 三支柱(已具备)
- [x] `/healthz` + `/readyz` 健康检查已具备readyz 含 LLM 配置状态)
- [ ] 优雅关闭 SIGTERM当前 lifespan 无显式 drainLLM 流式请求需等待完成)
- [ ] 测试覆盖率 ≥ 80%**当前 0%**,无 tests/ 目录
- [ ] Dockerfile 多阶段构建:**当前单阶段**`FROM python:3.12-slim`
- [ ] Pydantic 输入验证:**当前仅 `ChatRequest` 是 BaseModel`generate/question``optimize/expression` 直接接收 `prompt: str` / `text: str` query param无请求体模型**。阶段 2 需补完整 Pydantic 请求/响应模型
- [x] 配置通过 pydantic-settings 管理(已具备)
- [x] 异步优先httpx async + AsyncGenerator stream
- [x] 类型注解强制已基本符合main.py 函数返回值已标注)
- [ ] LLM Provider 适配器模式:**当前仅 OpenAI 兼容 REST**,未抽象 Provider 接口。阶段 2 需设计 `LLMProvider` 抽象 + OpenAI/Anthropic/百川/本地 多适配器
- [ ] Prompt 模板管理:**当前 Prompt 硬编码在 main.py**,阶段 2 需设计模板管理DB 或文件)
- [ ] 用量计费 / 频率限制:**当前无用量记录和限流**,阶段 2 需设计Kafka 事件 + Redis 限流)
- [ ] 备课工作流:**当前未实现**pending-features P5 要求"分析学情 → 推荐知识点 → 生成题目 → 教师审核 → 入库"完整工作流
- [ ] ruff check 零错误:需阶段 2 验证
### 6.2 ai12 增补响应信封对齐P0 强制)
- [ ] **响应信封改为 ActionState**004 §11.5 强制约束)
- 当前违反:`{success: true, data: ..., degraded: false}` 顶层 degraded 字段
- 必须改为:`{success: true, data: ...}` + 失败时 `{success: false, error: {code, message, details: {degraded: true}, traceId}}`
- 影响:所有 HTTP 端点 + gRPC RPC 返回值
- 提请 coord 在 known-issues §2.9 记录
### 6.3 ai12 增补:长期架构对齐项
- [ ] **API 版本化策略**:当前无版本前缀,建议 P5 加 `/ai/v1/*` 前缀,便于未来破坏性变更
- [ ] **gRPC server interceptor 透传 trace context**:当前 HTTP 用 FastAPIInstrumentor 自动埋点gRPC server 需补 `grpc.aio.ServerInterceptor` 透传 W3C traceparent
- [ ] **下游 gRPC client interceptor**:调 content / data-ana 的 gRPC client 需补 client interceptor 注入 trace context + 失败重试 + 熔断
- [ ] **PII 脱敏**:学生姓名、家长手机号等 PII 数据在写入 prompt 前必须脱敏(防止泄露给 LLM Provider
- [ ] **Prompt 注入防御**:用户输入的 prompt 必须经 sanitize去除 SQL/HTML/JS 注入模式)后再拼入 system prompt
- [ ] **输出内容审核**LLM 输出必须经敏感词过滤 + 安全校验后再返回(防止生成不当内容)
- [ ] **生成结果质量门禁**:题目生成必须经规则校验(题型匹配/答案非空/解析合理)+ LLM-as-judge质量评分不达标重新生成或降级
- [ ] **多租户用量配额**:按学校/年级/教师维度配置 token 预算,超额拒绝调用(避免单一学校耗尽预算)
---
## 服务审计表 — ai12ai 部分)
> 对照 ai-allocation.md §10 审计模板。ai 为 Python/FastAPI黄金模板对齐按 Python 规范coding-standards §4评估。
> 符号说明:✅ 已实现 | ❌ 缺失 | ⚠️ 部分实现 | 📋 P5 待实现 | 🔮 P6+ 长期演进
| 服务 | 权限校验 | 错误码前缀 | logger | metrics | tracer | /healthz | /readyz | 优雅关闭 | 测试覆盖率 | Dockerfile | 响应信封 | gRPC server | Provider 适配 | Prompt 模板 | 限流/计费 | 备课工作流 | PII 脱敏 | 质量门禁 |
| ---- | -------- | ---------- | ------------ | ------------- | ------------------- | -------- | ----------------- | ------------------- | ---------- | ---------- | -------- | ----------- | ------------- | ----------- | --------- | ---------- | -------- | -------- |
| ai | ❌ | ❌ | ✅ structlog | ✅ prometheus | ✅ OTeldev 跳过) | ✅ | ✅(含 LLM 状态) | ⚠️ 仅 lifespan 关闭 | 0% | ❌ 单阶段 | ❌ 偏离 | ❌ 待实现 | ❌ 待实现 | ❌ 硬编码 | ❌ 待实现 | ❌ 待实现 | ❌ 缺失 | ❌ 缺失 |
### 审计发现的关键差距(按优先级)
#### P0 阻塞 P5 交付ai06 初稿 + ai12 增补)
1. **P0 权限校验缺失**:所有 `/ai/*` 端点裸露AI 出题等敏感操作无权限校验
2. **P0 gRPC server 未实现**ai.proto 定义了 `AiService`(含 `StreamChat` 流式 RPC但 ai 当前仅 HTTP。阶段 2 需引入 `grpc.aio` 实现 gRPC server + 流式 RPC
3. **P0 gRPC client 未实现**004 §4.1 明确 AI → Content / AI → DataAna 走 gRPC当前未实现。阶段 2 需设计 gRPC client 调用 content / data-ana
4. **P0 响应信封偏离 ActionState**ai12 增补004 §11.5 强制约束,当前违反
5. **P0 LLM Provider 适配器缺失**:当前 `llm_client.py` 仅 OpenAI 兼容 REST未抽象 Provider 接口。pending-features P5 + ai-allocation.md §5 要求"LLM Provider 适配OpenAI/百川/本地模型)"
6. **P0 Prompt 模板管理缺失**system prompt 硬编码在 main.py无模板管理。ai-allocation.md §5 要求"模板 CRUD + 参数注入:年级/学科/难度/知识点"
7. **P0 备课工作流缺失**pending-features P5 + ai-allocation.md §5 要求"分析学情 → 推荐知识点 → 生成题目 → 教师审核 → 入库"完整工作流,当前仅"生成题目"单步
8. **P0 用量计费 / 频率限制缺失**无用量记录token 消耗)、无频率限制(用户可无限调用 LLM。ai-allocation.md §5 要求"按用户/按 IP/按 token 消耗"
#### P1 P5 阶段需补齐ai12 增补)
9. **P1 题目逐字流式生成缺失**:当前 `/ai/chat/stream` 仅支持聊天流式未实现题目生成的逐字流式ai-allocation.md §5 "题目逐字生成 + 前端打字机效果"
10. **P1 Prompt 模板 CRUD API 缺失**ai-allocation.md §5 要求"模板 CRUD",当前无 API
11. **P1 多维度限流缺失**ai-allocation.md §5 要求"按用户/按 IP/按 token 消耗"三维度,当前仅设计用户级
12. **P1 测试覆盖率 0%**:无 tests/ 目录
13. **P1 Dockerfile 单阶段**:未做多阶段构建
14. **P1 Pydantic 输入验证不完整**`generate/question``optimize/expression` 直接接收 query param无请求体模型
#### P2 P6+ 长期演进ai12 增补)
15. **P2 PII 脱敏缺失**:学生姓名/家长手机号等写入 prompt 前未脱敏,存在数据泄露风险
16. **P2 Prompt 注入防御缺失**:用户输入未 sanitize存在 SQL/HTML 注入风险
17. **P2 输出内容审核缺失**LLM 输出未过滤敏感词,存在生成不当内容风险
18. **P2 生成结果质量门禁缺失**:题目未校验题型/答案/解析合理性,可能生成不可用题目
19. **P2 多租户用量配额缺失**:无学校/年级级配额,单一学校可能耗尽预算
20. **P2 评估框架缺失**:无 LLM-as-judge / 人工评估机制,无法持续提升生成质量
21. **P2 RAG 语义检索缺失**:当前仅基于 content 知识点查询,无向量库语义检索
22. **P2 多模态支持缺失**:未规划图片/音频题目生成(数学几何题/英语听力题)
23. **P2 语义缓存缺失**:仅 hash 缓存,无基于 embedding 相似度的语义缓存
24. **P2 A/B 测试基础设施缺失**:无法对比不同 prompt/模型的效果
25. **P2 RLHF 数据收集缺失**:无教师反馈(采纳/拒绝/修改)记录机制
26. **P2 长运行工作流持久化缺失**:备课工作流的"教师审核"步骤可能跨数小时/天,无持久化机制
---
## 阶段 1 待 coord 交叉审查的跨模块契约对齐项
### ai06 初稿提请项(已在 coord 交叉审查报告中仲裁)
| # | 议题 | 涉及方 | 仲裁结论 |
| --- | ----------------------------------------------- | ---------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 2 | **ai 是否发布 `edu.insight.ai.usage` 用量事件** | ai → data-ana | ✅ 已仲裁coord 补登 topic见 004 §7.2events.proto 待补 `AIUsageEvent` messagecoord 负责) |
| 3 | **data-ana / ai 是否需要实现 gRPC server** | data-ana / ai ← teacher-bff / student-bff / ai | ✅ 已仲裁:分阶段启用,见 004 §4.2 gRPC 启用阶段矩阵ai 在 P5 启用(含 StreamChat |
| 6 | **ai 备课工作流是否引入 Temporal** | ai + coord | ⚠️ 部分仲裁004 §2.3 列出 Temporal 用于"工作流编排考试生命周期、AI 编排)"P3 已引入试点ai12 建议简单工作流用 BackgroundTasks长运行评估 Temporal待 P6 决策 |
| 7 | **LLM Provider 切换的配置化** | ai + coord | ⚠️ 部分仲裁ai12 设计 `LLMProvider` 抽象 + 配置化路由(按 model 名路由);本地模型走 Ollama REST API待 P6 评估是否提取到 shared-py |
### ai12 新增提请项(待 coord 仲裁)
| # | 议题 | 涉及方 | ai12 建议 |
| --- | ----------------------------------------------------------------------------------------------------- | --------------------- | -------------------------------------------------------------------------------------------------------------- |
| A1 | **ai gRPC 端口 50058**004 §1.2 端口矩阵需补登 | ai + coord | ai HTTP 3008 + gRPC 50058HTTP+10050 规则);提请 coord 同步 004 §1.2 + 全局端口表 `infra/port-allocation.md` |
| A2 | **ai.proto 待补全**:备课工作流 RPC + 题目逐字流式 RPC + ChatRequest/GenerateQuestionRequest 字段扩展 | ai + coord | 见 §3.2 ai12 增补待补全项;建议 coord 在 P5 启动前完成 proto 升级到 v1 完整版 |
| A3 | **events.proto 待补 `AIUsageEvent` message**004 §7.2 已确认 topic 但 proto 未定义 | ai + coord + data-ana | 协调 data-ana ai11 共同定义 payload schemaai12 已在 02-architecture-design.md §5.2 给出建议 schema |
| A4 | **iam `GetEffectiveDataScope` gRPC RPC**ai 需查询用户 DataScope 用于多租户配额校验 | ai + coord + iam | coord 已仲裁 P4 补全§15.3 #5ai12 在 P5 实施时调用 |
| A5 | **响应信封偏离 ActionState 强制整改**004 §11.5 已约束ai 当前违反 | ai + coord | P5 实施时必须整改;提请 coord 在 known-issues §2.9 记录 |
| A6 | **Prompt 模板存储位置**YAML 文件 vs DB | ai + coord | ai12 建议 P5 用 YAML 文件(`services/ai/src/ai/prompts/*.yaml`P6+ 评估迁移 DB与 ai06 初稿一致 |
| A7 | **长运行工作流持久化**:备课工作流"教师审核"步骤可能跨数小时/天 | ai + coord | ai12 建议 P5 用 Redis 暂存(短期 24h TTL+ BFF 编排审核状态P6 评估迁移 Temporal 或自建 workflow_state 表 |
| A8 | **多模态支持规划**:图片/音频题目生成(数学几何/英语听力) | ai + coord | ai12 建议 P5 仅文本P6+ 评估多模态proto v2 预留 `multimodal_content` 字段 |
| A9 | **评估框架归属**LLM-as-judge 在 ai 内部 vs 独立 evaluation 服务 | ai + coord | ai12 建议 P5/P6 在 ai 内部实现避免服务拆分过早P7+ 评估独立 |
| A10 | **RLHF 数据收集**:教师反馈事件 `AIFeedbackRecorded` 是否新增 topic | ai + coord + data-ana | ai12 建议 P6+ 评估topic: `edu.insight.ai.feedback`data-ana 落 ClickHouse 供未来 fine-tune |
---
**AI Agent**: ai12 (ai) ← ai06初稿
**Branch**: 单仓库并行模式(直接提交 main
**Coordinator**: coord-ai