这类问题我又碰上了一次。DSPy 3.0 把 Signature 里的 question 改成 query,重新 compile 之后跑出来还是旧字段,报 KeyError: 'question';删掉 .dspy_cache 才恢复,重新编译一次要 20 分钟,模型是 gpt-4o-mini。
第一反应是「加载的是上一次保存的 program.json,不是新编译结果」,验证下来不成立。
把日志和配置对完,能解释这个现象的基本就这几处。编译产物按 Signature 类名缓存,字段变化不算 key;缓存目录在用户家目录,代码里没显式设置路径;类名没变,DSPy 认为签名一致直接复用。
先打印当前 Signature 的字段定义
python -c "import dspy;print(dspy.Signature('QA', 'query -> answer').fields)"
再往下确认缓存目录里有哪些编译产物
python -c "import dspy,os;print(dspy.configure_cache)"
编译前清掉旧缓存并显式指定目录
python -c "import shutil;shutil.rmtree('.dspy_cache',ignore_errors=True)" && python compile.py --cache-dir .cache_v2
等前面都确认过,再用新字段跑一条样例验证
python run.py --signature QA --input '退款多久到账'
改完先别撤,确认这几项。新 Signature 编译后不再出现 KeyError,缓存目录里生成的是新文件,同样输入的输出与旧版本明显不同。
这里还有个坑。DSPy 的缓存 key 不看字段内容,改签名后必须手动失效;把缓存目录纳入版本管理或者每次编译换目录,能避免这类幽灵结果。这类问题最好一次改到位,反复小改反而容易把原因搅混。
