Repository navigation
fix: 教师 AI 周报补充低分标签口径,避免误报数据异常 - #70
Conversation
低分标签在历史综合分<60 或最近得分<60 时触发(teacher_analytics._risk_tags_for_student)。孙三场景:综合分44/最近100,标签正确,但 prompt 未解释口径且只并列两个数字,LLM 推断为数据记录异常并建议教师核实系统故障。新增纯函数 utils/teacher_advice_prompt.py:学生行补历史综合分、标注低分标签来源,system prompt 加口径说明并禁止无证据声称系统异常;同步版与 SSE 版两处接入。
XiaoCow666
left a comment
There was a problem hiding this comment.
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
left a comment
There was a problem hiding this comment.
发现 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 中的测试结果属于贡献者提供的信息。
* 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 触发自动评审重跑
背景与复现
线上以教师演示身份走查:教师仪表盘 →「查看完整建议」→ AI 教学个性化建议页(
/teacher/ai_suggestions),AI 周报对学生孙三(demo_s_003)输出:风险标签:低分;最近得分:100
分析:系统标记为低分但实际得分为100,可能是数据记录异常或系统误判。
建议:核实学生实际学习情况,确认是否存在系统记录问题。
即 AI 把教师引导去排查一个并不存在的"系统故障"。截图时该生仪表盘数据:历史综合分 44(4 次提交),最近一次提交 100。
根因(事实)
_risk_tags_for_student中,"低分"标签在 历史综合分user_ascore < 60或 最近一次得分 < 60 任一满足时触发。孙三综合分 44,标签本身判定正确。风险标签 ['低分']与最近得分 100两个未标注数字并列。变更范围
仅 3 个文件,不涉及 DB 结构、权限、安全策略、部署配置:
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",同样误导)。services/teacher_ai_advisor.py:同步版与 SSE 版两处接入——attention_students增加historical_score;prompt 行改用纯函数;两个 system prompt 追加口径说明;risk_reason改用纯函数。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.08s1
2
pytest tests/test_teacher_advice_prompt.py tests/test_teacher_ai_suggestions.py tests/test_teacher_analytics.py -q 20 passed in 49.79s1
2
pytest tests/ -q 853 passed in 1438.36s事实 / 推断边界
未验证范围
LOW_SCORE_THRESHOLD=60维持现状)。