AI 时代 OJ 设计的 2b。标准答案能让提示准得多,但不能进生成提示的 prompt
(学生代码里一段注释就能把它套走),所以拆成两段:
- 诊断:看得到标准答案、第一个没过的测试点、带行号的学生代码;出参只允许
{ tag, lines, confidence },safeParse 过闸、多余字段剥掉,没有自由文本通道
- 生成提示:看不到标准答案和测试点原文,只多一句「问题定位:X,大约在第 a 行」
- 诊断失败(20 秒超时、不是 JSON、校验不过)退回单段式;同一条提交复用诊断;
编译失败不诊断
- 契约新增 HINT_ERROR_TAGS(13 个,落库值,只增不改)与 hintDiagnosisSchema
- 迁移 0018:ai_hint 加 diagnosis / diagnosis_error 两列
- 单段式 prompt 原样搬进 services/hint-diagnosis.ts,记版本 1;两段式记版本 2
- completeChat 支持 JSON 模式和自定义超时,现有调用不受影响
- 开关 AI_HINT_DIAGNOSE 默认关(2a 的基线还在攒),两套生产 compose 透传
实跑(一次性库 + 本地假 LLM):开关关时请求与 2a 逐字节相同;开时正常 /
复用 / 坏 JSON / 非法标签 / 行号越界 / 超时 / 编译失败七种场景符合预期;
12 次模型请求里诊断全都带标准答案和测试点,生成全都不带。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -19,6 +19,10 @@ JUDGE_CONCURRENCY=2
|
||||
# DeepSeek key,用于题解 AI 分析。留空则 AI 功能不可用(其余功能不受影响)。
|
||||
AI_KEY=
|
||||
|
||||
# AI 提示走两段式(先诊断、再生成)。填 1 打开,留空为关。
|
||||
# 服务器和机房共用一个库、各有各的 .env —— 两边要一起开关,不然 ai_hint 里两种口径的数据混在一起。
|
||||
AI_HINT_DIAGNOSE=
|
||||
|
||||
# --- 数据在哪 ---
|
||||
#
|
||||
# 这三个变量决定新栈是「自带 postgres/redis」还是「接着用旧栈的」。
|
||||
|
||||
@@ -135,6 +135,7 @@ services:
|
||||
JUDGE_SERVER_TOKEN: ${OJ2_JUDGE_TOKEN:?}
|
||||
JUDGE_CONCURRENCY: ${JUDGE_CONCURRENCY:-2}
|
||||
AI_KEY: ${AI_KEY:-}
|
||||
AI_HINT_DIAGNOSE: ${AI_HINT_DIAGNOSE:-}
|
||||
# 走 NPM 终止 TLS,浏览器侧是 https,Cookie 必须带 Secure
|
||||
COOKIE_SECURE: "true"
|
||||
healthcheck:
|
||||
|
||||
@@ -79,6 +79,7 @@ services:
|
||||
JUDGE_SERVER_TOKEN: ${OJ2_JUDGE_TOKEN:?}
|
||||
JUDGE_CONCURRENCY: ${JUDGE_CONCURRENCY:-4}
|
||||
AI_KEY: ${AI_KEY:-}
|
||||
AI_HINT_DIAGNOSE: ${AI_HINT_DIAGNOSE:-}
|
||||
# 机房走 http 直连 IP,没有 TLS。带 Secure 的 Cookie 浏览器不会回传,
|
||||
# 学生会「登录成功但立刻又是未登录」。这里必须是 false。
|
||||
COOKIE_SECURE: ${COOKIE_SECURE:-false}
|
||||
|
||||
Reference in New Issue
Block a user