Skip to content

fix: 教师 AI 周报补充低分标签口径,避免误报数据异常 - #70

Merged
XiaoCow666 merged 1 commit into
XiaoCow666:mainfrom
linxi123-A:fix/teacher-advice-risk-tag-caliber
Sep 23, 2026
Merged

XiaoCow666 merged 1 commit into
XiaoCow666:mainfrom
linxi123-A:fix/teacher-advice-risk-tag-caliber

Conversation

@linxi123-A

Copy link
Copy Markdown
Contributor

背景与复现

线上以教师演示身份走查:教师仪表盘 →「查看完整建议」→ AI 教学个性化建议页(/teacher/ai_suggestions ),AI 周报对学生孙三(demo_s_003)输出:
风险标签:低分;最近得分:100
分析:系统标记为低分但实际得分为100,可能是数据记录异常或系统误判。
建议:核实学生实际学习情况,确认是否存在系统记录问题。
即 AI 把教师引导去排查一个并不存在的"系统故障"。截图时该生仪表盘数据:历史综合分 44(4 次提交),最近一次提交 100。

根因(事实)

  • services/teacher_analytics.py_risk_tags_for_student 中,"低分"标签在 历史综合分user_ascore < 60 或 最近一次得分 < 60 任一满足时触发。孙三综合分 44,标签本身判定正确。
  • 但 services/teacher_ai_advisor.py 同步版与 SSE 版的 LLM prompt:
    1. system / user 中没有任何关于"低分"标签口径的说明;
    2. 学生数据行只把风险标签 ['低分'] 与最近得分 100 两个未标注数字并列。
  • LLM 无法获知"标签可由历史综合分触发",只能将二者解读为互相矛盾,进而臆断为数据记录异常。

变更范围

仅 3 个文件,不涉及 DB 结构、权限、安全策略、部署配置:

  1. 新增utils/teacher_advice_prompt.py (纯函数,无 Flask/DB 依赖)
    • RISK_TAG_CALIBER_INSTRUCTION :说明低分标签口径(历史综合分或最近得分 <60 触发),并明确要求:标签与最近高分并存不属数据矛盾,禁止无证据描述为系统异常/误判。
    • format_attention_student_line(info) :学生行同时给出最近一次得分与历史综合分;当低分标签实际来自历史综合分而最近一次已 ≥60 时,行内追加来源注释。
    • format_risk_reason(info) :结构化卡片risk_reason 同一口径补充来源(孙三场景原来的卡片文案也是"存在低分风险,最近得分100",同样误导)。
  2. services/teacher_ai_advisor.py :同步版与 SSE 版两处接入——attention_students 增加historical_score ;prompt 行改用纯函数;两个 system prompt 追加口径说明;risk_reason 改用纯函数。
  3. 新增tests/test_teacher_advice_prompt.py :6 个纯函数测试。

验证(实际执行结果)

环境:隔离 venv(仓库内.tmp_pytest_env ,未安装到系统盘)。

  • 新增测试:
    1
    2

pytest tests/test_teacher_advice_prompt.py -q 6 passed in 0.08s

  • 相关模块子集(AI 建议 + 学情分析):
    1
    2

pytest tests/test_teacher_advice_prompt.py tests/test_teacher_ai_suggestions.py tests/test_teacher_analytics.py -q 20 passed in 49.79s

  • 全量回归:
    1
    2

pytest tests/ -q 853 passed in 1438.36s

事实 / 推断边界

  • 事实(代码可核实) :低分标签触发条件为历史综合分或最近得分 <60;改动前 prompt 无任何口径说明;线上报告实际出现"数据记录异常或系统误判"表述。
  • 推断 :该表述源于 prompt 信息不足。LLM 输出具有非确定性,无法从代码层面 100% 证明每次调用都会出现误判,但口径说明与数据补全消除了其误判所需的信息缺口。

未验证范围

  • 未在合并部署后重新触发线上真实 AI 生成验证最终文案(LLM 输出不可逐字断言;仅通过 prompt 约束与单元测试保证口径信息送达)。
  • 未改动标签判定规则本身(LOW_SCORE_THRESHOLD=60 维持现状)。
  • 未处理其他风险标签("近期未活跃""未提交")与分数组合的潜在解读问题,本次只修复已复现的低分标签场景。

低分标签在历史综合分<60 或最近得分<60 时触发(teacher_analytics._risk_tags_for_student)。孙三场景:综合分44/最近100,标签正确,但 prompt 未解释口径且只并列两个数字,LLM 推断为数据记录异常并建议教师核实系统故障。新增纯函数 utils/teacher_advice_prompt.py:学生行补历史综合分、标注低分标签来源,system prompt 加口径说明并禁止无证据声称系统异常;同步版与 SSE 版两处接入。

@XiaoCow666 XiaoCow666 left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

CodeSense 自动评审

变更完整覆盖同步版和 SSE 版的提示词、学生历史综合分及结构化风险说明,已解决低分标签与近期高分并存时的误读问题。未发现安全风险、明显回归或无法运行的阻塞问题。

合并后可以继续改进的地方

  • PR 描述说明尚未在部署后使用真实 LLM 调用验证最终生成文案;当前已通过提示词内容和纯函数测试验证口径信息能够传入,建议后续结合线上样本观察效果。

已有验证信息

  • PR 描述提供新增测试结果:pytest tests/test_teacher_advice_prompt.py -q,6 passed in 0.08s。
  • PR 描述提供相关模块子集结果:20 passed in 49.79s。
  • PR 描述提供全量回归结果:pytest tests/ -q,853 passed in 1438.36s。

评审事件:3e2f24e0-b75b-11f1-9237-c0cf2f333e53

@XiaoCow666
XiaoCow666 merged commit 287909b into XiaoCow666:main Sep 23, 2026
1 check passed

@XiaoCow666 XiaoCow666 left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

发现 1 项需要修改的功能正确性问题。

  • P2:最近得分缺失时,仍然生成“近期进步”的结论。 utils/teacher_advice_prompt.py 的 format_attention_student_line 和 format_risk_reason 都通过 latest is None or latest >= LOW_SCORE_THRESHOLD 判断近期改善。输入 risk_tags=['低分']、historical_score=44、latest_score=None 时,会生成“最近一次已达 无”,并分别要求 AI 给出“近期进步”建议、在卡片中显示“近期提升”。函数明确支持分数为 None,但缺少最近得分无法支持这种结论,可能误导教师。

    请打开上述两个函数,将来源说明与近期改善判断分别处理:历史综合分低于 60 且最近得分缺失时,说明低分标签来自历史综合分、最近得分缺失;只有最近得分存在且达到 60 时,才生成当前关于近期改善的文字。请在 tests/test_teacher_advice_prompt.py 添加历史综合分为 44、最近得分为 None 的两个函数测试,断言保留历史来源说明,并且不包含“已达 无”“近期进步”“近期提升”。然后运行 pytest tests/test_teacher_advice_prompt.py tests/test_teacher_ai_suggestions.py tests/test_teacher_analytics.py -q 验证。

本次仅静态检查提供的三个文件 diff:同步与 SSE 路径均补充了 historical_score、system prompt 说明以及共享格式化函数;现有六个测试覆盖最近高分、最近低分及两个分数均缺失的情况,尚未覆盖上述组合。未执行命令;PR 中的测试结果属于贡献者提供的信息。

XiaoCow666 pushed a commit that referenced this pull request Sep 26, 2026
* test: 教师 AI 建议接入真实入口集成测试,并补异步任务失败兜底

新增 tests/test_teacher_advice_integration.py:经真实 HTTP SSE 路由断言 #70 的低分口径说明与历史综合分送达 LLM,验证旧功能(落地页/SSE协议/状态接口/持久化)可用,并覆盖流式失败/不可用走规则兜底。generate_class_suggestions_async 增加外层异常保护:工作线程保护范围外错误原先杀死线程、记录永久 pending,现正式账户把 pending/processing 标记 failed,demo 账户走 _mark_demo_suggestion_failed。

* chore: 空提交,内容无变化,仅更新 head 触发自动评审重跑
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants