reasongraph-extractor-qwen3-0.6b
One small LLM for the three reasongraph extraction
tasks -- causal cause/effect/signal spans, contradiction detection, and entity extraction --
from a single LoRA adapter over Qwen/Qwen3-0.6B, selected by a task
tag and returning strict JSON. This is the conflict-capable, llama.cpp-servable variant:
unlike the qwen3.5 extractor, this base runs in llama.cpp today, so it is the model behind
reasongraph's self-hosted FineTunedConflictResolver.
- Method: LoRA (r=16, alpha=32, dropout 0.05, all linear layers, 3 epochs, completion-only loss), merged to fp16.
Tasks & prompt format
Prompt with a bare task tag (no chat template) and greedily decode the JSON completion.
| Tag | Input | Output |
|---|---|---|
[causal] | [causal] <sentence> | `{"causal": true |
[conflict] | [conflict] existing: <fact A>\nnew: <fact B> | `{"conflict": true |
[entities] | [entities] <sentence> | {"entities": ["...", ...]} |
Evaluation (L1)
| Metric | value |
|---|---|
| CNC subtask-2 dev F1 (official scorer) | 0.651 |
| Conflict F1 (40 hand pairs, fp16) | 0.851 |
| CPU Q4_K_M causal latency (4 threads) | ~930 ms/sentence, ~3871 sentences/hour, ~1.2 GB RAM |
llama.cpp serving (conflict resolver)
llama-server -m qwen3-0.6b-multitask-Q4_K_M.gguf -t 4 -c 2048
Per-pair conflict via /v1/completions (or /completion), temperature 0, cache_prompt,
with a JSON grammar so the reply is strict yes/no:
root ::= "{\"conflict\": \"" ("true" | "false") "}"
(exact grammar used in production: root ::= "{" ws "\"conflict\"" ws ":" ws ("true"|"false") ws "}").
Prompt = "[conflict] existing: {existing}\nnew: {new}". Served figures: served Q4_K_M conflict F1 0.851 at 141 ms/pair (median, 4 threads), p90 162 ms (H3).
Files
model.safetensors-- merged fp16 model (load withtransformers).qwen3-0.6b-multitask-Q4_K_M.gguf-- 4-bit GGUF forllama.cpp.adapter/-- standalone LoRA adapter (apply onQwen/Qwen3-0.6B).
License
Apache-2.0, inherited from the Qwen3 base. Causal News Corpus training text is CC0-1.0.