The cheapest retrieval is the one you do not make. A skip rule is not laziness; it is how you keep the average cost of a session down so you can afford a real read on the turns that matter.
Four conditions are worth encoding, roughly in order of how often they fire:
The answer is in the current context. If the relevant fact appears in the last few turns or in a tool result already in the window, retrieving it again burns budget for a duplicate. A cheap check (exact or fuzzy match of the query against the current working context) catches most such turns.
The write policy has nothing recent or relevant. If no memory covering this topic was written in the last N turns, retrieval returns low-score rows that are more likely to mislead than help. Score a skip when the top candidate is below your threshold.
The question is a task step, not a recall request. Tool calls, formatting requests and confirmations rarely need memory. Classify intent first, then route only the recall-shaped queries to retrieval.
The request is latency-critical. A voice turn has a much tighter budget than a background research run (latency budgets). For the first output in a live interaction, prefer no retrieval over a slow one, and let later turns retrieve if needed.
A simple, testable implementation:
def read_memory(query, ctx, budget):
if budget.tokens_left < 400:
return [] # budget exhausted for this turn
if query_matches_working_context(query, ctx.window):
return [] # answer already visible
if not ctx.recent_writes(within_turns=budget.n_turns):
return [] # nothing fresh to find
rows = retrieve(query, k=budget.candidate_k)
rows = [r for r in rows if r.score >= budget.min_score]
rows = rows[:budget.max_rows]
rows = fit_to_tokens(rows, budget.max_tokens)
return rows
Skipping has to be measured too. Add a "skipped" flag to your retrieval logs, and in your eval set include questions that should return nothing. If skipped turns show up in low-quality answers, your skip rule is too aggressive; if skip share is under a few percent, it is not firing at all and you are paying for retrievals you did not need.
A useful framing for the whole decision comes from the memory architecture literature: retrieval decides what the agent knows in the moment of a turn (Mem0 retrieval strategies). The decision rule is therefore: retrieve when there is a plausible row you would bet on, skip when there is not.