Files
Edu/docs/architecture/issues/worklines/ai_workline.md

15 KiB
Raw Blame History

ai 工作排期

负责人ai12 关联:workline.mdcoord.mdcontracts/ai_contract.mdobjections/ai_issue.md 模式:全并行(各 AI 一口气完成 P2-P6 全部代码,开发期间用 mock最后统一集成测试 阶段归属:批次 4P5workline.md §1 甘特图 b4c: ai12 ai服务 gRPC 50058, after b3a, 13d


§1 总览

ai 是 D6 智能洞察领域的"生成子域"服务Python/FastAPI无状态统一封装 LLM 调用(多 Provider 适配 + 故障切换 + 限流 + 成本控制),提供聊天 / 出题 / 表达优化 / 备课工作流四类 AI 能力。通过 gRPC 查询 content 知识点与 data-ana 学情,通过 Kafka 外发用量计费事件供 data-ana 落 ClickHouse。

端口HTTP 3008 + gRPC 50058port-allocation.md §3/§5 权威源)

P5 全阶段目标(退出标准,对应 pending-features P5 + ai-allocation §5

  1. LLM Provider 适配器模式OpenAI/百川/Anthropic/本地 Ollama统一接口 + 故障切换)
  2. SSE / gRPC 流式响应(题目逐字生成 + 前端打字机效果)
  3. 出题 Prompt 模板管理YAML + Jinja2模板 CRUD + 参数注入:年级/学科/难度/知识点)
  4. 备课工作流 4 步编排(分析学情 → 推荐知识点 → 生成题目 → 教师审核 → 入库)
  5. 用量计费 / 频率限制(按用户 / 按 IP / 按 token / 按学校配额)
  6. 生成质量门禁RuleValidator + LLMJudge评估通过率 > 80%
  7. 安全层PII 脱敏 + Prompt 注入防御 + 输出内容审核)

§2 全阶段甘特图P513 天)

对齐 workline.md §1 批次 4ai12 ai服务 gRPC 50058 :b4c, after b3a, 13db3a = content P4 就绪后启动)

gantt
    title ai12 ai 服务 P5 排期13 天)
    dateFormat YYYY-MM-DD
    axisFormat %m-%d

    section M14 基础架构第1-4天
    12.1 LLMProvider抽象+4适配器 :crit, a12a, 2026-07-10, 2d
    12.2 ProviderFailoverChain+CircuitBreaker :a12b, after a12a, 1d
    12.3 gRPC server(Chat+StreamChat)+ActionState整改 :crit, a12c, after a12a, 2d
    12.4 Redis多维度限流+Dockerfile多阶段 :a12d, after a12b, 1d

    section M15 出题核心第5-9天
    12.5 PromptTemplateService+Jinja2渲染 :crit, a12e, after a12c, 2d
    12.6 GenerateQuestion+StreamGenerateQuestion逐字流式 :crit, a12f, after a12e, 2d
    12.7 RuleValidator+LLMJudge+QualityGate评估三道防线 :a12g, after a12f, 1d
    12.8 UsageRecorder+KafkaProducer+QuotaEnforcer :a12h, after a12g, 1d
    12.9 PIIRedactor+InputSanitizer+OutputModerator安全层 :a12i, after a12g, 1d

    section M16 备课工作流第10-13天
    12.10 gRPC client(content/data-ana/iam)+interceptor :crit, a12j, after a12f, 1d
    12.11 LessonPreparationWorkflow 4步编排+状态机 :crit, a12k, after a12j, 2d
    12.12 WorkflowStateStore(Redis)+教师审核+content入库 :a12l, after a12k, 1d
    12.13 集成测试+契约测试+文档同步+arch:scan :a12m, after a12l, 1d

关键路径(红色 critLLMProvider 抽象 → gRPC server → PromptTemplateService → GenerateQuestion → gRPC client → 备课工作流编排


§3 详细任务

M14 基础架构第1-4天

P5-12.1LLMProvider 抽象 + 4 适配器

  • 负责人ai12
  • 依赖P5 起点)
  • 交付物
    • services/ai/src/ai/providers/base.pyLLMProvider 抽象接口chat / stream_chat / embed
    • services/ai/src/ai/providers/openai_provider.py
    • services/ai/src/ai/providers/anthropic_provider.py
    • services/ai/src/ai/providers/baichuan_provider.py
    • services/ai/src/ai/providers/local_ollama_provider.py
    • 重构 llm_client.py 为基于抽象接口的调用
  • 验收标准
    • 4 Provider 切换可用(通过 llm_model_routing 配置路由)
    • httpx 异步调用,不依赖 openai SDK
    • 单元测试覆盖 ≥ 80%(用 MockLLMProvider
    • ruff check src/ 零错误

P5-12.2ProviderFailoverChain + CircuitBreaker

  • 负责人ai12
  • 依赖P5-12.1
  • 交付物
    • services/ai/src/ai/providers/failover.py(按优先级尝试 Provider失败自动切换
    • services/ai/src/ai/providers/circuit_breaker.py(连续 3 次失败触发熔断 60s
  • 验收标准:单 Provider 故障自动切下一个熔断器状态正确closed/open/half_open

P5-12.3gRPC server + ActionState 整改P0 阻塞)

  • 负责人ai12
  • 依赖P5-12.1前置ISSUE-03coord 升级 ai.proto 到 v1 完整版)
  • 交付物
    • services/ai/src/ai/grpc_server.pygrpc.aio server端口 50058
    • 实现 Chat + StreamChat 两个 RPC含流式
    • grpc.aio.ServerInterceptor 透传 W3C traceparent
    • ActionState 整改ISSUE-09所有 HTTP 端点 + gRPC RPC 返回值改为 {success, data, error:{code,message,details,traceId}},删除顶层 degraded 字段
  • 验收标准
    • teacher-bff 可调通 ai gRPC 50058 Chat / StreamChat(含流式)
    • HealthService.Check 返回 SERVING
    • 响应信封 004 §11.5 合规
    • pnpm run arch:scan 更新 arch.db

P5-12.4Redis 多维度限流 + Dockerfile 多阶段

  • 负责人ai12
  • 依赖P5-12.2
  • 交付物
    • services/ai/src/ai/middleware/rate_limit.pyRedis 令牌桶user/IP/school 三维度)
    • services/ai/Dockerfile(多阶段构建,目标镜像 < 200MB
  • 验收标准限流命中准确user 10/min、IP 30/min、school 100/min镜像 < 200MB

M15 出题核心第5-9天

P5-12.5PromptTemplateService + Jinja2 渲染

  • 负责人ai12
  • 依赖P5-12.3
  • 交付物
    • services/ai/src/ai/prompts/*.yaml5+ 模板generate_question / optimize_expression / chat / lesson_plan 等)
    • services/ai/src/ai/services/prompt_template_service.py(模板注册 + Jinja2 渲染 + CRUD
    • HTTP 端点:GET/POST/PUT /ai/v1/prompts
  • 验收标准5+ 模板可渲染;变量缺失返回 AI_PROMPT_RENDER_FAILED;模板缓存 1h TTL

P5-12.6GenerateQuestion + StreamGenerateQuestion 逐字流式

  • 负责人ai12
  • 依赖P5-12.5前置ISSUE-03ai.proto 补 StreamGenerateQuestion + GenerateQuestionRequest 字段扩展)
  • 交付物
    • services/ai/src/ai/services/question_generation_service.py
    • gRPC RPCGenerateQuestion + StreamGenerateQuestion(题目逐字流式生成)
    • HTTP 端点:POST /ai/v1/generate/question + POST /ai/v1/generate/question/stream
  • 验收标准题目逐字流式返回Pydantic 请求模型完整grade/knowledge_point_ids/question_type/count

P5-12.7评估三道防线RuleValidator + LLMJudge + QualityGate

  • 负责人ai12
  • 依赖P5-12.6
  • 交付物
    • services/ai/src/ai/evaluation/rule_validator.py(题型匹配/答案非空/解析合理/知识点覆盖)
    • services/ai/src/ai/evaluation/llm_judge.pyLLM-as-judge5 维度加权评分)
    • services/ai/src/ai/evaluation/quality_gate.py(阈值 0.7,不达标重试 < 3 次)
  • 验收标准:评估通过率 > 80%;不达标自动重试;重试耗尽返回 AI_EVALUATION_FAILED

P5-12.8UsageRecorder + KafkaProducer + QuotaEnforcer

  • 负责人ai12
  • 依赖P5-12.6前置ISSUE-02topic 裁决)+ ISSUE-04events.proto 补 AIUsageEvent
  • 交付物
    • services/ai/src/ai/usage/usage_recorder.pytoken 消耗统计)
    • services/ai/src/ai/usage/kafka_producer.pyaiokafka + acks=all + idempotent + transactional_id
    • services/ai/src/ai/usage/quota_enforcer.py(学校/教师月度配额Redis 计数)
    • HTTP 端点:GET /ai/v1/usage/me + GET /ai/v1/usage/school/{id}
  • 验收标准:用量事件落 data-ana ClickHouse配额超限返回 AI_QUOTA_EXCEEDEDevent_id SETNX 去重

P5-12.9安全层PIIRedactor + InputSanitizer + OutputModerator

  • 负责人ai12
  • 依赖P5-12.6
  • 交付物
    • services/ai/src/ai/security/pii_redactor.py(学生姓名/手机号/身份证/邮箱脱敏)
    • services/ai/src/ai/security/input_sanitizer.pyPrompt 注入防御)
    • services/ai/src/ai/security/output_moderator.py(敏感词过滤 + 安全校验)
  • 验收标准安全测试通过PII 检出返回 AI_PII_DETECTED;注入检出返回 AI_PROMPT_INJECTION_DETECTED

M16 备课工作流第10-13天

P5-12.10gRPC clientcontent / data-ana / iam+ interceptor

  • 负责人ai12
  • 依赖P5-12.3前置content gRPC 50054 就绪ai09 P4、ISSUE-07iam GetEffectiveDataScope P4 补全)
  • 交付物
    • services/ai/src/ai/clients/content_client.pyKnowledgeGraphService.GetPrerequisites / GetLearningPath
    • services/ai/src/ai/clients/data_ana_client.pyAnalyticsService.GetStudentWeakness / GetLearningTrend / GetClassPerformance
    • services/ai/src/ai/clients/iam_client.pyGetEffectiveDataScopeRedis 缓存 5min
    • grpc.aio.ClientInterceptortrace 注入 + 重试 + 熔断)
  • 验收标准:下游 gRPC 不可达时降级(跳过学情查询 + degraded:trueDataScope 缓存命中

P5-12.11LessonPreparationWorkflow 4 步编排 + 状态机

  • 负责人ai12
  • 依赖P5-12.10前置ISSUE-03ai.proto 补 GenerateLessonPlan RPC
  • 交付物
    • services/ai/src/ai/services/lesson_preparation_workflow.py4 步:分析学情 → 推荐知识点 → 生成题目 → 教师审核)
    • 状态机实现02-architecture-design.md §2.4Pending→Analyzing→Recommended→Generating→PendingReview→Persisted
    • gRPC RPCGenerateLessonPlan
    • HTTP 端点:POST /ai/v1/lesson/preparation + GET /ai/v1/lesson/preparation/{id}
  • 验收标准:端到端跑通 4 步;评估未通过自动重试 < 3 次;工作流状态可查询

P5-12.12WorkflowStateStore + 教师审核 + content 入库

  • 负责人ai12
  • 依赖P5-12.11前置content QuestionService.CreateQuestions(待 coord 补 proto见 02 doc §7
  • 交付物
    • services/ai/src/ai/workflow/workflow_state_store.pyRedis 持久化key ai:workflow:{id}TTL 24h
    • HTTP 端点:POST /ai/v1/lesson/preparation/{id}/confirm(教师确认/修改/拒绝)
    • 调 content.CreateQuestions 入库
  • 验收标准24h 内工作流可恢复;教师可审核/修改/拒绝入库成功24h 未审核过期

P5-12.13:集成测试 + 契约测试 + 文档同步

  • 负责人ai12
  • 依赖P5-12.12
  • 交付物
    • services/ai/tests/pytest + pytest-asyncio + testcontainers覆盖率 ≥ 80%
    • 契约测试pact-pythonai.proto 与 teacher-bff 一致性)
    • 更新 services/ai/README.md + docs/troubleshooting/known-issues.md ai 分区
    • pnpm run arch:scan 确认 arch.db 已更新
  • 验收标准ruff check src/ + pytest 零错误;覆盖率 ≥ 80%README 含完整架构图

§4 依赖与就绪信号

4.1 我依赖的上游就绪标志

依赖项 提供方 就绪标志 状态 阻塞任务
ai.proto 升级 v1 完整版6 RPC + 字段扩展) coord (shared-proto) proto 文件含 GenerateLessonPlan / StreamGenerateQuestion ISSUE-03 P5-12.3/12.6/12.11
events.proto 补 AIUsageEvent message coord (shared-proto) proto 含 AIUsageEvent ISSUE-04 P5-12.8
ai 用量事件 topic 命名裁决 coord 004 §7.2 补登 ISSUE-02 P5-12.8
content gRPC 50054 启用 ai09 (content) HealthService.Check = SERVING P4 P5-12.10
data-ana gRPC 50055 启用(可选) ai11 (data-ana) HealthService.Check = SERVING P4 P5-12.10(可降级)
iam GetEffectiveDataScope RPC P4 补全 ai06 (iam) + coord iam.proto 含此 RPC ISSUE-07 P5-12.10(可降级)
LLM Provider API keyOpenAI / 百川 / Ollama 人类决策者 环境变量配置 P5-12.1

4.2 我的就绪信号(供下游消费)

就绪标志 消费方 状态
ai gRPC 50058 启用HealthService.Check = SERVING teacher-bff (ai03)
AiService.Chat / StreamChat 可调用(含流式) teacher-bff
AiService.GenerateQuestion / StreamGenerateQuestion 可调用 teacher-bff
AiService.GenerateLessonPlan 可调用P5 补全) teacher-bff
AiService.OptimizeExpression 可调用 teacher-bff
ai 用量事件 topic 可发布(供 data-ana 统计) data-ana (ai11)

4.3 完成信号(批次 4 P5 完成)

ai P5 完成的 5 个标志:

  1. ai12ai gRPC 50058 启用 + 6 RPC 全部实现 + HealthService SERVING
  2. LLM Provider 4 适配器 + FailoverChain + CircuitBreaker 可用
  3. 备课工作流 4 步端到端跑通(含教师审核 + content 入库)
  4. 用量事件可发布到 Kafka + data-ana ClickHouse 可落库
  5. 端到端teacher-portal 教师 AI 出题 → 流式返回 → 审核入库

§5 风险与缓解

风险 缓解措施
coord 未在 P5 启动前补全 protoISSUE-02/03/04 ai12 先按 02-architecture-design.md §3.3/§4.2 建议 schema 实现proto 落地后对齐
content / iam gRPC 未就绪 降级:跳过学情查询 + degraded:true;配额降级为仅 user_id 维度
LLM API key 未配置 降级骨架响应已具备main.py 当前行为)
工作流状态丢失Redis 故障) Redis 哨兵P6 硬化)+ 事件日志P6 评估迁移 TemporalISSUE-06