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]