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.设计规格文档
This commit is contained in:
SpecialX
2026-07-10 12:58:22 +08:00
parent 2a2a56f541
commit faaaf29f67
120 changed files with 23201 additions and 2 deletions

View File

@@ -0,0 +1,384 @@
# 模块理解确认书 — 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