4.9 KiB
处方 AI 真实进度后端审查记录
2026-09-10。范围仅为后端代码、SQL 迁移和隔离测试;未修改真实业务数据,未启动、停止或重启真实消费者,未调用模型接口。
实现
- 新增
PrescriptionAiProgress,只接收阶段、阶段状态、分组计数和时间戳;数据库progress_json是最多 2048 字符的小字段。标签、提示和单位全部由固定中文文案产生,绝不从模型内容、缓存步骤、URL、锁令牌或病例字段派生。 models[key].progress在状态、历史和详情接口统一返回;batch.progress返回资料准备、转写等待期限、自动继续说明等。模型结果正文无法覆盖可信的progress。- 文字资料、附件、每轮证据汇总显示真实已处理组数。文字/汇总必须通过结构和引用校验才能递增;附件明确无法读取也计为已处理组,并说明不等于读懂全部附件。每轮汇总重新计数,不给出总百分比或预计结束时间。
- 调用模型前持久化
phase=waiting;模型返回后显示本地处理;报告校验和处方对比有独立阶段。生成器内部原有stage=completed仅为内部兼容,公开阶段此时仍是validating。公开完成必须由结果入库事务的success状态确认。 - 正在运行的任务 90 秒无更新时只提示“暂无新的进度更新”,不据此断言模型超时或消费者失联。失败/待重试提示上次真实阶段。
- 模型耗时明确为本次尝试耗时,重试重新开始阶段计时,等待重试不会增加上一次执行耗时。成功/失败通过
finished_at冻结时间;批次历史使用已结束模型的时间,后续source_updated不增加原批次处理耗时。 - 进度更新使用
checkpoint(..., persistCache: false),不重新加密或覆盖不断增长的模型缓存。仅模型响应和已有的无效缓存清理继续保存完整密文;比较前也保留原缓存。相同秒内更新没有改变数据时仍会检查实际租约,避免错误拒绝合法任务。 - 权限、资料版本、当前租约仍须通过原有检查。原调用计数、累计预算、重试策略、候选方案策略均保留,未增加模型调用。
数据库兼容与部署
新增迁移:server/database/migrations/2026_09_10_prescription_ai_progress.sql。
迁移依赖现有 2026_09_09_prescription_ai_analysis.sql 创建的任务表,只新增一个可空 VARCHAR(2048) 列,不修改原迁移或历史任务。新迁移重复执行已在独立 MySQL 验证;存在列时执行无结果集的 SET 空操作,普通 PDO 分语句执行也可重复运行。
在已连接并选中应用数据库的 MySQL 客户端执行:
SOURCE D:/web/zyt/server/database/migrations/2026_09_10_prescription_ai_progress.sql;
建议迁移后部署新代码。为兼容本地目录直接服务请求的滚动更新,Store 和 API 均缓存检查列是否存在:旧库不查询或写入不存在的列,仍使用原加密缓存继续/完成任务;公开界面返回诚实的“暂无分段进度记录”。进程缓存到退出为止,因此迁移后应在任务空闲时重新加载三个消费者。已在运行的旧代码任务不凭空补造分组进度,需等其自然完成。根任务负责真实迁移与空闲重启。
验证
所有 MySQL 测试只连接根任务建立的 127.0.0.1:13379 独立测试实例,每次建立随机 prescription_ai_test_* 数据库,正常结束删除自己的数据库。首次调试的重复迁移 SELECT 1 游标问题已修复,但其早期随机测试库可能残留在专用实例;由根任务随实例回收。
从 D:\web\zyt 执行的最终结果:
php server/tests/PrescriptionAiProgressTest.php
# 38 checks passed
php server/tests/PrescriptionAiGeneratorTest.php
# passed,含原有预算、缓存清理、附件退化回归与新增真实进度断言
php server/tests/PrescriptionAiComparisonTest.php
# 252 checks passed
php server/tests/PrescriptionAiPolicyTest.php
# 20 checks passed
$env:ZYT_AI_TEST_MYSQL_PORT='13379'
php server/tests/PrescriptionAiQueueTest.php
# 68 checks passed
php server/tests/PrescriptionAiPipelineTest.php
# 80 checks passed
php server/tests/PrescriptionAiQueueTest.php --legacy-progress-schema
# 66 checks passed
php server/tests/PrescriptionAiPipelineTest.php --legacy-progress-schema
# 75 checks passed
八个新增/修改 PHP 文件的 php -l 均通过。SQL 监听断言确认状态、详情、历史查询模型任务时不读取 progress_cipher 或 SELECT *;元数据字段只包含标量。真实 Worker/Store/ORM 集成验证两个模型在入库前分别发布 comparing,保留原密文,且此时尚无对应结果。生成器验证四次正常调用只保存四次完整缓存,纯进度通知和校验计数不会额外保存完整缓存;恢复后不重复模型调用。拒绝 checkpoint、旧租约写入、无效证据和附件不可读取均有覆盖。