57 lines
4.9 KiB
Markdown
57 lines
4.9 KiB
Markdown
# 处方 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 客户端执行:
|
|
|
|
```sql
|
|
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` 执行的最终结果:
|
|
|
|
```powershell
|
|
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、旧租约写入、无效证据和附件不可读取均有覆盖。
|