Back to flin
flin

Intégration FastEmbed pour les embeddings

Comment FLIN intègre FastEmbed pour la génération locale d'embeddings -- pas d'appels API, pas de latence réseau, pas de données quittant le serveur. Recherche sémantique privacy-first à 10 ms par embedding.

Juste A. Gnimavo (Thales) & Claude | March 26, 2026 5 min flin
EN/ FR/ ES
flinfastembedembeddingslocalai

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èleDimensionsTailleQualitéVitesse
BAAI/bge-small-en-v1.538433 MoBonneRapide
BAAI/bge-base-en-v1.5768110 MoMeilleureMoyenne
BAAI/bge-large-en-v1.51024335 MoOptimalePlus lente
sentence-transformers/all-MiniLM-L6-v238423 MoBonneLa 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 FastEmbed

Le 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étriqueFastEmbed (local)OpenAI APICohere API
Latence (unitaire)12 ms150 ms120 ms
Latence (lot de 100)180 ms800 ms600 ms
Coût par 1M embeddings0 $ (matériel uniquement)0,02-0,13 $0,10 $
ConfidentialitéTotale (aucune donnée envoyée)Données envoyées à OpenAIDonnées envoyées à Cohere
Capable hors ligneOuiNonNon
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

Share this article:

Responses

Write a response
0/2000
Loading responses...

Related Articles

Thales & Claude zerosuite

Ça marche, et ce n'est pas fini

Le dirigeant a parcouru lui-même tous les canaux de senndo — cinq canaux, à l'unité et en campagne, l'import, les statistiques, un remboursement, l'API — et tout a répondu. Le fichier de pilotage disait toujours non, et la seule ligne qui bloquait n'était pas du code : c'était un document qui avait discrètement cessé d'être vrai. Quatre affirmations vraies à l'écriture et fausses à la lecture, et les gardes lisibles par une machine qui attrapent désormais chacune de ces formes.

13 min Sep 14, 2026
senndocpaaslaunch-readinessdocumentation +8
Thales & Claude zerosuite

Le navigateur entre les mains de Claude : piloter le Chrome du dirigeant

Claude-in-Chrome permet à une session Claude Code de piloter le vrai navigateur du dirigeant — même profil, mêmes sessions ouvertes. Ce que l'outil fait réellement, pourquoi il vaut mieux que de demander à un humain de cliquer et de rapporter, et où l'humain garde l'avantage. Ancré dans le jour où Claude a conduit un parcours client complet dans la console de production de senndo, messages facturés compris.

9 min Aug 18, 2026
claude-in-chromebrowser-automationclaude-codeclaude-fable-5 +9
Thales & Claude deblo

Le segfault qui n'était pas le nôtre : livrer le tracking du jour de lancement de Déblo la nuit du lancement — analytics conditionnées par l'environnement, attribution native des stores, trois bugs que le compilateur ne pouvait pas voir, et un build à court de mémoire que nous avons diagnostiqué au lieu de le rétablir

Le 1er juillet 2026 — jour de lancement — le risque n'a jamais été le texte. C'était les campagnes payantes qui partaient à l'aveugle. Voici le build-log de la livraison des analytics et de l'attribution d'installation de Déblo sous forme de code, la nuit du lancement : des tags GA4, Meta et LinkedIn conditionnés par l'environnement, qui se déploient sans risque avant même que les comptes publicitaires existent ; une attribution routée par les canaux natifs des stores plutôt que par le pixel web ; un audit adverse qui a attrapé trois bugs que le typecheck et le build passaient tous les deux ; et un déploiement Easypanel qui a segfaulté au premier build — que nous avons prouvé ne pas venir de notre code avant d'en changer une seule ligne.

18 min Jul 1, 2026
deblolaunch-dayclaude-opus-4.8claude-code +26