37 points par GN⁺ 2026-01-16 | Aucun commentaire pour le moment. | Partager sur WhatsApp
  • Sur Hacker News, un utilisateur demande comment les autres implémentent le Retrieval-Augmented Generation (RAG) dans un environnement local
  • Une tendance forte se dégage : en RAG local, il est souvent possible de très bien s’en sortir sans base de données vectorielle, avec de la recherche textuelle comme SQLite FTS5, BM25 ou grep
  • Pour la recherche dans le code, beaucoup rapportent que les embeddings sont lents et bruités, et plusieurs estiment qu’une approche à base de mots-clés comme BM25 + trigrammes fonctionne mieux
  • Même lorsqu’une recherche vectorielle est nécessaire, de nombreux exemples montrent qu’on peut s’en sortir avec une configuration légère comme Postgres + pgvector, le stockage de vecteurs en BLOB dans SQLite, ou un chargement FAISS en mémoire
  • Il est possible d’améliorer la qualité de recherche avec des combinaisons comme la recherche hybride BM25 + vecteurs, le RRF (Reciprocal Rank Fusion), le reranking ou l’expansion multi-requêtes
  • Plutôt que de figer le principe « RAG = base de données vectorielle », on voit se dessiner une tendance consistant à choisir entre recherche simple → hybride → agentique selon le type de documents, l’échelle et la charge opérationnelle

Conclusion commune sur l’étape de recherche

  • Au lieu de partir du principe qu’une base vectorielle ou un graphe est indispensable, beaucoup privilégient une approche consistant à commencer simplement selon l’infrastructure existante, les types de fichiers et les performances requises
  • Certains mentionnent qu’une approche où un agent interroge directement le système de fichiers ou des API est plus simple à configurer et à maintenir, mais peut être un peu plus lente
  • L’idée que « ce que le RAG transmet au LLM, ce sont de courts fragments textuels issus de la recherche » amène à recentrer les efforts d’optimisation sur la qualité de la recherche
  • À propos de la « définition du RAG », certains répondent que retrieval + generation suffit à parler de RAG, même sans base vectorielle, tandis que d’autres estiment que le terme suppose souvent ce type d’outil

Modèles d’embedding et recherche vectorielle

  • Le modèle d’embedding mdbr-leaf-ir, développé chez MongoDB, fonctionne uniquement sur CPU et s’est classé 1er sur plusieurs leaderboards dans cette catégorie de taille
    • Sur un serveur standard à 2 vCPU, il peut traiter environ 22 documents par seconde et 120 requêtes par seconde
    • Il obtient 53,55 sur le benchmark BEIR (contre 42,69 pour all-MiniLM-L12-v2)
  • Des embeddings statiques de mots comme model2vec/minish sont plus rapides en inférence, mais moins précis pour la recherche
    • Ils se limitent à la tokenisation + table de correspondance + moyenne, donc restent plus rapides que les approches basées sur des transformers
  • Une autre approche consiste à générer des vecteurs par chunk de texte avec Meta-Llama-3-8B, à les stocker dans une colonne BLOB SQLite, puis à effectuer la recherche avec FAISS
    • À l’échelle de 5 millions de chunks, cela consomme environ 40 Go de mémoire
    • Sur une A6000, faiss-gpu est très rapide, et sur un M1 Ultra, faiss-cpu est plus lent mais reste suffisant pour quelques requêtes par jour

Recommandations pour la recherche dans le code

  • Pour le code, il est recommandé d’éviter les bases de données vectorielles et de privilégier une combinaison BM25 + trigrammes
    • Les embeddings sont lents et peu adaptés au code
    • Sans reranker, le bruit est important, et la réindexation des fichiers est coûteuse
    • La vitesse de réponse est élevée et la qualité des résultats est jugée excellente
  • Dans PostgreSQL, il est possible d’implémenter une recherche BM25 avec plpgsql_bm25
    • Le support de la recherche hybride avec pgvector + Reciprocal Rank Fusion est également mentionné
  • Appliquer des embeddings au chemin de fichier + à la signature, puis fusionner cela avec BM25, peut donner de bons résultats
  • Une approche agentique consistant à exécuter gpt-oss 20B avec ripgrep dans une boucle while est aussi décrite comme efficace

Solutions basées sur des bases de données

  • SQLite FTS5 : bien adapté aux documents basés sur des fichiers Markdown, et permet de mettre en place un RAG même sans base de données vectorielle
    • On peut ajouter à chaque fichier un court champ descriptif pour naviguer dans les documents via la recherche par mots-clés
    • Il est aussi possible de stocker des vecteurs fp16 dans SQLite sous forme de BLOB, de créer un sous-ensemble via des filtres, puis de calculer la similarité en mémoire
    • Parmi les autres options citées : sqlite-vec, sqlite-vector, vec0 et le bm25 de SQLite
    • « SQLite fonctionne étonnamment bien »
  • PostgreSQL + pgvector : permet de réutiliser les compétences Postgres déjà en place et facilite la transmission à l’équipe d’exploitation
    • La bibliothèque llmemory prend aussi en charge le BM25 hybride, l’expansion multi-requêtes et le reranking
  • LanceDB : une base vectorielle embarquée pratique à utiliser
    • Utilisée avec les embeddings nomic-embed-text d’Ollama
  • DuckDB : propose une extension de recherche par similarité vectorielle, adaptée aux petits projets de moins de 3 Go
  • Meilisearch, Typesense, Manticore : plus simples à exploiter qu’Elasticsearch/OpenSearch

Recherche hybride et agentique

  • nori (usenori.ai) : combine recherche sémantique et recherche lexicale avec SQLite + vec0 + fts5
  • Turbopuffer : prend en charge la recherche hybride vecteurs + BM25
  • La simple combinaison de recherche agentique et de recherche textuelle peut déjà donner de très bons résultats
    • Ajouter une recherche vectorielle et un graph RAG peut apporter un léger gain de vitesse et de qualité
  • Claude Code / Codex utilisent ripgrep en interne
  • Appliquer des embeddings aux chemins de fichiers peut aussi être efficace, et la fusion avec BM25 améliore encore les résultats

Cas d’usage de BM25

  • shebe : outil CLI/MCP d’indexation et de recherche de code basé sur BM25
    • Particulièrement utile dans les workflows de refactoring (par ex. lister les emplacements à modifier lors d’une mise à niveau d’Istio)
  • Dans 85 % des cas, une simple correspondance par tags suffit sans base de données vectorielle
    • Des opérateurs ont ajouté des tags à la fois aux entrées et aux documents pour atteindre un taux de correspondance de 100 %
  • Certains considèrent que la plupart des bases vectorielles sont « un marteau pour résoudre un problème de non-trouvabilité »

Outils et bibliothèques spécifiques

  • qmd : outil CLI de recherche dans des fichiers Markdown, avec de meilleurs résultats en requêtes floues que fzf
  • ck : outil de grep sémantique écrit en Rust
  • Kiln : permet d’ajouter des fichiers en glisser-déposer et de comparer plusieurs configurations
    • Prend en charge la comparaison des méthodes d’extraction, des modèles d’embedding et des modes de recherche (BM25, hybride, vectoriel)
    • Inclut l’évaluation de la précision de recherche et la génération automatique de jeux de données d’évaluation
  • libragen : serveur CLI/MCP servant à créer une bibliothèque de contenus RAG versionnée
    • Peut transformer un dépôt GitHub en base de données RAG
  • piragi : bibliothèque Python de RAG simple, prenant en charge diverses sources comme le local, S3 ou des API
  • ragtune : outil CLI pour le débogage et le benchmarking de la recherche dans un RAG local

Traitement documentaire et OCR

  • discovery : effectue l’OCR de documents avec Qwen-3-VL-8B et stocke les vecteurs dans ChromaDB
    • Met en œuvre un RAG hybride BM25 + embeddings
  • docling : outil d’extraction de documents utilisé dans plusieurs projets RAG
  • Lors de la conversion de PDF, le traitement des tableaux, des mises en page multi-colonnes et des tableaux s’étendant sur plusieurs pages reste difficile
    • Le modèle Mistral OCR donne les meilleurs résultats (modèle non public)

Mémoire et gestion du contexte

  • Ce que le RAG transmet au LLM, ce sont uniquement de courtes chaînes de résultats de recherche
    • Sur les petits modèles, une valeur de TOP_K autour de 5 semble être une limite, au-delà de laquelle on observe un oubli du contexte
  • On peut améliorer cela en pré-résumant les fichiers et dossiers
  • Certains utilisent aussi une approche consistant à tout mettre dans le contexte avec Sonnet + une fenêtre de contexte de 1M
  • Un exemple mentionne la construction d’un système de mémoire pour Claude Code via recherche sémantique sur des fichiers de session

Usage en entreprise et à grande échelle

  • Lorsqu’on traite 300 000 interactions clients par jour, la latence et la précision sont des facteurs critiques
    • Une approche hybride embeddings + recherche plein texte + IVF-HNSW est utilisée
    • La gestion de la diffusion de l’information à travers environ 600 systèmes distribués constitue un défi
  • Une approche KAG (Knowledge Augmented Generation) est testée pour cartographier des règles métier
  • Un RAG entièrement local a aussi été mis en place avec succès sur plus de 500 000 articles de presse via une base vectorielle Postgres

Autres outils et approches

  • AnythingLLM : inclut un bundle de base vectorielle pour les documents
  • LibreChat : inclut également une base vectorielle packagée pour les documents
  • ChromaDB : utilisé via une extension Obsidian pour la recherche sémantique/hybride
  • SurrealDB : utilisé en combinaison avec une vectorisation locale
  • Interface de requêtes OData : efficace lorsqu’elle est fournie comme outil au LLM, y compris pour analyser un fichier Excel de 40 000 lignes
  • Nextcloud MCP Server : utilise Qdrant comme base vectorielle et fournit une recherche sémantique sur des documents personnels
  • LSP (Language Server Protocol) : ajouté à Claude Code, mais des bugs existent actuellement
    • TreeSitter peut être plus utile (recherche par nom de symbole, navigation entre définitions et usages)

Aucun commentaire pour le moment.

Aucun commentaire pour le moment.