Bi-Encoder (Dense Retriever)
iaDéfinition
Un Bi-Encoder (ou dense retriever) est un modele qui encode independamment la requete et les documents en vecteurs de haut dimension (embeddings), puis calcule la pertinence par similarite cosinus ou produit scalaire entre ces vecteurs. Contrairement aux Cross-Encoders, les embeddings des documents peuvent etre pre-calcules et indexes, permettant un retrieval ultra-rapide via des algorithmes ANN (Approximate Nearest Neighbor). L'architecture type : deux encodeurs partageant les memes poids (ou des encodeurs distincts pour requetes vs documents) basés sur BERT/RoBERTa/E5. Chaque encodeur produit un vecteur de 768, 1024 ou 3072 dimensions. DPR (Dense Passage Retrieval, Facebook 2020) est le modele fondateur, entraine avec des paires question-passage positives et negatives. Les Bi-Encoders modernes : E5-large-v2 (Microsoft, 768d, top performer multilingual), BAAI/bge-m3 (1024d, 100+ langues, supporte sparse+dense+colbert), Nomic-embed-text-v1.5 (768d, 8K contexte, tres performant), mxbai-embed-large-v1. Ces modeles sont fine-tunes sur de larges datasets de retrieval (MSMARCO, Natural Questions, BEIR). L'indexation et le retrieval ANN : les embeddings de documents sont indexes dans des bibliotheques comme FAISS (Facebook, exact ou approximatif), Annoy (Spotify), HNSW (hierarchical navigable small world graph). Ces index permettent de rechercher les K plus proches voisins dans des corpus de millions de documents en quelques millisecondes. Le tradeoff Bi-Encoder vs Cross-Encoder : le Bi-Encoder est 100-1000x plus rapide (pre-indexage possible, ANN en O(log N)) mais moins precis que le Cross-Encoder (pas d'attention croisee entre requete et document). Le pipeline optimal est leur combinaison : Bi-Encoder pour le recall initial (Top-100), Cross-Encoder pour la precision finale (Top-5).
Bi-Encoder avec sentence-transformers
from sentence_transformers import SentenceTransformer
import faiss, numpy as np
# Charger le modele bi-encoder
model = SentenceTransformer('BAAI/bge-m3')
# Indexer les documents
docs = ['La cybersecurite...', 'Les LLMs...', ...]
doc_embeddings = model.encode(docs, normalize_embeddings=True, batch_size=32)
# Creer l'index FAISS (HNSW pour L'ANN)
index = faiss.IndexHNSWFlat(768, 32) # 768d, 32 links/node
index.add(doc_embeddings.astype(np.float32))
# Retrieval
query = 'Quels sont les risques des LLMs ?'
query_embed = model.encode([query], normalize_embeddings=True)
distances, indices = index.search(query_embed, k=10) # Top-10 en <1ms
Articles liés
Expert en cybersécurité offensive et intelligence artificielle. Pentest, audit et développement IA sur-mesure.
Services
- Audit Infrastructure
- Audit Kubernetes
- Audit Microsoft 365
- Audit Sécurité Réseau
- Analyse de Risques
- Audit Active Directory
- Audit Application Web
- Audit Cloud (AWS/Azure/GCP)
- Audit Messagerie
- Audit API (OWASP Top 10)
- Audit DevSecOps & CI/CD
- Audit Code Source (SAST)
- Audit Postes de Travail
- Audit Sauvegarde & Résilience
- Audit OT/SCADA (IEC 62443)
- Développement IA
- Formations
Ressources
Projets & Outils
© 2026 Ayi NEDJIMI Consultants. Tous droits réservés.
Un projet cybersécurité ?
Expert dispo · Réponse 24h