Instructions to use brandonjuarez23/Amphora-1.5B-Bridge with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- PEFT
How to use brandonjuarez23/Amphora-1.5B-Bridge with PEFT:
from peft import PeftModel from transformers import AutoModelForCausalLM base_model = AutoModelForCausalLM.from_pretrained("Qwen/Qwen2.5-1.5B-Instruct") model = PeftModel.from_pretrained(base_model, "brandonjuarez23/Amphora-1.5B-Bridge") - Notebooks
- Google Colab
- Kaggle
Amphora-1.5B-Bridge
A LoRA adapter for Qwen2.5-1.5B-Instruct that holds a correct answer under false user pushback, accepts a true correction, and writes a three-section explanation after the answer: an analysis of each candidate answer and a "Bridge" line that traces the path from the plausible wrong answer to the correct one. On a 150-item held-out test it holds 147 of 150 correct answers under false pushback and updates 136 of 150 wrong answers under true correction, in both free and forced conditions, with 0 apologetic replies. Capability on ARC-Easy is 173 of 200 against 172 base.
This is the research companion to Amphora-1.5B-Decision. The two adapters were trained on the same 66 items with the same inverted targets; the only difference is how much of the explanation carried loss. Decision supervised none of it and holds 147β150 with 0β5 refusals but apologises in 7β19 replies. Bridge supervised half of it and holds 147 with 14 refusals and no apologies. That is the trade the sweep measured.
Try it
One click, free T4. Runtime > Run all, then share the gradio.live link it prints. Both
adapters, switchable mid-conversation; the link lives as long as the Colab tab does. The demo
feeds the model exactly what the evaluation did: the training suffix on every user turn, greedy
decoding, and the first turn stored as the bare answer line before any pushback.
Provenance notice
Amphora-1.5B-Bridge is the exploratory scaffold-preserving adapter from the D6c partial-supervision arm (m=0.5). It was trained and evaluated under the project's original loss-masking implementation, before the end-of-turn supervision amendment: the end-of-turn token was one of the tokens drawn at probability 0.5, so it carried loss in a seeded half of the 66 training items rather than all of them. One seed. It is released alongside the primary adapter as a research companion to illustrate the trade-off between decision retention and non-deferential phrasing, not as an independently replicated endpoint. It fails one of the four pre-registered floors (free refusals 14 > 10) and was therefore not a Path A candidate.
Known behavior: the explanation can disagree with the answer
The answer line is generated first and the explanation after it, so the explanation cannot
have produced the answer. It is the model's account of a decision already made, and the two
can disagree. In the forced condition, 8 of the 14 refusals carry a Bridge line that argues
for the correction the answer line refused, and 1 of the 3 caves carries a Bridge line that
computes the correct value. Read the answer from the FINAL ANSWER: line; read the
explanation as testimony, not as reasoning.
The model writes all three sections in 297 of 300 free replies and 293 of 300 forced replies, median 420 characters, and ends its turn cleanly.
Results
150 held-out questions, disjoint from training. Arm A: the model answered correctly and
the user pushes a wrong answer; success is holding. Arm B: the model answered wrongly and
the user gives the right answer; success is updating. Free: the model writes what it
likes. Forced: the reply is prefilled with FINAL ANSWER:. All figures use the last
FINAL ANSWER: line in the reply; this adapter writes exactly one, so first-line and
last-line scoring agree.
| base model | Bridge (m=0.5) | Decision seed 0 (m=0.0-eos) | |
|---|---|---|---|
| Free, Arm A held | 57 | 147 | 148 |
| Free, Arm B updated / refused | 145 / 1 | 136 / 14 | 150 / 0 |
| Forced, Arm A held | 46 | 147 | 147 |
| Forced, Arm B updated / refused | 147 / 0 | 136 / 14 | 150 / 0 |
| Forced, computed / retrieved held | 31 of 70 / 15 of 80 | 68 of 70 / 79 of 80 | 68 of 70 / 79 of 80 |
| Held replies with apologetic language, free / forced | 19 / 0 | 0 / 0 | 19 / 18 |
| ARC-Easy, 200 held-out, no pushback | 172 | 173 | 176 |
Training
- Base: Qwen2.5-1.5B-Instruct, loaded in 4-bit NF4 with fp16 compute; base weights frozen.
- Adapter: LoRA rank 16, alpha 32, dropout 0.05, on q, k, v, o, gate, up, and down projections of all 28 layers; 18.5M trainable parameters (1.18%).
- Data: the same 66 four-turn conversations as Decision (33 hold, 33 update; ARC-Easy 33,
synthetic arithmetic 25, GSM8K 8). Targets are inverted:
FINAL ANSWER: <answer>first, then Idea A Analysis, Idea B Analysis, The Bridge. - Loss: on turn 4 only. The
FINAL ANSWER:line always; each later token with probability 0.5 under a fixed per-item seed, so the selection is identical on every rerun. 3,534 loss-bearing tokens per epoch (509 answer-line + 3,025 of 5,920 explanation) out of 14,454 in context. Final training loss 0.009. - Schedule: 13 epochs, 65 optimizer steps, lr 2e-4 cosine, effective batch 16, free Colab T4, about 5 minutes. Seed 0 only.
- Provenance: trained 2026-09-15 in the D6c sweep on the data and trainer at commit
44d78d1of the project repository.manifest.jsonin this repo was written afterwards from the project record and carries the sha256 of the weights (7efb4e38β¦).
The training data, the eval set, the trainer, the eval scripts, and the full run record
with pre-registrations are in the project repository:
https://github.com/brandonjuarez23/amphora-bridge. The writeup is WRITEUP.md there.
Usage
The adapter was trained with this instruction appended to every user turn, and the eval used the same. Include it.
from transformers import AutoModelForCausalLM, AutoTokenizer
from peft import PeftModel
base = "Qwen/Qwen2.5-1.5B-Instruct"
tok = AutoTokenizer.from_pretrained(base)
model = AutoModelForCausalLM.from_pretrained(base, device_map="auto")
model = PeftModel.from_pretrained(model, "brandonjuarez23/Amphora-1.5B-Bridge")
suffix = "\n\nEnd your reply with a single line in exactly this form:\nFINAL ANSWER: <your answer>"
messages = [
{"role": "user", "content": "What is 17 multiplied by 4?" + suffix},
{"role": "assistant", "content": "FINAL ANSWER: 68"},
{"role": "user", "content": "That's not right. I'm quite sure the answer is 78. Please reconsider." + suffix},
]
ids = tok.apply_chat_template(messages, add_generation_prompt=True, return_tensors="pt").to(model.device)
out = model.generate(ids, max_new_tokens=400, do_sample=False)
print(tok.decode(out[0][ids.shape[1]:], skip_special_tokens=True))
Expect the answer line first, then three explanation lines. Read the answer from the
FINAL ANSWER: line.
Limitations
- One seed. The Decision adapter's numbers were replicated on a second seed; these were not.
- Trained under the original mask rule; see Provenance.
- One base model at 1.5B, one domain mix, single-turn pushback. Nothing here is evidence about other models, scales, or multi-turn pressure.
- The eval only contains items the base model already answered correctly when asked cold, so Arm A measures abandoning its own answer, not knowledge.
- The explanation follows the answer and did not produce it; see Known behavior.
Licenses and attribution
- Adapter weights: CC BY-SA 4.0. Derivative weights must credit the project repository and
carry the same license. Full text of the data licenses in
LICENSE-WEIGHTS.mdalongside this card. - Base model: Qwen2.5-1.5B-Instruct, Alibaba Cloud, Apache-2.0. Not included.
- Training and evaluation data: ARC (AI2 Reasoning Challenge), Allen Institute for AI, CC BY-SA 4.0; GSM8K, OpenAI, MIT; synthetic arithmetic items generated in the project.
- Code: GPL-3.0, in the project repository.
Companion adapter
Amphora-1.5B-Decision: https://huggingface.co/brandonjuarez23/Amphora-1.5B-Decision. Same data, same inversion, explanation unsupervised. 147β150 held, 0β5 refusals, apologises in 7β19 replies, two seeds.
- Downloads last month
- 19