Les API d'embeddings dans le cloud sont pratiques mais présentent trois problèmes fondamentaux : la latence (100-300 ms par appel), le coût (s'accumule avec le volume) et la confidentialité (vos données sont envoyées à un tiers). Pour les applications qui génèrent des milliers d'embeddings quotidiennement, ou qui manipulent des données sensibles, ou qui ont besoin d'une latence de recherche inférieure à 50 ms, les API cloud sont un goulot d'étranglement.
FastEmbed résout ces trois problèmes. C'est une bibliothèque open source qui exécute des modèles d'embeddings localement, sur la même machine que le runtime FLIN. Pas d'appel réseau. Pas de clé API. Pas de données quittant le serveur. Un embedding de 384 dimensions se génère en 10-50 millisecondes selon la longueur du texte et le matériel.
FLIN intègre FastEmbed comme fournisseur d'embeddings local par défaut, en faisant le choix recommandé pour les applications de production nécessitant une recherche sémantique rapide et privée.
Ce qu'est FastEmbed
FastEmbed est une bibliothèque d'inférence d'embeddings optimisée pour l'utilisation en production. Elle exécute des modèles ONNX quantifiés qui produisent des embeddings de haute qualité pour une fraction du coût en ressources des modèles en pleine précision.
Caractéristiques clés : - Taille du modèle : 30-100 Mo (vs 500 Mo+ en pleine précision) - Temps d'inférence : 10-50 ms par embedding - Utilisation mémoire : 100-300 Mo au runtime - Précision : >95% de la qualité du modèle en pleine précision - Dépendances : ONNX Runtime uniquement
Les modèles sont téléchargés une fois et mis en cache localement. Après la première exécution, il n'y a aucune dépendance réseau.
Configuration
Activer FastEmbed dans FLIN :
flin// flin.config
ai {
embedding {
provider = "fastembed"
model = "BAAI/bge-small-en-v1.5" // 384 dimensions, 33 Mo
}
}Modèles disponibles :
| Modèle | Dimensions | Taille | Qualité | Vitesse |
|---|---|---|---|---|
BAAI/bge-small-en-v1.5 | 384 | 33 Mo | Bonne | Rapide |
BAAI/bge-base-en-v1.5 | 768 | 110 Mo | Meilleure | Moyenne |
BAAI/bge-large-en-v1.5 | 1024 | 335 Mo | Optimale | Plus lente |
sentence-transformers/all-MiniLM-L6-v2 | 384 | 23 Mo | Bonne | La plus rapide |
Pour la plupart des applications, bge-small-en-v1.5 offre le meilleur équilibre entre qualité et vitesse.
Intégration avec semantic text
Lorsque FastEmbed est configuré, les champs semantic text l'utilisent automatiquement :
flinentity Product {
name: text
description: semantic text // Utilise FastEmbed pour l'embedding
}
product = Product {
name: "Ergonomic Office Chair",
description: "Adjustable lumbar support with breathable mesh back..."
}
save product // Embedding généré localement via FastEmbedLe passage des embeddings cloud à FastEmbed est transparent. L'opération save appelle FastEmbed au lieu d'une API. Le mot-clé search utilise le même index HNSW. Le code du développeur ne change pas.
Implémentation
L'intégration FastEmbed dans le runtime FLIN :
rustuse fastembed::{TextEmbedding, InitOptions, EmbeddingModel};
pub struct FastEmbedProvider {
model: TextEmbedding,
model_name: String,
}
impl FastEmbedProvider {
pub fn new(model_name: &str) -> Result<Self, EmbeddingError> {
let model = TextEmbedding::try_new(InitOptions {
model_name: parse_model(model_name),
show_download_progress: true,
cache_dir: Some(PathBuf::from(".flindb/models/")),
..Default::default()
})?;
Ok(Self {
model,
model_name: model_name.to_string(),
})
}
pub fn embed(&self, text: &str) -> Result<Vec<f32>, EmbeddingError> {
let documents = vec![text.to_string()];
let embeddings = self.model.embed(documents, None)?;
Ok(embeddings.into_iter().next().unwrap())
}
pub fn embed_batch(&self, texts: &[String]) -> Result<Vec<Vec<f32>>, EmbeddingError> {
self.model.embed(texts.to_vec(), None)
.map_err(EmbeddingError::FastEmbed)
}
}Benchmarks : FastEmbed vs API cloud
| Métrique | FastEmbed (local) | OpenAI API | Cohere API |
|---|---|---|---|
| Latence (unitaire) | 12 ms | 150 ms | 120 ms |
| Latence (lot de 100) | 180 ms | 800 ms | 600 ms |
| Coût par 1M embeddings | 0 $ (matériel uniquement) | 0,02-0,13 $ | 0,10 $ |
| Confidentialité | Totale (aucune donnée envoyée) | Données envoyées à OpenAI | Données envoyées à Cohere |
| Capable hors ligne | Oui | Non | Non |
| Précision (MTEB moy.) | 0,62 (small) | 0,63 (ada-002) | 0,64 (v3) |
FastEmbed égale la qualité des API cloud à 2-3 % près tout en étant 10 fois plus rapide et totalement privé.
Pourquoi les embeddings locaux comptent pour l'Afrique
Deux raisons pratiques rendent les embeddings locaux essentiels pour le marché cible de FLIN :
Fiabilité d'internet. De nombreux développeurs africains travaillent avec une connectivité intermittente. Un pipeline d'embeddings dépendant du cloud signifie que la recherche sémantique cesse de fonctionner quand internet tombe. FastEmbed fonctionne hors ligne.
Souveraineté des données. Les clients entreprise dans les industries réglementées (banque, santé, gouvernement) exigent que les données ne quittent pas leur infrastructure. Les embeddings locaux satisfont cette exigence sans sacrifier la fonctionnalité.
FastEmbed transforme la recherche sémantique d'une dépendance cloud en une capacité locale. Le modèle d'embedding fait autant partie du binaire FLIN que le serveur HTTP ou le moteur de base de données -- toujours disponible, toujours rapide, toujours privé.
Dans le prochain article, nous explorons le RAG (Retrieval-Augmented Generation) -- comment FLIN combine la recherche sémantique avec la génération LLM pour répondre aux questions à partir des données de votre application.
Ceci est la partie 119 de la série « Comment nous avons construit FLIN », documentant comment un CEO à Abidjan et un CTO IA ont conçu et construit un langage de programmation à partir de zéro.
Navigation de la série : - [118] Passerelle IA : 8 fournisseurs, une seule API - [119] Intégration FastEmbed pour les embeddings (vous êtes ici) - [120] RAG : récupération, reclassement et attribution des sources - [121] Analyse de documents : PDF, DOCX, CSV, JSON, YAML