Einmal suchen, dreimal fragen: Multi-Query-tool_search mit Stemming


Dein Agent braucht ein Tool – vielleicht muss er ein GitHub-Issue anlegen, eine Slack-Nachricht senden und das Web durchsuchen, alles in einer Aufgabe. Unter dem alten System waren das drei separate tool_search-Aufrufe, und wenn er eine Query falsch schrieb („issuse“ statt „issues“) oder nach einem Wort suchte, das nicht exakt dem Tool-Namen entsprach, kam er leer zurück und musste es erneut versuchen. Jeder Fehlversuch kostet Tokens und Latenz. Hermes v0.20.6 behebt das mit einem ernsthaften Upgrade für tool_search (Commit e455e4afd0): Multi-Query-Suche, gebündeltes describe und Snowball-Stemming.

Die Änderung ist klein in der Form und groß im Verhalten: tool_search nimmt jetzt queries: string[] entgegen, parallel gegen denselben Katalog gesucht; die Ergebnisse kommen pro Query gruppiert zurück, mit einer gemeinsamen Tools-Map, die Quelle, Beschreibung und die Namen der benötigten Parameter jedes gefundenen Tools hält. tool_describe nimmt names: string[] und liefert eine nach Namen verschlüsselte Map – ein einzelner falscher Name lässt also nicht mehr den ganzen Aufruf scheitern. Und Snowball-Stemming bedeutet, dass eine Query nach „issues“ ein Tool namens create_issue matcht und „browsing“ browser_exec findet. Schauen wir uns an, was sich geändert hat und warum das wichtig ist.

Der alte Weg vs. der neue Weg

Vorher: eine Query pro Aufruf, ungefähr exaktes Matching, Pro-Antwort-Fallback, wenn eine Query danebenlag:

tool_search("browser")        → eine Trefferliste
tool_search("web search")     → ein weiterer Aufruf, eine weitere Liste
tool_search("read pdf")       → ein dritter Aufruf

Nachher: ein Aufruf, mehrere Queries, gruppierte Ergebnisse:

{ "queries": ["browser snapshot", "web search cache", "read pdf"] }

Jede Query wird unabhängig gegen denselben Katalog gesucht, das Limit gilt pro Query (Standard 5, auf das konfigurierte Maximum von 25 geklemmt), und die Antwort gruppiert passende Tool-Namen pro Query, während eine einzelne gemeinsame tools-Map Quelle, Beschreibung (400-Zeichen-Cap) und die Namen der benötigten Parameter jedes Tools trägt – einmal geladen, nicht pro Query wiederholt. Wenn einige Queries danebenliegen, ersetzt ein einzelner Top-Level-Block available_sources + Hinweis den alten Pro-Antwort-Fallback.

Das Schema, direkt aus der Tool-Definition:

  • queries: Array aus Strings, „jeweils ein paar Keywords, die eine Fähigkeit beschreiben (z. B. ['create github issue', 'send slack message']). Parallel gesucht; Ergebnisse kommen gruppiert pro Query zurück. Ein einzelner String wird akzeptiert und als eine Query behandelt.“
  • limit: „Maximale Anzahl Treffer pro Query. Standard 5, auf das konfigurierte Maximum (25) geklemmt.“

Stemming: matcht, was du meinst, nicht was du tippst

Der leise Held dieser Änderung ist Snowball-Stemming (Englisch). Der Stemmer wird identisch sowohl auf dem Index-Pfad (wenn der Katalog gebaut wird) als auch auf dem Query-Pfad angewendet, sodass eine Query nach „issues“ ein Tool namens create_issue matcht, „browsing“ browser_exec matcht und „searches“ web_search matcht. Du musst die exakte Verbform oder Pluralform nicht mehr erraten – die Engine normalisiert beide Seiten.

Ein Implementierungsdetail, das erwähnenswert ist: Snowball-Stemmer-Instanzen halten mutablen Parsing-State, sind also nicht sicher über Threads zu teilen – und Bridge-Dispatch kann auf parallelen Tool-Call-Threads laufen. Hermes erstellt einen Stemmer pro Thread, lazy – eine kleine, aber echte Korrektheits-Fix, die in der Funktion versteckt ist.

tool_describe: Namen bündeln, soft failen

tool_describe bekommt dieselbe Behandlung: Es nimmt jetzt names: string[] und liefert eine nach Namen verschlüsselte Map. Unbekannte Namen sammeln sich in not_found (mit dem Refresh-Hinweis), und nicht aufschiebbare Namen behalten ihren Spelling-Check-Fehler pro Name in errorsein einzelner falscher Name lässt nicht mehr den ganzen Aufruf scheitern. Duplikate werden stillschweigend dedupliziert. Nach einem Multi-Query-tool_search kann der Agent also mehrere Kandidaten in einem Aufruf beschreiben, und ein vertippter Name kostet eine Notiz statt eines Retrys.

Was das in der Praxis bedeutet

Drei konkrete Gewinne:

  • Weniger Round-Trips. Eine Aufgabe, die drei Fähigkeiten braucht, bekommt einen tool_search-Aufruf statt drei und danach ein gebündeltes tool_describe. Weniger Aufrufe = geringere Latenz und weniger Chancen, dass das Modell den Faden verliert.
  • Günstigere Discovery. Die gemeinsame Tools-Map bedeutet, dass die Metadaten jedes gefundenen Tools einmal gesendet werden, nicht pro Query wiederholt – und auf dem Draht sind die Tool-Definitionen selbst mit dieser Änderung schlanker geworden (die breitere Schema-Diät im selben Fenster hat browser_exec von 803 auf 663 Tokens/Aufruf getrimmt). Discovery ist einer der token-hungrigsten Teile eines langen Agent-Laufs; das nimmt ihm etwas.
  • Bessere Recall. Stemming tötet die Fehlklasse „knapp daneben, aber nicht exakt“: „issues“ → create_issue, „browsing“ → browser_exec, „searches“ → web_search. Der Agent findet das richtige Tool, selbst wenn er die Query leicht daneben formuliert.

Warum es für deine Workflows wichtig ist

Tool-Discovery ist unsichtbare Infrastruktur – du siehst sie nie, außer sie scheitert, und wenn sie scheitert, strampelt der Agent oder wählt ein falsches, aber naheliegendes Tool. Multi-Query + Stemming + gebündeltes describe entfernt den Großteil dieser Fehlerfläche. Es ist die Art Upgrade, die lange autonome Läufe (Batch-Aufgaben, Cron-Jobs, delegierte Subtasks) spürbar robuster macht: Der Agent braucht für eine Aufgabe ein Browser-Tool, ein Such-Tool und einen PDF-Reader – und findet alle drei auf einen Schlag.

Mehr zu den Tools selbst findest du in unserem Befehls-Panorama für die volle Oberfläche dessen, was tool_search finden kann, im Browser-Snapshot-Budget dafür, wie Browser-Sessions günstig bleiben, und im Web-Search-Cache-Beitrag für das Schwester-Caching-Upgrade im selben Fenster. Die komplette v0.20.6-Übersicht steht in unseren Release-Notes.

Ein Aufruf, drei Queries, gestemmt, gruppiert, dedupliziert – der Agent findet das richtige Tool schneller und günstiger, und „ich konnte kein Tool dafür finden“ wird jeden Tag ein bisschen seltener.