AI Agents
Atlas
An agentic retrieval system that decomposes a question, routes across five source types and returns an answer with paragraph-level citations.
The problem
Single-shot RAG fails on questions that need more than one lookup. "How did our churn in EMEA compare to the forecast we set in Q2, and what did the support tickets say?" is three retrievals and a synthesis step, not one.
Architecture
A planner decomposes the query into sub-questions, a router picks the right source for each, and a synthesiser merges the results with citations preserved end to end.
class Plan(BaseModel):
steps: list[Step]
merge_strategy: Literal["synthesise", "compare", "rank"]
async def answer(question: str) -> Answer:
plan = await planner.decompose(question)
results = await asyncio.gather(*(route_and_fetch(s) for s in plan.steps))
return await synthesiser.merge(question, results, strategy=plan.merge_strategy)
What actually moved the numbers
| Change | Accuracy | Notes |
|---|---|---|
| Baseline single-shot RAG | 61.2% | 400-token fixed chunks |
| + semantic chunking | 68.9% | Biggest single win |
| + cross-encoder rerank | 79.1% | Cost +40 ms |
| + query decomposition | 88.3% | Only helps multi-hop |
| + citation verification | 91.4% | Rejects unsupported claims |
The lesson: retrieval quality dominated. Two-thirds of the total gain came from changes upstream of the model.
Next