# DSPy MIPROv2：同时搜索指令与示例，在固定调用预算内提高少数类召回

已在真实DSPy 3.4.1中用未调用的DummyLM离线占位实例化MIPROv2；已执行80条类别划分和零召回反例审计。未执行搜索、优化或真实模型调用。

## 运行

在本目录使用独立虚拟环境并安装requirements.txt；脚本结果写入results。

```sh
python reference/audit.py
python reference/run_sdk.py
```

fixtures是原创输入与故意失败样本；作者真值、离线合成provider和实际SDK记录各自标明，不是模型正确率。需要真实模型/账号/GPU的步骤按正文另行授权运行。

## 1. 查看真实的类别分布

tickets.json有80条作者工单，routine 60、billing 12、escalate 8。先看每个split是否都有escalate，不能拿整体准确率掩盖少数类漏报。

## 2. 建立零召回反例

failure-predictions.json故意把两条escalate都预测为routine。运行reference/audit.py应得到少数类召回0；这些是作者反例，不是MIPRO的真实输出。

## 3. 实例化MIPROv2并核对签名

运行reference/run_sdk.py，用SDK自带的DummyLM离线占位来实例化MIPROv2(auto=None,num_candidates=2)。不设置prompt/task LM会被当前版本拒绝；离线占位没有被调用，更不生成候选。保存compile签名。

## 4. 分开指令与示例候选

search-config.json分别限制候选数、labeled demos和bootstrapped demos。指令只描述任务，示例必须来自train；validation用于搜索评分，test不参与提案。

## 5. 把预算放在实际LM调用处

request_budget是作者执行政策，不是MIPRO原生参数。授权实跑时在LM包装层计数，每次真实provider请求前检查上限；命中缓存、失败和重试分别登记。

## 6. 执行小规模搜索并保存轨迹

在有可用模型的环境调用compile，先用4个num_trials和小批验证。当前包只完成数据审计和optimizer实例化，没有候选搜索结果或费用结论。

## 7. 用独立测试复核少数类

保存并重载最佳程序，最后对test逐条推理。报告各类别TP/FN、escalate召回、整体准确率和全部调用数；超过12次预算时应停止并报告未完成。

## 官方依据

- DSPy 官方文档或源码：https://raw.githubusercontent.com/stanfordnlp/dspy/main/docs/docs/learn/optimization/optimizers.md
