Skip to content

Build1 publisher2 min readPublished Updated

Paraphrased requests drop BM25 tool recall to 5 percent across a 100-tool pool

Deferred tool loading assumes retrieval puts the right tool in the shortlist. A BM25 harness over 100 synthetic enterprise tools and 200 tasks says it does that 5 percent of the time when the user does not use your words.

The Engineer · Build desk

Illustration accompanying Paraphrased requests drop BM25 tool recall to 5 percent across a 100-tool pool

What happened

  • A dev.to post split agent tool selection into a recall stage and a selection stage after a reader comment framed it that way, then tested recall only, because you can measure recall without a live model.
  • The harness scores BM25 over the serialized definitions of 100 synthetic enterprise tools at terse, realistic and verbose description lengths, with a shortlist of five and 200 tasks, two per tool.
  • On requests that echo a tool's own domain words, retrieval is effectively solved, and even terse descriptions score perfectly because the tool name alone carries the match.
  • On paraphrased requests that share the intent and the identifier but no content word, recall at five falls to 5 percent, and the verbose tier at 208 tokens per tool scores statistically the same.

Compiled by The EngineerSomething wrong?How this is made

Why it matters

  • exposure A retrieval miss raises no error. The agent answers from the wrong five tools, and the trace looks like a cheap, successful turn, so nothing in monitoring fires.
  • cost Buying recall with shortlist width is a recurring bill: at this pool size it runs near 100 tokens per recall point, charged on every call of every session.
  • decision Whoever writes the tool descriptions now has a cheaper place to spend the budget: the words users actually type, instead of another paragraph drawn from the same domain vocabulary.

BM25 is a lexical scorer. It ranks each tool by the words it shares with the request, and the documents it scores here are the serialized tool definitions: name, description, parameter descriptions [7]. So the terse tier wins the easy case. When the request says "Please approve the claim CLM-2041." [8], approve_claim is a direct term match, and the post reports that the tool name alone carries it [9].

The paraphrase tasks were built to remove that overlap. "Can you sign off on that damage report, number CLM-2041?" shares the intent and the identifier with the approval tool and not one content word [8]. Recall at a shortlist of five is 5 percent [10]. The post describes the gap in plain vocabulary terms: users say "bill", "delivery", "sign off" while the descriptions say "invoice", "shipment", "approve" [12].

Then the width sweep. Five realistic tools cost about 542 tokens per model call and ten cost 1,040 [13], and the extra five slots move recall from 5 to 10 percent [14]. Call it 498 additional tokens in every call for five points, close to 100 tokens per point [1]. The slope is one point per tool added, so closing the gap by width alone implies a hundred-tool shortlist [2] at roughly 10,400 tokens per call [3]. That is the whole manifest deferred loading exists to avoid shipping [20].

The alias line prices differently. At 13.4 tokens per tool [17], a five-tool shortlist carries about 67 extra tokens per call [4], and the alias condition already reaches 100 percent recall at a shortlist of three [15]. The verbose tier's 97 extra tokens per tool [17] is 485 per call at the same shortlist [5], for recall statistically identical to realistic [11]. The post's explanation is that the extra words repeat the same words [21].

Both endpoints of this eval are constructed, and that governs what transfers. The 5 percent floor comes from tasks written to share no content word with the description [8], and the author states the caveat directly: the alias sentences contain the same synonyms the paraphrase tasks use, so 100 percent is the ceiling case [18]. Real traffic sits somewhere in between. The method is what transfers: stage one runs without a model [3], so a team can run its own retriever over its own manifest against logged user phrasings and get a recall number before paying for a single selection run [4]. The harness here is BM25 [7], and the post does not test an embedding retriever.

What to watch

  • Stage two, selection from the shortlist, still needs live model runs and has not been published.
  • An alias set built from logged production phrasings rather than the eval's own synonyms would give a non-ceiling recall number.
  • Whether an embedding retriever narrows the paraphrase gap without alias lines. This BM25 harness does not answer that.
Loading claim ledger
Loading source directory links
Loading share composer
Loading topic controls
Loading related stories