问题出现得很突然,日志倒是留得挺全。用 dspy 2.4 写了分类程序,compile 之后在同一个进程里效果不错,但服务每次重启都会重跑一遍 MIPROv2,编译要十几分钟,把 program 存成 json 再 load 又报字段缺失。

刚开始盯着「load 时签名类定义变了,字段对不上」,折腾了半个多小时,排掉了。

排查方向其实有限,先把可能性排一排。编译产物只存在内存,没有调用 save。另一种情况是save 的路径在容器里是临时目录,重启即丢。

另外,编译用了随机种子,每次结果本来就不同。

第一件事是确认程序对象的类型与字段

python -c "import dspy;print([k for k in dspy.Predict('q -> a').__dict__][:8])"

显式保存编译结果到持久目录

python -c "import dspy;p=dspy.Predict('q -> a');p.save('/data/dspy/prog.json');print('saved')"

然后启动时先读缓存再决定是否编译

python -c "import os;print(os.path.exists('/data/dspy/prog.json'))"

固定随机种子让编译可复现

python -c "import random;random.seed(42);print('seeded')"

怎么算真的好了,看的是同一批现象。重启后日志里不再出现编译阶段,直接加载耗时小于两秒,同一批输入的输出与上次一致。

补一句。编译产物要当成配置管理,路径写进持久卷并在启动脚本里先判断存在性,否则重启就是重烧一遍。报错文案容易误导,真正的原因往往在相邻那一层的日志里。

作者 9823189