用 MySQL 构建 Prompt 发布门禁:异步评测、租约与原子生效

Prompt 改一个词就直接影响下一次生产调用,是许多 LLM 应用的薄弱环节。一个针对特殊案例的修复,也可能悄悄降低常规问题的表现。
原文的解决方案是发布门禁:候选 Prompt 先暂存,在所有绑定数据集上完成评测,只有全部达标才替换线上配置。编排依靠 MySQL 状态表与后台 Worker 完成。
1. 门禁检查什么
原文为了简化,只考虑输出 yes/no 的二分类任务。每个数据集有独立准确率门槛,例如常规集和困难集分别设门槛;数字是业务配置,不是通用标准。
提交变更后返回跟踪 ID。评测异步运行,最终只有两类结果:所有门槛通过则生效,否则保持线上版本不变。真实任务还可能需要检查精确率、召回率、延迟、成本和失败比例。

2. 数据表表达状态和关系
| 表 | 负责保存 |
|---|---|
prompt | 当前线上配置与版本 |
dataset | 数据集登记及来源 |
prompt_dataset | Prompt 与数据集映射及门槛 |
prompt_update | 一次候选变更与状态 |
prompt_run | 候选在某个数据集上的一次评测 |
prompt_run_item | 单条样本的期望、实际输出与判定 |
给 (run_id, item_id) 加唯一约束,可以防止重复物化样本。新增建议是给本次评测固定数据快照、门槛、模型和生产调用链路版本,避免评测过程中配置变化造成结果不可解释。
3. 四类 Worker 如何协作
Materialize 分页读取并固化评测样本;Execute 调用与生产一致的执行路径,保存匹配、不匹配或错误;Finalize 等待样本全部终结,计算指标;Reconcile 比较全部数据集门槛,决定候选是否生效。
Worker 不必彼此发消息,可以查询相应状态。状态迁移使用条件更新,例如只允许 PENDING 更新为 REJECTED,并检查影响行数,避免已经终结的候选再次被处理。
4. SKIP LOCKED 配合短事务认领
两个 Worker 先查询再处理,可能拿到同一条任务。FOR UPDATE 让认领事务持有行锁;SKIP LOCKED 跳过其他事务已锁定的行,适合多个消费者处理队列式表。MySQL 8.4 锁定读文档
下面是参数化 SQL 设计片段,:参数 需要通过数据库驱动绑定。IN 列表应由驱动生成占位符,不能把用户输入直接拼进 SQL。
START TRANSACTION;
SELECT id
FROM prompt_run_item
WHERE run_id = :run_id
AND verdict IN ('PENDING', 'ERROR')
AND attempt < :max_attempts
AND (lease_until IS NULL OR lease_until < NOW(6))
ORDER BY id
LIMIT :batch_size
FOR UPDATE SKIP LOCKED;
-- 仅更新本事务刚选中的 ID;token 为本次认领的新随机值
UPDATE prompt_run_item
SET lease_token = :token,
lease_until = DATE_ADD(NOW(6), INTERVAL 3 MINUTE),
attempt = attempt + 1
WHERE id IN (:claimed_ids);
COMMIT;
事务提交后再调用 LLM。长网络调用期间不持有行锁,可以减少连接池和事务负担。
原文把 ORDER BY id 描述成 FIFO,需要收紧:跳过锁定行和并发执行会改变完成顺序,因此它不是严格 FIFO。还要为查询建立合适索引,控制批量大小,并检查扫描和锁竞争。
5. 租约解决恢复,令牌防止旧结果覆盖

Worker 崩溃后,其他 Worker 可以在租约过期后重新认领。每次认领使用新 lease_token,比只比较固定 Worker 名称更能区分前后两次执行。
UPDATE prompt_run_item
SET verdict = :verdict,
actual_decision = :decision,
lease_token = NULL,
lease_until = NULL
WHERE id = :item_id
AND lease_token = :token
AND lease_until > NOW(6);
回写影响行数为零,说明所有权已失效,应丢弃结果。耗时任务需要续租或足够的租期,并为重试安排退避。
这里提供的是至少一次处理思路,不能保证 LLM 只调用一次。租约过期前后可能出现重复请求和重复费用;外部服务支持幂等键时可以利用它,否则要记录重复执行并限制重试。
6. 最终生效还要处理并发提交
候选通过全部门槛后,线上配置更新与候选状态更新应在同一事务完成。还要检查候选是否仍为当前有效提交,以及线上基础版本是否符合预期,防止较早的慢评测覆盖较新的配置。
若采用“最新提交优先”,被替代候选应进入取消状态;其已在途任务的结果不能触发生效。Finalize 还要确认物化结束,避免样本尚未读全就提前计算指标。
错误耗尽重试、数据集为空、分母为零和取消中的运行都需要明确终态。阈值比较应使用未过早四舍五入的原始值。
MySQL 能支撑一定规模的异步门禁,但轮询、索引、历史表增长和清理都有成本。当工作流涉及大量跨系统补偿、复杂定时和高吞吐事件时,应重新评估专门队列或工作流平台。选择依据是负载与运维能力,而不是组件数量越少越好。
转载自 CSDN-专业IT技术社区
原文链接:https://blog.csdn.net/yuanmomoya/article/details/169069074




