Recherche vectorielle

Le moteur de recherche sémantique qui comprend le sens, pas seulement les mots

01

📖 Qu'est-ce que la recherche vectorielle ?

La recherche vectorielle (ou recherche sémantique) est une technique qui permet de trouver des documents par similarité de sens, et non par correspondance exacte de mots-clés. Elle repose sur les embeddings : des représentations vectorielles qui capturent la sémantique du texte.

💡 À retenir : Contrairement à la recherche par mots-clés, la recherche vectorielle trouve des résultats pertinents même si les mots exacts ne sont pas présents.
📊 Pipeline de recherche vectorielle :

[Document] → [Modèle d'embedding] → [Vecteur] → [Index FAISS]
[Question] → [Modèle d'embedding] → [Vecteur] → [Recherche] → [Résultats]
📝 Exemple :
Requête classique : "discours sur la liberté" → trouve les documents contenant "liberté"
Requête vectorielle : "discours sur la liberté" → trouve l'Appel du 18 juin (même sans le mot "liberté")
02

🧠 Principe de la recherche vectorielle

Étape 1 : Indexation

Chaque document est converti en vecteur (embedding) et stocké dans un index spécialisé.

# Indexation des discours
for discours in discours_list:
    embedding = model.encode(discours.texte)
    index.add(embedding)
    metadata.append({
        "id": discours.id,
        "title": discours.titre,
        "speaker": discours.orateur
    })

Étape 2 : Requête

La question de l'utilisateur est convertie en vecteur.

# Conversion de la requête
requete = "discours sur la liberté"
requete_embedding = model.encode(requete)

Étape 3 : Recherche

On trouve les k vecteurs les plus similaires dans l'index.

# Recherche des plus proches voisins
scores, indices = index.search(requete_embedding, k=5)

# Récupération des métadonnées
for score, idx in zip(scores[0], indices[0]):
    print(f"{metadata[idx]['title']} (score: {score:.3f})")
03

🏢 Solutions du marché

SolutionTypeLangageParticularité
FAISS (Meta) Bibliothèque open source Python/C++ Ultra-rapide, benchmarks records, GPU support
Pinecone Cloud managé API REST Simple d'usage, scalable, zero-maintenance
Qdrant Open Source / Cloud Rust Performant, filtres avancés, SDK multi-langages
Milvus Open Source C++/Python Complet, écosystème riche, cloud disponible
Chroma Open Source Python Simple, intégration native avec LangChain
💡 Notre recommandation :
  • Prototypage / petit volume : Chroma (simple, Python)
  • Production (performance) : FAISS (bibliothèque) ou Qdrant (serveur)
  • Cloud managé (zéro ops) : Pinecone
04

🚀 FAISS en détail

FAISS (Facebook AI Similarity Search) est la bibliothèque de référence pour la recherche vectorielle, développée par Meta. Elle est utilisée par des milliers d'entreprises et de projets open source.

Installation

pip install faiss-cpu      # Version CPU
pip install faiss-gpu      # Version GPU (si CUDA disponible)

Types d'index FAISS

IndexFlatIP

Type : Exact (brute force)

Performance : Lente sur grands volumes

Précision : 100% 🏆

Usage : Petits volumes, validation

IndexIVFFlat

Type : Approximatif (clustering)

Performance : Rapide

Précision : 90-95%

Usage : Grands volumes, recherche

IndexHNSW

Type : Approximatif (graphe)

Performance : Très rapide 🏆

Précision : 95-99%

Usage : Production, haute performance

Exemple avec notre projet

import faiss
import numpy as np

# Index HNSW pour nos 100 discours
dimension = 384
index = faiss.IndexHNSWFlat(dimension, 32)

# Ajouter les embeddings des discours
index.add(discours_embeddings)

# Rechercher "discours sur la liberté"
requete_embedding = model.encode(["discours sur la liberté"])
scores, indices = index.search(requete_embedding, k=3)

# Résultats en <10ms
for score, idx in zip(scores[0], indices[0]):
    print(f"{discours[idx]['titre']} (score: {score:.3f})")
05

⚡ Indexation et performance

Facteurs de performance

FacteurImpact
Nombre de vecteurs Plus il y a de vecteurs, plus la recherche est lente (sans index)
Dimension des vecteurs 384-1536 dimensions. Plus c'est élevé, plus c'est lent
Type d'index Flat (exact) vs IVF/HNSW (approximatif)
Mémoire GPU/CPU Le GPU peut accélérer 10-100x

Benchmarks (100k vecteurs, dimension 384)

IndexTemps de recherchePrécision@10
Flat (brute force) 50 ms 100%
IVF (256 clusters) 5 ms 95%
HNSW (M=32) 2 ms 98%
💡 Bonne pratique : Pour des volumes < 10k vecteurs, utilisez IndexFlat (100% précis). Pour des millions de vecteurs, passez à HNSW.
06

🔗 Recherche hybride (vectorielle + keywords)

La recherche purement vectorielle peut manquer des correspondances exactes importantes. La recherche hybride combine les deux approches.

def hybrid_search(query, vector_weight=0.7, keyword_weight=0.3):
    # Recherche vectorielle
    vector_results = vector_search(query, k=20)
    
    # Recherche par mots-clés (BM25 / Elasticsearch)
    keyword_results = keyword_search(query, k=20)
    
    # Fusion avec RRF (Reciprocal Rank Fusion)
    final_results = reciprocal_rank_fusion(
        vector_results, 
        keyword_results,
        weights=[vector_weight, keyword_weight]
    )
    
    return final_results[:10]
📊 Avantages de l'approche hybride :
  • ✅ Trouve les documents par similarité sémantique (vecteurs)
  • ✅ Trouve les termes exacts (mots-clés)
  • ✅ Meilleure précision globale que chaque approche seule
07

🎯 Cas d'usage de la recherche vectorielle

1. Moteur de recherche sémantique

Recherche documentaire d'entreprise, FAQ, base de connaissances.

2. RAG (Retrieval-Augmented Generation)

Récupérer les documents pertinents pour alimenter un LLM.

3. Détection de similarité / plagiat

Comparer des documents pour trouver des passages similaires.

4. Recommandation

"Les utilisateurs qui ont aimé ce discours ont aussi aimé..."

5. Clustering de documents

Grouper des documents par thèmes (classification non supervisée).

🚀 Chez Le Monde Sémantique

Nous utilisons FAISS avec des embeddings Sentence-BERT pour la recherche vectorielle sur nos 100+ discours. Latence < 10ms pour une recherche sur l'ensemble du corpus.

🎯 Tester notre démo interactive →