Aller au contenu

Recherche dans l'historique

Au fil des mois, le workspace accumule des centaines de fichiers : séances, bilans santé, décisions, rapports, articles de resources/, conversations avec le coach. Pour le travail du jour, les agents n'ont besoin de rien de plus que la date (medical/2026-10-28_health.md). Mais pour une question sur le passé (« pourquoi la séance de seuil avait-elle été annulée ? », « qu'avais-je dit de mes ampoules ? »), il leur faut retrouver le bon passage sans relire tout l'historique.

C'est le rôle de la commande search de l'index :

python3 scripts/arc_index.py search "douleur genou" --text
3 résultat(s) pour « douleur genou »

## planning/2026-03-02_decision_genou-repos.md — Décision (2026-03-02 · decision)
- **Déclencheur :** médical. Douleur au genou droit à **4/10** après la sortie longue …

Ce qui est cherché

Source (--source) Contenu Type (--kind)
workspace activities/, medical/, nutrition/, planning/, rapports/, gear/ le type du contrat (activity, health, decision, report, week…), other pour un fichier hors contrat
resources votre base de connaissances resources/ resource
chat les conversations du chat (.arc/chat/sessions/) : votre message et la réponse écrite du coach chat

Les fichiers sont découpés en passages (une section Markdown, coupée aux paragraphes au-delà de 1 200 caractères). La commande rend le meilleur passage de chaque fichier, classé par pertinence, avec un extrait : l'agent n'ouvre le fichier que si l'extrait ne suffit pas.

Options

Option Effet
--kind activity,health ne garde que ces types
--source workspace ne cherche que dans une source
--since 2026-09-01 / --until 2026-10-31 date du fichier (nom AAAA-MM-JJ_…) ou de l'échange ; un passage sans date (un article de resources/) est alors exclu
--limit N nombre de fichiers rendus (8 par défaut, 30 au plus)
--text rendu lisible ; JSON par défaut, comme les autres commandes

La question s'écrit en mots-clés plutôt qu'en phrase : les mots vides (« le », « pourquoi », « the »…) sont ignorés, les accents aussi, et un mot long est cherché par son début (tendinite trouve tendinites). Une expression entre guillemets reste exacte ("côtes courtes"). Le chat refuse ? et ! dans une commande : les agents ne les écrivent pas.

Ce que la recherche ne fait pas

  • Elle ne remplace pas les analyses. « Depuis quand ai-je mal au genou ? » se lit dans les douleurs déclarées (prevention, tableau de bord), pas dans un extrait. Une date ou une valeur citée par un agent vient d'une commande d'analyse, jamais d'un extrait seul.
  • Elle ne comprend pas les synonymes. Elle cherche des mots : « mal sous le pied le matin » ne trouve pas « aponévrosite ». Les agents traduisent eux-mêmes la question en mots du domaine, ce qu'ils font bien.
  • Rien ne quitte la machine. L'index est dans .arc/coach.db (jamais versionné), reconstruit depuis les fichiers ; aucun service ni modèle externe n'est appelé.

Pourquoi un index plein texte (et pas des embeddings ni un graphe)

Le choix a été mesuré sur un vrai workspace (≈ 920 documents, ≈ 0,9 million de jetons, 31 questions avec leur fichier attendu) sur un mini-PC Intel N100 :

Méthode Bon fichier en tête Dans les 5 premiers Texte rendu à l'agent
grep sur le mot-clé qu'un agent choisirait 39 % 71 % ≈ 24 000 jetons (fichiers entiers)
Recherche plein texte (search) 58 % 77 % ≈ 1 000 à 2 000 jetons
Embeddings multilingues légers seuls 35 % 55 % ≈ 1 000 jetons
Hybride plein texte + embeddings 58 % 77 % ≈ 1 000 jetons
  • La recherche plein texte trouve au moins aussi bien que grep et rend environ 25 fois moins de texte à lire.
  • Les embeddings n'aidaient que sur les questions reformulées, coûtaient 7 minutes de calcul sur ce matériel, une dépendance hors bibliothèque standard et un modèle de 200 Mo à 2 Go (le plus gros a épuisé la mémoire du serveur de test). Ils pourront être ajoutés en option si des questions réelles montrent qu'il en manque.
  • Un graphe de connaissances ferait double emploi : les relations utiles (séance ↔ chaussure, décision ↔ séance, santé ↔ douleur) sont déjà dans les tables de l'index, interrogées par les commandes d'analyse.