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:
1 parent
47d8f46bdb
commit
06ad6745b7
12 files changed
+4308
-30
No files matched your search
@@ -42,6 +42,7 @@ import type {
|
||||
ContestSubmissionInfo,
|
||||
ExerciseType,
|
||||
FlowchartStatus,
|
||||
HintDiagnosis,
|
||||
JudgeStatus,
|
||||
ProblemDifficulty,
|
||||
ProblemLanguage,
|
||||
@@ -1022,8 +1023,16 @@ export const aiHint = pgTable(
|
||||
// 生成失败时为空串,失败原因在 error
|
||||
content: text().notNull(),
|
||||
error: text(),
|
||||
// 从收到请求到生成结束(或失败)的毫秒数
|
||||
// 从收到请求到生成结束(或失败)的毫秒数,两段式时含诊断那一段
|
||||
durationMs: integer("duration_ms").notNull(),
|
||||
/**
|
||||
* 两段式第一段的诊断结果(见 services/hint-diagnosis.ts)。**只存 safeParse 过的**,
|
||||
* 所以 `$type` 成立 —— 闸在写入侧。没开两段式、编译失败(不诊断)、诊断失败时为 null。
|
||||
* 同一条提交再要提示时复用这里的结果,不再调一次模型。
|
||||
*/
|
||||
diagnosis: jsonb().$type<HintDiagnosis>(),
|
||||
// 诊断失败的原因(超时、回的不是 JSON、校验不过)。这时第二段退回单段式的 prompt
|
||||
diagnosisError: text("diagnosis_error"),
|
||||
// 学生的评价:null = 没评
|
||||
helpful: boolean(),
|
||||
feedbackTime: timestamp("feedback_time", {
|
||||
|
||||
Reference in new issue
Block a user