feat(llm): 引入基于完成度的 AI 提交指导与限流

- 新增 llm_guidance 策略层,根据源码、判题结果与通过率评估完成度分级
- llm-review.php 改为服务端缓冲上游输出,仅下发白名单分类的固定模板
- 新增 llm_review 与 llm_review_rate_limit 表,实现结果缓存与账户/提交两级限流
- ceinfo 模板渲染编译器标出的源码行号/列号,reinfo 仅向高完成度提交展示结构化 diff
- download.php 按完成度授权测试点下载,封堵白卷提交套取隐藏用例
- judge_client 在 ACM 非比赛场景下记录已通过测试点数,前端可显示进度
- 附 llm_guidance_policy_test 单测覆盖空白卷、注释卷、隐藏 SPJ、OJ_FULL_DIFF 等关键路径
This commit is contained in:
2026-07-23 10:47:50 +08:00
parent 5a27c07bba
commit 12bea84d8b
12 changed files with 1721 additions and 768 deletions
+15
View File
@@ -218,6 +218,21 @@ $tsql[50]="alter table $DB_NAME.contest add index key_c_end(end_time);";
$csql[50]="alter table $DB_NAME.contest add index key_c_dend(defunct,end_time);";
$tsql[51]="alter table $DB_NAME.users add column starred int default 0 after activecode ;";
$csql[51]="";
$tsql[52]="select 1 from $DB_NAME.llm_review limit 1;";
$csql[52]="CREATE TABLE IF NOT EXISTS $DB_NAME.`llm_review` (
`solution_id` INT NOT NULL,
`review` TEXT NOT NULL,
`create_time` DATETIME NOT NULL,
PRIMARY KEY (`solution_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;";
$tsql[53]="select 1 from $DB_NAME.llm_review_rate_limit limit 1;";
$csql[53]="CREATE TABLE IF NOT EXISTS $DB_NAME.`llm_review_rate_limit` (
`user_id` VARCHAR(48) NOT NULL,
`solution_id` INT UNSIGNED NOT NULL,
`next_allowed_at` DATETIME NOT NULL,
PRIMARY KEY (`user_id`,`solution_id`),
KEY `idx_next_allowed_at` (`next_allowed_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;";
// 删除6个月以前的非正确源码,优化数据库空间。
// delete from source_code where solution_id in (select solution_id from solution where result>4 and in_date<date_sub(now(),interval 6 month) ); //
if(isset($_POST['do'])){