When relevance hides in a latent attribute the document barely surfaces.
Relevance is usually topical — the document is about what you asked. Oblique retrieval is the case where it is not: what makes a document relevant is a latent attribute it barely surfaces.
| Task | The latent attribute | The query looks like |
|---|---|---|
| 🐦 Twitter-Conflict | an implicit stance | a description of an opinion never stated outright |
| ➗ Math Meta-Program | the abstract proof strategy | an example problem, "find others that reason this way" |
| ✍️ Writing-Style | the authorial fingerprint | a prose snippet, "find this voice on other topics" |
| 🏛️ Congress Hearings | the rhetorical dynamic | a hazy, half-remembered recollection |
OBLIQ-Bench, which named the setting, shows the damage: pipelines built on frontier LLMs score near zero on most of these, while the same LLMs happily verify relevance once a candidate is put in front of them. The bottleneck is first-stage search.
OBLIQ-IR is a 3B single-vector retriever trained for that bottleneck.
pip install -r requirements.txtfrom sentence_transformers import SentenceTransformer
model = SentenceTransformer("DataScience-UIBK/OBLIQ-IR-3B", trust_remote_code=True)
q = model.encode(["query: " + "A passage in the same restless, aphoristic voice as this one."])
d = model.encode(["passage: " + doc for doc in corpus])
scores = model.similarity(q, d)
⚠️ Thequery:/passage:prefixes are required. Do not add a task-instruction prefix — the model was neither trained nor evaluated with one.
Two guides, in the order you would use them:
| data_gen/README.md | how the training data is generated — the three query lenses, hard-negative mining, and the authorship kNN graph |
| TRAINING.md | training, retrieval, evaluation, reranking, merging |
The short version:
export OBLIQ_REPO_ROOT=$PWD
python scripts/download_obliq_bench.py --out_dir work/obliq_local # benchmark
python data_gen/annotate_attribute.py --task $T # describe the latent attribute
python data_gen/gen_queries.py --task $T # write a query through its lens
python data_gen/mine_hard_negatives_fast.py --task $T # BM25 hard negatives
python data_gen/mine_luar_positives_writing.py --task writing --positives_per_anchor 3 # teacher graph
python scripts/assemble_training_mix.py # -> training mixture
sbatch --partition=<yours> scripts/train_obliq_ir_40gpu.sh # train
python rerank/save_topk.py --model_path <ckpt> --out_dir work/run --obliq_root work/obliq_local ...
python rerank/eval_rerank.py --in_dir work/run --obliq_root work/obliq_local ...Don't want to regenerate 10⁵ LM calls? The exact mixture we trained on is on the Hub:
huggingface-cli download DataScience-UIBK/OBLIQ-IR-Data --repo-type dataset \
--include 'data/train/*' --local-dir obliq-ir-dataTwo training signals, mixed into one encoder shared by all tasks.
1. Per-mechanism synthetic queries. An instruction LM reads a document, writes a description of the task's latent attribute, then writes a query through one of three lenses matched to the OBLIQ query mechanisms — descriptive, analogue, tip-of-the-tongue — with four BM25 hard negatives per query.
2. kNN-graph distillation from a frozen authorship encoder (writing only). The teacher's k=3 nearest-neighbour graph over the writing corpus supplies anchor–positive pairs. Only the topology is used — the teacher's similarity scores are discarded. That transfers a style-versus-topic inductive bias no topical lens can express, lifting Writing-Style from .096 to .211.
Neither stage ever touches the OBLIQ qrels.
NDCG@10 Gold. Full adds TourRank (Y=5) on Math/Twitter/Congress; on Writing the selected policy is the identity, so the dense model is the full system there.
| Pipeline | ✍️ Writing | ➗ Math | 🏛️ Congress | |
|---|---|---|---|---|
| BM25 | .077 | .022 | .000 | .000 |
| Qwen3-Embed-4B | .033 | .095 | .032 | .040 |
| Gemini-2-Embedding | .164 | .144 | .068 | .059 |
| GPT-5.2 Multi-Hop Agent | .061 | .161 | .141 | .183 |
| OBLIQ-IR (no distillation) | .096 | .148 | .158 | .196 |
| OBLIQ-IR dense | .211 | .140 | .151 | .187 |
| 🏆 OBLIQ-IR full | .211 | .171 | .177 | .281 |
Gains are large and significant on Writing (+0.116) and Congress (+0.085, both p<0.001), and marginal on Math (p=0.08) and Twitter (p=0.06). We do not claim the fifth task, WildChat-Errors.
data_gen/ query generation, prompts, BM25 negatives, authorship kNN mining (see its README)
scripts/ download benchmark · assemble mixture · SLURM launcher · merge LoRA
train/ the training script
rerank/ dense retrieval · TourRank · task-aware listwise · scoring
eval/ standalone dense evaluation
OBLIQ-IR-3B |
OBLIQ-IR-3B-LoRA |
…-no-distill |
|
|---|---|---|---|
| Size | 6.1 GB | 48 MB | 6.1 GB |
| Needs the base model | no | yes (automatic) | no |
| What it is | the model, merged | the same weights as an adapter | ablation without the distillation |
@inproceedings{abdalla2026obliqir,
title = {{OBLIQ-IR}: Training a Dense Retriever for Oblique Queries},
author = {Abdalla, Mahmoud and Abdallah, Abdelrahman and Sedek, Shaimaa and Jatowt, Adam},
booktitle = {Proceedings of the 2026 Conference on Empirical Methods in Natural Language Processing},
year = {2026}
}Code is MIT (LICENSE). Model weights and data are CC BY-NC 4.0 — the backbone
nvidia/llama-nv-embed-reasoning-3b is released for non-commercial/research use and is built with
Llama 3.2, whose community licence also applies.
Retrieval by authorial fingerprint can link texts to an author across topics and venues, and so deanonymise pseudonymous writers. The authorship encoder we distil is trained on Reddit data, and because style correlates with demography and dialect, the distilled structure may carry those correlates. We did not audit for this; any deployment over people's writing should.