Déploiement et utilisation du modèle nomic-embed-text-v2-moe pour la recherche multilingue

Présentation technique et avantages clés

Architectrue du modèle

nomic-embed-text-v2-moe est un modèle d'incorporation textuelle multilingue utilisant une architecture Mixture of Experts (MoE). Il traite environ 100 langues avec un dimensionnement d'embedding adaptatif, permettant de réduire l'espace de stockage sans compromettre significativement les performances.

Performances comparatives

Avec 305 millions de paramètres et des embeddings de dimension 768, le modèle atteint 52.86 sur BEIR et 65.80 sur MIRACL. Il surpsase des alternatives comme mE5 Base (48.88) et mGTE Base (51.10), tout en restant plus compact que BGE M3 (568M paramètres).

Configuration initiale

Prérequis système

Système Linux/macOS avec 8GB RAM minimum, 20GB d'espace disque. Installation des dépendances :

pip install ollama gradio numpy sentence-transformers
ollama pull nomic-embed-text-v2-moe

Vérification d'installation

import ollama
vecteur = ollama.embeddings(model='nomic-embed-text-v2-moe', prompt='Test')
print(f"Dimensions : {len(vecteur['embedding'])}")

Génération d'embeddings

def generer_vecteur(texte):
    reponse = ollama.embeddings(model='nomic-embed-text-v2-moe', prompt=texte)
    return reponse['embedding']

phrases = ["Hello world", "Bonjour le monde", "こんにちは世界"]
vecteurs = [generer_vecteur(p) for p in phrases]

Calcul de similarité sémantique

from sklearn.metrics.pairwise import cosine_similarity

def similarite_texte(texte1, texte2):
    v1 = np.array(generer_vecteur(texte1)).reshape(1, -1)
    v2 = np.array(generer_vecteur(texte2)).reshape(1, -1)
    return cosine_similarity(v1, v2)[0][0]

resultat = similarite_texte("apprentissage automatique", "réseaux neuronaux")
print(f"Similarité : {resultat:.4f}")

Moteur de recherche sémantique

class IndexeurDocuments:
    def __init__(self):
        self.contenus = []
        self.vecteurs = []
    
    def ajouter(self, texte):
        self.contenus.append(texte)
        self.vecteurs.append(generer_vecteur(texte))
    
    def rechercher(self, requete, n=3):
        v_req = np.array(generer_vecteur(requete)).reshape(1, -1)
        sims = cosine_similarity(v_req, np.array(self.vecteurs))[0]
        indices = np.argsort(sims)[-n:][::-1]
        return [(self.contenus[i], sims[i]) for i in indices]

Interfcae Web avec Gradio

import gradio as gr

def recherche_interface(requete, n_resultats):
    index = IndexeurDocuments()
    index.ajouter("Les modèles de deep learning")
    index.ajouter("L'analyse de données statistiques")
    return index.rechercher(requete, n_resultats)

gr.Interface(
    fn=recherche_interface,
    inputs=[gr.Textbox(), gr.Slider(1, 5)],
    outputs=gr.Textbox()
).launch()

Optimisations pour production

from functools import lru_cache

class MoteurOptimise:
    def __init__(self):
        self.vecteurs_docs = {}
    
    @lru_cache(maxsize=1000)
    def vecteur_cache(self, texte):
        return generer_vecteur(texte)
    
    def recherche_rapide(self, requete, n=5):
        v_req = np.array(self.vecteur_cache(requete)).reshape(1, -1)
        v_docs = np.array(list(self.vecteurs_docs.values()))
        sims = cosine_similarity(v_req, v_docs)[0]
        return np.argsort(sims)[-n:][::-1]

Étiquettes: nomic-embed-text MoE recherche multilingue embeddings Ollama

Publié le 2 juillet à 17h36