Instructions to use Toadoum/recit-110m with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- Transformers
How to use Toadoum/recit-110m with Transformers:
# Use a pipeline as a high-level helper from transformers import pipeline pipe = pipeline("text-classification", model="Toadoum/recit-110m")# Load model directly from transformers import AutoModel model = AutoModel.from_pretrained("Toadoum/recit-110m", device_map="auto") - Notebooks
- Google Colab
- Kaggle
RECIT-110M — CamemBERTa-v2
Relation Extraction with Certified Interpretable Typing. Récit: "life story" in French, which is what the model is built to read.
A 110M bi-encoder for French causal discourse relation extraction. Given two
discourse units it predicts none / result (A causes B) / explanation (B causes A),
and every prediction can carry a subset-minimal sufficient explanation with a necessity
test.
Results (EXPLICADIS-fr test, 4 seeds)
| metric | value |
|---|---|
| macro-F1 (3-way) | 0.770 ± 0.007 |
| F1 result (A to B) | 0.718 ± 0.021 |
| F1 explanation (B to A) | 0.635 ± 0.021 |
| binary causal F1 | 0.702 ± 0.009 |
| direction accuracy | 0.964 ± 0.015 |
Binary causal F1 of instruction-tuned models prompted in French on the same 770 pairs: Llama-3.1-8B 0.268 · Qwen3-8B 0.296 (0.360 at 3-shot) · Mistral-Small 0.338. This model is 70 to 220 times smaller.
Usage
The model was trained on boundary-marked pairs and on specific prompts. Both are
stored in recit_head.json; using different ones degrades it silently.
import json, torch
from transformers import AutoTokenizer, AutoModel
repo = "Toadoum/recit-110m"
tok = AutoTokenizer.from_pretrained(repo)
enc = AutoModel.from_pretrained(repo).eval()
cfg = json.load(open("recit_head.json")) # prompts, tau, classes
def embed(texts):
b = tok(texts, padding=True, truncation=True, max_length=128, return_tensors="pt")
with torch.no_grad():
o = enc(**b).last_hidden_state
m = b["attention_mask"].unsqueeze(-1)
return torch.nn.functional.normalize((o * m).sum(1) / m.sum(1).clamp(min=1), dim=-1)
pair = "[A] il a rejoint un groupe de jeunes [B] il a commencé à commettre des vols"
p = torch.softmax((embed([pair]) @ embed(cfg["prompts"]).T) / cfg["tau"], -1)
print(dict(zip(cfg["classes"], p[0].tolist())))
Training
Three stages, all French:
- in-domain silver — French administrative court decisions, pairs split at causal connectives, the connective then deleted and subordinating pairs reversed to supply the direction French adverbial connectives do not (dataset)
- MT silver — 35k PDTB causal instances translated into French
- gold — EXPLICADIS, 2,078 pairs (276 causal)
Removing the manufactured stages costs 0.144 macro-F1 and multiplies seed variance by eight, so they are not optional.
Limitations
- 276 gold causal instances: differences under ~0.03 F1 sit inside seed variance.
- On real child-protection case files the model recovers about 12% of annotated causal edges and none of the implicit ones. Benchmark scores do not predict behaviour on transcribed speech. Do not deploy this on case files without human review.
- A causal graph over a person's trajectory records what a narrator asserted, not what caused what.
- Recommended model. Use this one unless you need the multilingual backbone.
Citation
@inproceedings{recit2026,
title = {RECIT: Frugal and Verifiable Causal Discourse Relation Extraction for French},
author = {Toadoum Sari, Sakayo and Sa\"is, Lakhdar and Jabbour, Sa\"id and Delorme, Fabien and Robin, Nelly},
year = {2026}
}