P4-验证报告.txt

P4 AI 客户端 + 生成任务 — 验证报告
日期:2026-08-22
目录:/home/zyw/Downloads/ai-lesson-prep
依据:《v0.2修订执行计划》P4 范围/DoD/演示;B1/B8/B9;《设计说明书-v0.2》§6;《v0.2样例JSON.md》

========================================================================
1. 环境
========================================================================
Node:v20.15.1
Prisma:5.22.0
模型:deepseek-v4-flash
BASE_URL:https://api.deepseek.com
API Key:已配置(不回写明文)
说明:国内直连;脚本与客户端均清除 HTTP(S)_PROXY / ALL_PROXY。
新增迁移:20260822120000_generation_error_logs(generation_error_logs 表)
npm scripts:p4:test / p4:demo

========================================================================
2. 实现清单
========================================================================
客户端 src/lib/ai/client.ts
  - chat completion + response_format=json_object
  - 超时/网络/5xx/429 重试 1 次;JSON 解析失败重试 1 次(并要求更短完整 JSON)
  - 截断 JSON 修复(裸换行、未闭合括号)
  - 失败返回结构化 {code,message,status,retries,raw},写入 generation_tasks.error
  - 禁止走代理

产物 Schema 校验 src/lib/ai/schema.ts
  - 教案:objectives / lesson_events(phase=pre|in|post) / sizheng_integration / citations 必填
  - 目标条数 3–5;objectives 字段 id/text/bloom/literacy_dim/success_criteria
  - PPT:slide_type 枚举 + diagram_spec.kind
  - 材料:task_type / tier / objective_ids;case_ruling/authentic_task 必须有 rubric
  - 校验失败:重试 1 次,仍失败则 flagged 标红,不得静默通过

提示词组装(B1)src/lib/ai/prompts.ts
  - 顺序锁定 §6.2:角色 → 素养地图五维+六条标准+硬约束 → 知识库 → 画像/模板 → 思政 → M6.7 上下文链 → 输出 Schema
  - 硬约束:禁止简化专业课、目标 3–5 条可观察、活动/习题挂目标、价值嵌争议、闭集引用

上下文组装(B9/M6.7)src/lib/ai/context.ts
  - 输入:已确认大纲与目标 / 主案例 teaching_note / 未过期补丁 / 教师历史改动 / 最小反馈四字段 / 错误清单 / 画像分布
  - 学号禁止出域(含断言)
  - 可单测

生成后自检(B8)src/lib/ai/self-check.ts
  - 目标—活动—评价对齐
  - 未核验主张列表 claim_unverified
  - 易错字段 ⚠:模型名 / 日期 / 法规条款 / 数据指标

已知错误清单 src/lib/ai/errors.ts + 表 generation_error_logs
  - 教师纠正 / schema / self_check / api 入库
  - 后续生成提示词携带
  - POST/GET /api/generation-errors

闭集引用 src/lib/ai/citations.ts
  - source_type 白名单 + source_id 存在性(case/knowledge_point/hotspot 查库;teacher_url 含种子 U-2026-008)
  - 否则 claim_unverified=true,不丢弃条目

出域切片 src/lib/ai/slice.ts
  - 默认 ≤800 字;可按 focus 取窗;教材/热点只送切片

任务执行器 src/lib/ai/tasks.ts + generate.ts
  - type:lesson_plan/ppt/materials/outline/questionnaire/profile_report/knowledge_extract/hotspot_analyze
  - 状态机 pending → running → done|failed
  - 生成前调用 shouldRejectGeneration(P2 可教门槛)
  - POST /api/tasks 创建(可后台执行或 sync);GET /api/tasks/:id 轮询

========================================================================
3. 演示生成(真实调用 DeepSeek)
========================================================================
课时:舆情分析与立场检测 id=12 章=第七章 自然语言处理与应用
班级:2024级法学1班 id=2
主案例:流浪狗舆情反转事件 id=1
知识点:13:舆情分析四环节;14:立场检测的两类失败;15:AI 舆情结论的证据效力与法律边界
可教门槛:通过
教师纠正已写入 generation_error_logs:「不要把热搜排序写成民意本身」

第一次调用(task id=1):status=failed
  原始错误:json_parse Unterminated string in JSON at position 3695(模型截断;已按计划记录,不粉饰)
  随后补了截断修复与更短 JSON 重试提示。

第二次调用(task id=2):status=done 耗时≈126s
  model=deepseek-v4-flash
  flagged=true(标红,非静默通过)
  retries={api:1, json:0, schema:1}
  usage≈ prompt 7168 + completion 3273 = 10441 tokens(含 reasoning_tokens 569)
  lesson_title=舆情分析与立场检测:从流浪狗事件看AI结论能否成为处置依据
  lesson_type=案例讨论+辩论
  objectives=3
    1. [o1] 能解释舆情分析四环节并指出至少一个依赖人工判断的环节
    2. [o2] 能指出立场检测两类失败(语境缺失/群体标签)及其对处分公正的影响
    3. [o3] 能就「AI舆情结论是否可作为处置依据」给出有法律原则支撑的立场并参与辩论
  citations:KP 13/14/15 + case 1,全部闭集核验通过(未核验 0 条)
  当时 Schema 标红:lesson_events[].duration 为数字 5 而非 "5min"(校验已随后接受数字分钟)
  当时自检:formative_checks 为 {objective_id,check} 对象,字符串化漏检导致「目标未挂评价」(已修对象形 formative_checks)
  易错 ⚠:比例原则 / 正当程序 / 80% 等共 16 处,需人工核验(符合 B8)
  error 字段:{"code":"flagged","message":"已生成但存在 Schema/自检标红,不得视为静默通过"}

说明:生成不稳定属正常。第一次截断失败与第二次标红均保留原始结果,不以样例 JSON 冒充模型输出。

========================================================================
4. 单测(npx tsx scripts/test-p4.ts)
========================================================================
passed=48 failed=0
覆盖:出域切片、教案/PPT/材料 Schema、数字 duration、提示词顺序与五维/六条、B9 上下文全输入、学号剥离、闭集引用、对齐/对象形评价、易错 ⚠、客户端超时重试/JSON 重试/截断修复/结构化错误。

========================================================================
5. 生产构建(npm run build)
========================================================================
exit 0
Compiled successfully;Linting and checking validity of types 通过;
Generating static pages (29/29) 通过。
新增路由:/api/tasks  /api/tasks/[id]  /api/generation-errors

========================================================================
6. 遗留问题
========================================================================
1. 模型 JSON 仍可能截断或改字段名(duration 数字、formative_checks 对象、core_plan 嵌套对象)。P4 策略是重试 + 标红,不一次上齐最终形态(执行计划 I7)。P6 教案确认页再可视化 flagged。
2. 生成结果只写入 generation_tasks.result,尚未回写 lesson_plans.draft_content(P6)。
3. PPT/材料/问卷等类型执行器已接线,本次演示只跑 lesson_plan。
4. teacher_url / textbook_section 无独立主表,存在性依赖已有 citations 与种子白名单(U-2026-008)。
5. 未做 UI 轮询页;API 可供后续向导调用。
6. 任务 stuck 在 running(进程中断)无自动回收,MVP 可接受。
下载此文件