Argos 2B (DPO-Aligned Merged Model)
Argos 2B is an advanced domain-adapted model for Fabrix.ai / RDAF knowledge retrieval, documentation citation, and hop-closed custom widget dashboard pack generation.
This model combines:
- Supervised Fine-Tuning (SFT) on the comprehensive Fabrix / RDAF knowledge base and custom widget recipes.
- Direct Preference Optimization (DPO) trained concurrently on:
- Single-card preference pairs (
delta_20260821_dpo.jsonl) to strictly enforce card citations (kb/cards/*.md). - Hop-closed custom widget pack preference pairs (
pack_custom_widget_dpo.jsonl) to guarantee exact 34-item ordered card dependencies for custom widget dashboards.
- Single-card preference pairs (
📊 Alignment & Benchmark Performance
| Evaluation Benchmark | Baseline SFT | Argos 2B (DPO Aligned) |
|---|---|---|
| DPO Training Accuracy | 50.0% | 100.0% |
Card Format Accuracy (kb/cards/*) | 40.9% | 100.0% (22/22) |
| Single-Card Preference Citation Accuracy | 4.5% | 59.1% exact match |
| Custom Widget Pack Order Accuracy | 0.0% | 81.2% (13/16) |
🚀 Quickstart with transformers
import torch
from transformers import AutoTokenizer, AutoModelForCausalLM
model_id = "Fabrix-AI-Inc/Argos-2B"
tokenizer = AutoTokenizer.from_pretrained(model_id)
model = AutoModelForCausalLM.from_pretrained(
model_id,
torch_dtype=torch.float16,
device_map="auto",
)
system_prompt = (
"You are Fabrix cite-mode retrieval. Reply with repo-relative kb/ paths only, one per line. "
"Prefer kb/cards/*.md. Cite a topic file (kb/pstreams/, kb/widgets/, kb/dashboards/, kb/ux/, kb/entry/) "
"only when no card fits. Typically 1-5 paths. No prose, no HTML, no line numbers, no GET/POST examples, "
"no secrets. Zero paths only if nothing under kb/ applies."
)
messages = [
{"role": "system", "content": system_prompt},
{"role": "user", "content": "Put a group filter on the top so I can pick site type, tier, and primary transport."},
]
prompt = tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
inputs = tokenizer(prompt, return_tensors="pt").to(model.device)
with torch.no_grad():
outputs = model.generate(
**inputs,
max_new_tokens=64,
do_sample=False,
)
response = tokenizer.decode(outputs[0][inputs.input_ids.shape[1]:], skip_special_tokens=True)
print(response.strip())
# Output: kb/cards/widget-filters.md
🏗️ Architecture & Model Specs
- Base Architecture:
Qwen3_5ForConditionalGeneration(2.3B parameters) - Format: Standalone Merged 16-bit Float Safetensors
- Adapter Version:
Fabrix-AI-Inc/Argos-2B-LoRA - Training Toolkit: Unsloth / Hugging Face Transformers / TRL / PyTorch