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绕过, 运行时操纵, 逆向工具