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 thales

Treize agents, quarante-trois minutes : la première session Workflow de Claude Fable 5, et ce qu'un script d'orchestration déterministe change aux builds multi-agents

Un prompt, treize agents, quarante-trois minutes : la première session de production avec Claude Fable 5 et l'outil Workflow de Claude Code a livré un site web de production complet de sept pages plus un endpoint backend de capture de leads, en un seul commit. Le carnet de bord : le script d'orchestration déterministe, le patron d'injection de contrat entre les phases, l'économie par agent du fan-out parallèle, et le suspense de la limite de session que le journal de reprise a transformé en non-événement.

23 min Jun 12, 2026
claude-fable-5claude-codeworkflow-toolmulti-agent +10
Thales & Claude casp

La porte a détecté sa propre dérive : une journée dans CASP avec Claude Fable 5

Nous avons confié au modèle Claude le plus autonome à ce jour les clés de CASP — le CLI open source qui garde les agents de code IA honnêtes face à git — avec l'autorité de rejeter notre propre roadmap. Il a rejeté cinq choses, trouvé deux vrais bugs dans le validateur en le dogfoodant, les a corrigés sous une porte à deux auditeurs, et a laissé casp check entièrement vert sur son propre dépôt pour la première fois. CASP 0.3.0 en est le résultat.

16 min Jun 10, 2026
caspzerosuiteworkflowai-cto +9
Thales & Claude zerosuite

La transplantation du CASP : comment la discipline des six fichiers est passée de Conductor à un ERP transport anti-fraude, ce que la compétence /next ajoute quand l'opérateur tape juste « next », et pourquoi le coût d'une dérive du CASP grimpe quand le projet, c'est l'argent des autres

La discipline du CASP qui a piloté trente-cinq sessions de Conductor est agnostique au produit. Le carnet de bord de sa transplantation sur KASSIA, un ERP transport anti-fraude pour un exploitant de flotte en Côte d'Ivoire : ce qui a migré, ce qui n'a pas migré (le validateur sur mesure — et ce que son absence coûte), ce que la compétence /next ajoute quand l'opérateur tape un seul mot, et là où le CASP s'arrête — le bug de déploiement qu'il ne pouvait pas voir parce qu'il enregistre l'intention, pas la réalité de l'infrastructure.

23 min Jun 8, 2026
kassiaerp-kassia-transport-logistiquezerosuiteCASP +15