t46/bootstrap-inject
GitHub: t46/bootstrap-inject
针对小型语言模型的零搜索 few-shot 示例注入工具,通过删除无效的选择搜索步骤,以约 0.2 倍的 rollout 成本匹配 DSPy 随机搜索的提示优化质量。
Stars: 0 | Forks: 0
# bootstrap-inject
**针对小型 LM 的零搜索 few-shot 示例注入。** 引导生成正确的轨迹,
随机注入 *k* 个,然后停止。无需验证/选择搜索。
它是对 DSPy 的 `BootstrapFewShot[WithRandomSearch]` 的一次*精简*,外加一个
用于告诉你是否值得折腾的廉价预检。在 3B 级模型上,它以 **约 0.2 倍的 rollouts** 匹配了
随机搜索的示例优化效果——因为它删除的搜索部分原本只是在给噪声排序。
```
from bootstrap_inject import LM, BootstrapInject, ceiling_probe
lm = LM(model="qwen2.5:3b-instruct") # local ollama by default
# 1. pre-flight:demo 对这个任务有帮助吗?(scope guard,约 2*n rollouts)
v = ceiling_probe(lm, seed_prompt, heavy_scaffold_prompt, trainset, n=50)
print(v) # -> PROCEED (elicitation-bound) | SKIP (capability-bound)
# 2. operator:bootstrap 正确的 traces,随机 inject k,无 search
if v.predicted_helps:
res = BootstrapInject(k=3, pool_n=40, seed=0).compile(lm, seed_prompt, trainset)
print(res.prompt) # seed prompt + 3 self-generated worked exemplars
print(res.rollouts_used) # == pool_n; search_rollouts == 0
```
DSPy 用户可以使用一个直接替换的 teleprompter(`pip install bootstrap-inject[dspy]`):
```
from bootstrap_inject.dspy_teleprompter import BootstrapInjectTeleprompter
compiled = BootstrapInjectTeleprompter(metric, k=3, max_pool=40).compile(student, trainset=trainset)
```
请参阅 [docs/dspy.md](docs/dspy.md) 获取完整的安装/导入/编译方案,
以及用于验证适配器连线的离线冒烟测试形态。
## 核心理念
DSPy 的 few-shot 优化器做两件事:(1) **bootstrap(引导)** —— 在
训练集上运行 teacher 模型并保留它做对的 demonstrations;(2) **select(选择)** —— 搜索
许多候选示例集,并保留在验证集上得分最高的那一个。
`BootstrapFewShotWithRandomSearch` 主要是步骤 (2)。
在小型模型上,**步骤 (2) 纯属噪声。** 我们测量了一个
示例集的 validation-gate(验证门限)分数与其在留存集上的准确率,发现它们几乎不相关:一个
gate-0.45 的示例集在 dev 上得分 **0.67**,而一个 gate-0.80 的示例集得分 **0.63**。这个
gate 对示例集的排序并不比随机 chance 更好,因此花在搜索上的每一次 rollout 都是
浪费。删掉它。引导生成一个包含正确自生成轨迹的池子,随机注入其中的 *k* 个,然后发布。
| optimizer | bootstrap | selection search | rollouts (this setup) |
|---|---|---|---|
| `BootstrapFewShot` | ✓ | first-k, no search | ~`max_pool` |
| `BootstrapFewShotWithRandomSearch` | ✓ | search demo-sets on valset | **~200** |
| **`BootstrapInject`** | ✓ | **none** | **~40 (`pool_n`)** |
## 适用与不适用场景(请阅读此部分)
注入是**有条件的**,且该条件*并非*“低基线”。它在任务是**elicitation-bound(受引导限制)**(模型能做到,但简单的 prompt 未能充分引发其推理)时有帮助;而在**capability-bound(受能力限制)**(模型做不到;示例只会分散注意力)或当**bootstrap 池太单薄**(仅从简单项中提取的 self-demos 无法迁移到难题上)时则无效。
在 BBH 子任务上验证,使用 `qwen2.5:3b-instruct`,dev[:100],3 个 seeds:
| task | structure | competent baseline | injection (k=3, 40 ro) | Δ | verdict |
|---|---|---|---|---|---|
| logical_deduction_three_objects | 3-obj ordering | 0.55 | 0.643 | **+0.093** | helps |
| date_understanding | temporal 5-way MC | 0.44 | 0.513 | **+0.073** | helps ✓ verified |
| logical_deduction_five_objects | 5-obj ordering | 0.41 | 0.413 | +0.003 | flat (thin pool 12/40) |
| navigate | spatial yes/no | 0.74 | 0.670 | −0.07 | regresses (capability-bound) |
这种优势可以跨*结构*泛化(从排序到时间算术),因此它并非
死记硬背了某一个任务族。但是 `navigate` 出现了倒退,`five_objects` 表现平平——单凭
基线水平(0.74 对 0.41)无法告诉你具体是哪种情况。
### 范围防线
`ceiling_probe` 通过两次廉价的评估实现了判别器的具体化:在一个小切片上对比
competent seed 与一个 **heavy-scaffolding**(“像这样一步步做”)prompt。
- `ceiling_acc > baseline_acc` → 提升空间在于 elicitation → **预计注入会有帮助**。
- `ceiling_acc ≤ baseline_acc` → 即使确切告诉模型怎么做,它也做不到
→ **capability-bound,跳过。**
这在任何 seed 扫描*之前*就标记了 `navigate`:它的 heavy-scaffold prompt 得分为
**0.57 < 0.74** 基线——显式的坐标跟踪*会损害* 3B 模型的表现。它是一个
预测器,而不是证明:池子的代表性是探测器无法看到的第二个条件
(`five_objects` 通过了探测器,但在 12/40 的池子上表现依然平平)。
## 证据
所有数据均来自 AAD 测试套件(预注册协议,从
记录的提交版本的全新检出中重新执行)。bet-0002,`qwen2.5:3b-instruct`:
- **M1 efficiency** — protocol `p-3083b999`:`rollouts_used == 40` 在 ×3
seeds (`r-a15a971f3a`, `r-414130a605`, `r-8554146a2a`) 上复现。对比随机搜索的 200。
- **M1 quality** — protocol `p-c795222b`:平均 dev **0.643** 复现
(`r-1d28105667`),对比随机搜索的 0.650 —— 在 0.2× rollouts 下相等;在冻结的
测试集上,注入效果在每个 seed 上均 ≥ 随机。
- **M2 generalization** — protocol `p-29bcb252`:date_understanding 平均 dev
**0.513** (Δ+0.073) 从全新检出复现 (`r-de42201882`,已验证)。
- **gate–dev decorrelation**(为什么选择步骤是可以删除的):`r-9070d71cfa`
(gate-0.45 → dev 0.67) 对比 `r-cd8122be8f` (gate-0.80 → dev 0.63)。
这是一个关于小型模型、prompt 引导的结果。它**不**适用于大型
模型,不适用于具有多答案/部分记分指标的任务,也不适用于超出
探测器所把控范围的情况。我们追求严谨而非广度。
## 安装 / 测试
```
pip install bootstrap-inject # core (httpx only)
pip install bootstrap-inject[dspy] # + DSPy teleprompter
pytest # offline tests (no network)
uv run --with dspy-ai --with httpx python examples/dspy_integration.py # live DSPy wiring
```
## License
MIT。
标签:AI风险缓解, DLL 劫持, DSPy, 人工智能, 优化算法, 大语言模型, 少样本学习, 用户模式Hook绕过, 运行时操纵, 逆向工具