@程序员小袁头像
用 MySQL 构建 Prompt 发布门禁:异步评测、租约与原子生效封面图

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

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

在这里插入图片描述

Prompt 改一个词就直接影响下一次生产调用,是许多 LLM 应用的薄弱环节。一个针对特殊案例的修复,也可能悄悄降低常规问题的表现。

原文的解决方案是发布门禁:候选 Prompt 先暂存,在所有绑定数据集上完成评测,只有全部达标才替换线上配置。编排依靠 MySQL 状态表与后台 Worker 完成。

1. 门禁检查什么

原文为了简化,只考虑输出 yes/no 的二分类任务。每个数据集有独立准确率门槛,例如常规集和困难集分别设门槛;数字是业务配置,不是通用标准。

提交变更后返回跟踪 ID。评测异步运行,最终只有两类结果:所有门槛通过则生效,否则保持线上版本不变。真实任务还可能需要检查精确率、召回率、延迟、成本和失败比例。

在这里插入图片描述

2. 数据表表达状态和关系

表负责保存
prompt当前线上配置与版本
dataset数据集登记及来源
prompt_datasetPrompt 与数据集映射及门槛
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

文章来源转载

评论

评论列表

微信小程序
QQ小程序

关于作者

点赞数:0
关注数:0
粉丝:0
文章:0
关注标签:0
加入于:--