Semble - recherche de code pour agents utilisant 98 % de tokens en moins que grep
(github.com/MinishLab)- Semble est une bibliothèque de recherche de code conçue pour que les agents trouvent immédiatement uniquement les extraits de code nécessaires via des requêtes en langage naturel ou en code
- Par rapport à
grep+read, elle utilise environ 98 % de tokens en moins et renvoie uniquement les chunks pertinents au lieu de lire des fichiers entiers - Elle indexe un dépôt moyen en environ 250 ms et répond aux requêtes en environ 1,5 ms, tout en fonctionnant sur CPU sans clé API, GPU ni service externe
- Le benchmark a été réalisé sur 63 dépôts dans 19 langages avec environ 1 250 requêtes, et Semble y atteint 99 % de la qualité de
CodeRankEmbedHybrid tout en étant 218 fois plus rapide à l’indexation - Dans le benchmark d’efficacité des tokens, Semble utilise en moyenne 98 % de tokens en moins et atteint 94 % de rappel avec seulement 2k tokens, tandis que
grep+readatteint 85 % de rappel avec une fenêtre de contexte de 100k - Un serveur MCP permet son utilisation avec Claude Code, Cursor, Codex, OpenCode et les agents compatibles MCP ; les dépôts sont clonés et indexés si nécessaire, et l’index est mis en cache pendant la session
- L’usage via Bash est aussi pris en charge, ce qui permet d’intégrer les workflows
semble searchetsemble find-relateddansAGENTS.mdouCLAUDE.md; cette approche est nécessaire pour les sous-agents de Claude Code et du CLI Codex - Le CLI accepte à la fois les chemins locaux et les URL Git en
https://, et sipathest omis, le répertoire courant est utilisé par défaut - Il peut aussi être utilisé comme bibliothèque Python, avec
SembleIndex.from_path,SembleIndex.from_git,searchetfind_relatedpour intégrer la recherche à des outils personnalisés - En interne, tree-sitter découpe les fichiers en chunks conscients de la structure du code, puis combine les embeddings
potion-code-16MdeModel2VecavecBM25, avant de fusionner les scores via Reciprocal Rank Fusion - Le classement exploite une pondération lexicale pour les requêtes symboliques, un boost pour les chunks de définition, la correspondance de racines d’identifiants, la pertinence au sein d’un même fichier, ainsi qu’une pénalisation pour les tests, le legacy, les exemples et les fichiers
.d.ts - Comme il utilise un modèle d’embeddings statique, il n’y a pas de transformer forward pass au moment des requêtes, ce qui permet une recherche en quelques millisecondes sur CPU
semble savingsestime les tokens économisés à chaque recherche en comparant le nombre total de caractères des fichiers uniques auxquels appartiennent les chunks renvoyés avec le nombre de caractères des extraits renvoyés, et enregistre les statistiques dans~/.semble/savings.jsonl- Le package peut être installé depuis PyPI via
semble, et pour l’usage MCP, la formeuvx --from "semble[mcp]" sembleest utilisée - La licence est MIT
1 commentaires
Avis sur Hacker News
En utilisant ce genre d’outil, j’ai l’impression de voir que l’IA elle-même devient plus stupide, un peu comme les développeurs quand ils deviennent trop dépendants des outils d’IA
Les IA agentiques sont déjà assez intelligentes pour trouver des parcours plutôt optimisés dans l’exploration ou la recherche de code, mais avec ce type d’outil elles ont tendance à agir de façon trop agressive, parce que les résultats de recherche ne donnent presque toujours que des pointeurs plutôt que tous les détails
J’ai fait un test simple avec Pi en lui demandant de suivre le parcours complet de collecte et de recherche sur un projet d’une complexité moyenne : avec
codebase-memory-mcp, on était à 85k/4.4k tokens en entrée/sortie, avec ma config habituelle à 67k/3.2k, et sans aucun outil à 80k/3.2kLa qualité du résultat et la quantité d’information étaient les mêmes, et cet outil, sans être catastrophique, a plutôt empiré les choses
Ma configuration habituelle consiste juste à mettre une ligne dans
AGENTS.mdetCLAUDE.mddisant « lis d’abordPROJECT.md»Dans
PROJECT.md, je mets simplement une description du projet en 2 ou 3 lignes, les fichiers pertinents avec une phrase de description, les points d’attention, puis une consigne destinée au LLM : « si une modification mérite d’être documentée, mets ce fichier à jour. Le but de ce fichier est de donner une idée générale du projet, puis de permettre d’explorer plus loin si nécessaire »Au travail, j’utilisais auparavant Augment Code, qui avait une sorte de Context Engine proche d’un MCP répondant à des requêtes en langage naturel sur du code préindexé
Ensuite je suis passé à Claude Code, et de façon assez étrange il essaie de lire les fichiers avec
seden se basant sur des plages de lignes dont il se souvient, alors même qu’il dispose d’un outil de lecture par plageJe ne suis pas certain qu’on puisse appeler ça un parcours hautement optimisé
codebase-memory-mcpetsemblene sont pas exactement la même chose, mais c’est une comparaison intéressante, donc je vais l’ajouter à ma liste de vérifications et essayer de l’inclure dans les benchmarks si possibleSi tu as l’occasion de faire la même comparaison avec
semble, ce serait un retour vraiment utile. Ce genre de scénario « réel » est difficile à benchmarker ou à reproduireIntéressant. Je travaille aussi dans ce domaine, mais avec une approche différente
Au lieu de construire un index, j’ai fait un grep plus intelligent avec classement et compréhension de la structure du code sur l’ensemble du codebase et du texte brut, et comme j’ai passé la majeure partie du temps à traiter les problèmes de performances, c’est très rapide
Il faudrait l’ajouter à la comparaison avec https://github.com/boyter/cs pour voir ce que les LLM préfèrent sur le type de questions que je pose
Ça fournit aussi un MCP, mais sans créer d’index de recherche. Comme ça utilise des variantes sémantiques du code plutôt que du BM25 classique, je suis curieux de voir comment le classement ressortirait
Cet outil semble mieux adapté à des requêtes du type « comment fonctionne l’authentification ? », alors que
csfait unauthenticate --only-declarations, puis pondère les résultats selon le contenu du fichier, c’est-à-dire si l’occurrence se trouve dans du code ou dans un commentaire, ainsi que selon la complexité globale du fichierJ’ai mis une étoile et je vais suivre ça
Je sais que cet outil est pensé pour l’IA, mais je suis encore plus intéressé par le fait de l’utiliser directement pour explorer un nouveau codebase ou mon propre codebase
Ça semble utile quand on veut voir la vue d’ensemble de ce qu’il faut modifier pour refactorer quelque chose
Les LSP font déjà ce genre de travail, mais cet outil a l’air de pouvoir aller un cran plus loin
J’ai fait quelques évaluations avec Pi et GPT 5.5
J’ai testé RTK activé / headroom activé / les deux activés / les deux désactivés, avec dans tous les cas les instructions système standard de Pi, et sans
AGENTS.mdJ’ai oublié quels étaient exactement les tests, mais c’étaient quelques évaluations standard d’agents utilisées par les gens, avec un projet Python et un projet TypeScript, les langages que j’utilise
Je ne prétends pas que c’était un test rigoureux ni même un bon test. J’aurais peut-être obtenu de meilleurs résultats après une journée à ajuster
AGENTS.mdainsi que les prompts système et instructions d’outils de Pi. Une chose que j’ai apprise en lançant ces évaluations, c’est que ce genre de différence subtile peut beaucoup changer les résultatsMais le cas avec les deux désactivés était clairement meilleur, au point que ça a suffi pour arrêter les tests au bout de 3 tours
Le problème, c’est que l’usage du contexte baissait parfois, mais que le nombre de tours jusqu’à la complétion augmentait, donc le coût total de la conversation finissait par être plus élevé
Voir autant de gens partager ce genre d’outil me fait surtout prendre conscience qu’il n’y a souvent aucune évaluation, ou alors qu’elle est extrêmement difficile à reproduire, ou encore que, comme ici malgré de nombreux benchmarks, on mesure la mauvaise chose
Oui, cet outil utilise moins de tokens que
grep, et les benchmarks le prouvent, mais ce n’est pas ça qui compte. Ce qui compte, c’est de savoir si l’agent peut faire le même travail, à qualité égale, plus vite et à moindre coût grâce à cet outilCe n’est pas un problème propre à cet outil, c’est le problème de tout ce qui consiste à brancher de l’IA sur un codebase ou sur un flux de développement
Même avant l’IA, on n’avait pas de tests pour mesurer « à quelle vitesse et avec quelle qualité ceci a été développé », et on n’en a toujours pas ajouté aujourd’hui
J’aimerais voir de vrais benchmarks d’agents. Par exemple en retirant
grepde Claude Code ou de Copilot CLI pour le remplacer par cet outilJ’ai regardé RTK et plusieurs implémentations LSP, et les modèles sont tellement renforcés à utiliser
grepqu’ils ne font pas confiance à d’autres formes de résultats et réessaient ou relisent sans cesseDu coup, comme le modèle ne fait pas confiance aux résultats de l’autre outil, tout le gain de tokens disparaît
CLAUDE.mdglobal (sous~/.Claude) qu’il fallait utiliser le LSP au lieu degrep, et depuis je n’ai plus ce problèmeEn revanche, quand certaines options CLI précises de
findne sont pas prises en charge, il affiche un message d’erreur au lieu de renvoyer la sortie complète de la commande, ce qui m’agaceL’agent gaspille alors des tokens à réessayer, ou pire, il est tellement intimidé par le prompt disant qu’il ne faut pas exécuter la commande sans RTK qu’il n’essaie même pas
C’est anecdotique, mais nous utilisons évidemment nous-mêmes cet outil, et jusqu’ici il fonctionne plutôt bien
Les modèles d’Anthropic semblent appeler cet outil et faire confiance à ses résultats
Il ne faut pas mesurer seulement la sortie de recherche, mais la boucle complète de l’agent
rgparce quegrepest souvent trop lent, mais si on ajoute RTK il se remet à utilisergrepvia RTK, ce qui est un peu agaçantL’idée m’a paru bonne, donc j’ai un peu joué avec
J’ai fait le test sur le dépôt
browsercode(https://github.com/browser-use/browsercode), avec le prompt : « utilise uniquement la CLIsemble, et dis quels outils Browsercode fournit à l’agent en plus des outils OpenCode de base. Donne le schéma exact des entrées/sorties de ces outils, et résume brièvement ce qu’ils font et comment ils fonctionnent »J’y ai collé l’extrait
AGENTS.mdde https://github.com/MinishLab/semble#bash-integrationPour le test sans Semble, j’ai reformulé la même question en demandant d’utiliser uniquement les CLI
rgetfdDans les deux cas, j’ai utilisé Pi et gpt-5.4 medium, avec une configuration très minimale. J’ai aussi vérifié que dans un cas il n’utilisait bien que
rgetfd, et dans l’autre uniquementsembleSans Semble, le modèle a utilisé 10,9 % du contexte et 0,144 $ de crédits API, contre 9,8 % et 0,172 $ avec Semble
Les réponses obtenues étaient aussi presque identiques, donc c’était très proche
J’ai refait un test sur le dépôt OpenCode, avec cette fois la question : « suis le chemin depuis l’endroit où la variable d’environnement
OPENCODE_EXPERIMENTAL_EXAest définie à 1 jusqu’au résultat visible dans le prompt système ou les outils fournis à l’agent OpenCode »J’ai inclus les mêmes consignes et la même documentation que plus haut
La version sans Semble était un peu plus détaillée, et expliquait aussi si le chemin d’appel d’outil invoquait Exa selon que Exa ou Parallel était activé comme fournisseur de recherche web, mais les deux versions répondaient correctement à la vraie question
La version Semble a utilisé 14,7 % de contexte pour un coût API de 0,282 $, contre 19,0 % et 0,352 $ pour la version sans Semble
En efficacité de contexte, victoire nette pour Semble, mais il faut noter que la version sans Semble s’est terminée environ deux fois plus vite
Bien sûr, je me suis juste amusé un peu avec, donc les résultats peuvent varier
Quand on dit « 98 % de tokens en moins que
grep», on est censé croire quegrepgaspille à ce point et que le modèle lit à chaque fois 98 % de déchets inutiles ?J’ai l’impression que soit cette affirmation n’est pas représentative, soit on rate autre chose quand on jette la majeure partie du contexte destiné au modèle
grep, mais à toute la boucle grep+lectureQuand un agent arrive sur un codebase inconnu, il commence souvent par faire
cat fileou par lire le fichier entier. En tout cas, c’est mon expérienceSi tu arrives à faire en sorte qu’un agent s’arrête de façon fiable après un simple
grep -C N, je suis vraiment curieux de connaître ta configuration. À mon avis, la qualité du résultat est trop faible pour servir de contexte utilenode_modulesripgrepaide, donc ajouter une ligne dans un fichier mémoire pour lui dire de l’utiliser a du sensgrepaffiche toutes les lignes correspondantesQuand un LLM fait une recherche, il peut y avoir beaucoup de bruit, et il peut être obligé de faire ce type de recherche faute de pouvoir être plus précis
Une recherche orientée objectif peut réduire le nombre de tokens
Cela dit, cette comparaison ressemble à une comparaison entre recevoir uniquement les parties nécessaires et lire l’ensemble du codebase
Pour donner un retour, codex-cli se bloque quand il appelle ça via MCP
Le processus
semblereste aussi là comme un zombie et se bloque indéfiniment. Je ne sais pas pourquoi, et il n’y a rien non plus dans les logsQuand je l’appelle en mode invocation CLI via une skill, GPT 5.5 a tendance à lancer énormément de requêtes de recherche, comme s’il était très habitué à
ripgrepJe ne sais pas à quel point c’est efficace, et avec la courte documentation sur GitHub et les seules instructions d’agent, il n’est pas clair de savoir ce qui est optimal
Enfin, à l’installation pour bash, j’ai aussi eu plusieurs erreurs liées aux connexions externes à GitHub. Je ne sais pas si c’est lié au blocage
En plus, mon agent essaie ensuite aussi d’utiliser
ripgrep, ce qui semble redondant. Il se comporte comme s’il y avait un problème de confianceUne explication plus détaillée de la skill agent aiderait probablement à orienter l’agent vers le bon mode d’utilisation
Pour le bug, ce serait bien d’ouvrir une issue avec les détails de configuration. C’est clairement un point qu’on veut investiguer et corriger
Le problème des multiples requêtes est aussi un très bon retour, et on va essayer de mettre à jour les prompts et les instructions pour éviter que ça arrive, ainsi que d’ajouter des tests associés
Les erreurs de connexions externes pendant l’installation viennent sans doute de
uvqui récupère les dépendances depuis PyPI, et ne devraient pas être la cause du blocageÇa semble être une bonne idée
Pour évoquer un problème connexe : sur les petits codebases, Claude peut parfois simplement mettre tout le codebase dans le contexte d’un coup et le traiter avec très peu de tokens, et malgré ça il passe beaucoup de temps à chercher quelque chose
Une parade correcte consiste à injecter tout le répertoire dans le contexte via un hook de démarrage
Claude évite alors cette phase où il « tâtonne dans le noir » à chaque tâche
J’ai aussi vu un excellent projet qui donnait au modèle une vue d’ensemble avec des stubs sur les gros dépôts, mais j’ai oublié son nom
Cela dit, sur un petit codebase, ce qu’on cherche est aussi plus facile à trouver, donc la recherche peut encore aider à réduire les coûts
Le problème plus général de ces solutions, c’est que la plupart des IA savent déjà très bien utiliser
grepet la recherche grâce à leur entraînementSi on donne un nouvel outil à une IA, cet outil lui retire une partie de ses capacités cognitives
Les humains apprendraient sans doute à utiliser ce genre d’outil, mais l’apprentissage des LLM est figé, et ils ont déjà une maîtrise très profonde des outils existants comme
grepPar exemple, l’IA sait déjà explorer un codebase avec des commandes Linux comme
tree, et elle y a aussi été suffisamment entraînéeUn autre problème est qu’il est facile de créer des exemples montrant l’utilité de ce genre d’outil, mais beaucoup plus difficile de démontrer réellement que, sur des exécutions longues, l’utilité compense les déficits cognitifs provoqués par l’outil
Mon intuition première est que, sur des exécutions longues, l’intelligence déployable sera en perte nette, et que l’agent fera moins bien qu’avec les outils existants
Prouver le contraire n’est pas un problème trivial, mais c’est peut-être un défi qui vaut la peine d’être relevé