A deep-research agent does not search with a user's question. It searches with short queries it writes itself, in the middle of a long chain of reasoning, and the reasoning says what the agent is actually looking for. Agent-UIBK-v1 is a retriever for that setting. It reads the agent's current reasoning together with its search query, in the format introduced by AgentIR:
Reasoning: <the agent's reasoning in the current turn>
Query: <the search query>
Agent-UIBK-v1 is UIBK-Embedding-v1 fine-tuned on agent search data. It keeps that model's design: one encoder holds a late-interaction (ColBERT) retriever and a dense retriever, and both are stored in one list of 128-dimensional vectors, so a plain MaxSim adds the two scores. It loads as a PyLate ColBERT model and works with any PLAID index.
Notably it:
BrowseComp-Plus asks 830 hard questions over a fixed corpus of 100,195 web documents. The agent searches the corpus with the retriever (top 5 results, 512-token snippets) and, in the get_document setting, can also read a full document by its id. Accuracy is judged by Qwen3-32B.
| Retriever | Size | Tools | Accuracy (%) | Recall (%) | Search calls | get_document calls | Calibration error (%) |
|---|---|---|---|---|---|---|---|
| Agent-ModernColBERT | 149M | search + get_document | 72.53 | 72.84 | 15.85 | 2.50 | 22.07 |
| Agent-UIBK-v1 | 179M | search + get_document | 72.41 | 71.25 | 13.37 | 2.58 | 24.16 |
| Reason-ModernColBERT | 149M | search + get_document | 61.20 | 60.84 | 13.87 | 1.97 | 32.45 |
| GTE-ModernColBERT-v1 | 149M | search + get_document | 58.92 | 57.99 | 13.29 | 1.76 | 32.84 |
| AgentIR-4B | 4B | search | 66.99 | 78.13 | 24.08 | — | 22.55 |
| Agent-UIBK-v1 | 179M | search | 64.10 | 72.92 | 18.28 | — | 27.58 |
| Agent-ModernColBERT | 149M | search | 63.86 | 74.84 | 21.49 | — | 25.55 |
| UIBK-Embedding-v1 | 179M | search | 59.04 | 68.07 | 19.56 | — | 29.74 |
| Reason-ModernColBERT | 149M |
The numbers of the other models are those of the BrowseComp-Plus leaderboard (October 2026). The UIBK rows are our own runs; the UIBK-Embedding-v1 row uses the tool-call repairs below but plain queries, as that model was not trained on reasoning.
How to read the comparison.
Each row is a single run, and agent runs vary. Between two of our own fine-tunes with nearly equal quality, about 160 of the 830 questions were solved by one run and not by the other. Differences of one to three points between rows are therefore within run-to-run variation. The difference between Agent-UIBK-v1 and Agent-ModernColBERT with get_document is one question.
Our runs use the benchmark's own agent client with two changes:
The prompt, the tools, top-k, the snippet length and the judge are the benchmark's. AgentIR's own client patches similar vLLM issues. The repairs are not specific to this model: with UIBK-Embedding-v1 they moved accuracy from 56.57 (829 of 830 queries finished) to 59.04.
Being able to read full documents matters more than any retriever difference here: get_document adds 8.3 points to Agent-UIBK-v1.
Here the model ranks the corpus for the 830 plain questions, with no agent and no reasoning. Evidence documents are those needed to answer a question; gold documents also contain the answer.
| Retriever | Size | Evidence nDCG@10 | Evidence R@5 | Evidence R@100 | Evidence R@1000 | Gold nDCG@10 | Gold R@5 | Gold R@100 | Gold R@1000 |
|---|---|---|---|---|---|---|---|---|---|
| Agent-UIBK-v1 | 179M | 24.78 | 18.20 | 47.84 | 68.03 | 25.51 | 25.67 | 57.61 | 76.76 |
| Qwen3-Embedding-8B | 8B | 20.26 | 14.53 | 47.73 | 76.72 | 19.46 | 18.48 | 55.75 | 83.54 |
| UIBK-Embedding-v1 | 179M | 17.35 | 12.32 | 39.73 | 64.41 | 15.52 | 14.47 | 45.14 | 69.23 |
| ReasonIR-8B | 8B | 16.81 | 12.24 | 43.55 | 73.86 | 15.46 | 15.30 | 49.65 | 78.92 |
| Qwen3-Embedding-4B | 4B | 14.05 | 9.76 | 40.19 | 71.80 | 13.63 | 12.97 | 47.31 | 76.95 |
| Qwen3-Embedding-0.6B | 0.6B | 8.01 | 6.18 | 26.51 | 59.69 | 7.40 | 8.51 | 30.51 | 66.20 |
| Jina-ColBERT-v2 | 559M | 7.90 | 5.70 | 18.10 | 35.70 | 6.80 | 6.60 | 20.40 | 39.70 |
| BM25 | — | 1.63 | 1.18 |
Documents are truncated to 2048 tokens. Agent-UIBK-v1 leads at the top of the ranking, and Qwen3-Embedding-8B (45 times larger) leads at depth 1000.
The model is specialised for agent search and gives up some general retrieval quality. For ordinary queries, use UIBK-Embedding-v1.
| Model | Average | ArguAna | ClimateFever | DBPedia | FEVER | FiQA2018 | HotpotQA | MSMARCO | NFCorpus | NQ | Quora | SCIDOCS | SciFact | Touche2020 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| UIBK-Embedding-v1 | 70.43 | 58.14 | 51.81 | 68.76 | 96.82 | 64.61 | 93.47 | 69.99 | 39.81 | 80.39 | 96.91 | 45.34 | 82.30 | 67.19 |
| Agent-UIBK-v1 | 67.34 | 28.93 | 53.03 | 70.89 | 95.65 | 61.98 | 93.29 | 67.20 | 39.22 | 78.24 | 96.04 | 45.60 | 83.87 | 61.45 |
Both rows come from our development evaluation, which uses exact MaxSim search with no index. Most of the loss is on ArguAna, whose queries are whole arguments. Two things changed there:
We have not separated these two effects.
The architecture is that of UIBK-Embedding-v1:
The one difference at inference is the query: up to 2048 tokens, and the token head reads all of them (UIBK-Embedding-v1: 256 tokens, of which the token head reads the first 64).
query: and document: (required)Reasoning: <reasoning>\n\nQuery: <query> (Reasoning: Empty when there is no reasoning)branched_transformer.py (the two-top encoder) and hybrid_tokens.py (the output layer) in this repository, the same code as in UIBK-Embedding-v1The model is used with PyLate. Three things differ from an ordinary ColBERT model:
trust_remote_code=True, because two small modules in this repository define the two-top encoder and the output layer;prompt_name="query" for queries and prompt_name="document" for documents;Reasoning: <reasoning>\n\nQuery: <query>.pip install -U pylate "transformers>=5.3" "sentence-transformers>=5.3"
from pylate import models, rank
model = models.ColBERT("DataScience-UIBK/Agent-uibk-v1", trust_remote_code=True)
def agent_query(query: str, reasoning: str | None = None) -> str:
"""The input format the model was trained on (AgentIR)."""
return f"Reasoning: {reasoning or 'Empty'}\n\nQuery: {query}"
query = agent_query(
"planet known as the Red Planet",
reasoning="The question describes a planet with a reddish surface caused by iron oxide. "
"I should find which planet is called the Red Planet before checking its moons.",
)
documents = [
"Venus is often called Earth's twin because of its similar size and proximity.",
"Mars, known for its reddish appearance, is often referred to as the Red Planet.",
"Jupiter, the largest planet in our solar system, has a prominent red spot.",
"Saturn, famous for its rings, is sometimes mistaken for the Red Planet.",
]
queries_embeddings = model.encode([query], is_query=True, prompt_name="query")
documents_embeddings = model.encode(documents, is_query=False, prompt_name="document")
print(queries_embeddings[0].shape, documents_embeddings[0].shape)
# (49, 128) (18, 128)
ranking = rank.rerank(
documents_ids=[[1, 2, 3, 4]],
queries_embeddings=queries_embeddings,
documents_embeddings=[documents_embeddings],
)
print([(d["id"], round(d["score"], 2)) for d in ranking[0]])
# [(2, 48.42), (4, 48.35), (3, 48.32), (1, 48.2)]
MaxSim sums over query tokens, so scores grow with the length of the query. Compare scores only within one query.
In an agent loop, build the retriever input from the reasoning the LLM produced in the turn that issued the search call, and keep the plain query in the conversation. With gpt-oss on the Responses API, this is the text of the reasoning items of the response, as in AgentIR's client:
from pylate import indexes, models, retrieve
model = models.ColBERT("DataScience-UIBK/Agent-uibk-v1", trust_remote_code=True)
index = indexes.PLAID(index_folder="pylate-index", index_name="corpus", override=True, batch_size="auto")
index.add_documents(
documents_ids=corpus_ids,
documents_embeddings=model.encode(corpus_texts, batch_size=32, is_query=False, prompt_name="document"),
)
retriever = retrieve.ColBERT(index=index)
def search(query: str, reasoning: str | None, k: int = 5):
text = f"Reasoning: {reasoning or 'Empty'}\n\nQuery: {query}"
embeddings = model.encode([text], is_query=True, prompt_name="query")
return retriever.retrieve(queries_embeddings=embeddings, k=k)[0]
For large collections of long documents, keep batch_size="auto" in indexes.PLAID(...): with 2048-token documents the fixed default scoring batch can run out of GPU memory. For indexing, reranking and loading an existing index, the examples in the UIBK-Embedding-v1 card apply unchanged.
query: and document: ;The learning rate, the 2048-token lengths and the AgentIR input format follow the recipe of Agent-ModernColBERT.
The BrowseComp-Plus runs served gpt-oss-120b and the Qwen3-32B judge with vLLM 0.30.0.
trust_remote_code=True, transformers >= 5.3 and the two prompts.@misc{uibk2026agent,
title={Agent-UIBK-v1: A Retriever for Deep-Research Agents},
author={{Data Science Group, University of Innsbruck}},
year={2026},
howpublished={\url{https://huggingface.co/DataScience-UIBK/Agent-uibk-v1}},
}
@misc{uibk2026embedding,
title={UIBK-Embedding-v1: Unifying late Interaction and Bi-encoders with Knowledge distillation},
author={{Data Science Group, University of Innsbruck}},
year={2026},
howpublished={\url{https://huggingface.co/DataScience-UIBK/uibk-embedding-v1}},
}
@article{chen2026AgentIR,
title={AgentIR: Reasoning-Aware Retrieval for Deep Research Agents},
author={Zijian Chen and Xueguang Ma and Shengyao Zhuang and Jimmy Lin and Akari Asai and Victor Zhong},
year={2026},
journal={arXiv preprint arXiv:2603.04384}
}
@inproceedings{zhou2026lrat,
title={Learning to Retrieve from Agent Trajectories},
author={Zhou, Yuqi and Dai, Sunhao and Qu, Changle and Pang, Liang and Xu, Jun and Wen, Ji-Rong},
booktitle={Proceedings of the 49th International ACM SIGIR Conference on Research and Development in Information Retrieval},
year={2026}
}
@article{chen2025BrowseCompPlus,
title={BrowseComp-Plus: A More Fair and Transparent Evaluation Benchmark of Deep-Research Agent},
author={Chen, Zijian and Ma, Xueguang and Zhuang, Shengyao and Nie, Ping and Zou, Kai and Liu, Andrew and Green, Joshua and Patel, Kshama and Meng, Ruoxi and Su, Mingyi and Sharifymoghaddam, Sahel and Li, Yanxi and Hong, Haoran and Shi, Xinyu and Liu, Xuye and Thakur, Nandan and Zhang, Crystina and Gao, Luyu and Chen, Wenhu and Lin, Jimmy},
year={2025},
journal={arXiv preprint arXiv:2508.06600}
}
@inproceedings{DBLP:conf/cikm/ChaffinS25,
author = {Antoine Chaffin and Rapha{\"{e}}l Sourty},
title = {PyLate: Flexible Training and Retrieval for Late Interaction Models},
booktitle = {Proceedings of the 34th {ACM} International Conference on Information and Knowledge Management, {CIKM} 2025},
pages = {6334--6339},
publisher = {{ACM}},
year = {2025},
url = {https://github.com/lightonai/pylate},
doi = {10.1145/3746252.3761608},
}
We thank the authors of AgentIR and of LRAT for releasing their agent search data and trajectories; LightOn for PyLate, FastPLAID and Agent-ModernColBERT, whose recipe we followed; the BrowseComp-Plus team for a fair and reproducible benchmark; and OpenAI and Qwen for the open models used as the agent and the judge.
| search |
| 59.04 |
| 68.64 |
| 18.87 |
| — |
| 30.07 |
| GTE-ModernColBERT-v1 | 149M | search | 55.66 | 66.94 | 17.51 | — | 31.02 |
| Qwen3-Embedding-8B | 8B | search | 44.10 | 52.63 | 18.35 | — | 39.32 |
| BM25 | — | search | 29.16 | 35.50 | 19.45 | — | 45.92 |
| 4.66 |
| 13.65 |
| 1.66 |
| 1.39 |
| 6.10 |
| 17.28 |