Vous souhaitez utiliser le nouveau modèle Jina V5 dans OpenSearch ? Ce guide vous accompagne pas à pas — du téléchargement et de l’empaquetage des poids ONNX jusqu’à l’enregistrement du modèle sans erreurs.
Si vous suivez l’évolution du domaine du vector search, vous avez probablement entendu parler des nouveaux modèles de Jina AI : v5-small et v5-nano. Malgré leurs noms modestes, ces modèles sont à la pointe de la technologie pour le semantic search, le text matching et la retrieval-augmented generation, et selon les derniers benchmarks d’Elastic, ils surpassent même E5.
Elastic considère ces modèles comme tellement avancés qu’ils encouragent fortement leur utilisation dans leur propre écosystème — ce qui n’est pas surprenant, surtout maintenant que l’équipe Jina a rejoint Elastic.
Mais que faire si vous utilisez OpenSearch ?
Comme ces modèles sont disponibles librement sur Hugging Face, vous n’êtes pas obligé de rester dans l’écosystème Elasticsearch pour en profiter.
Dans ce guide, nous allons parcourir l’ensemble du processus afin de montrer comment exécuter Jina v5 embeddings nativement dans OpenSearch.
Pour exécuter Jina V5 dans OpenSearch, nous devons d’abord convertir le modèle au format ONNX.
Cependant, selon la page Hugging Face du modèle, Jina V5 fonctionne légèrement différemment des autres modèles. Au lieu d’un seul grand modèle polyvalent, Jina fournit plusieurs versions spécifiques à une tâche, où les adapters (les composants qui ajustent le modèle pour des tâches spécifiques) sont déjà fusionnés dans les weights.
Pour vector search, nous devons utiliser la version retrieval : jinaai/jina-embeddings-v5-text-small-retrieval.
Pour télécharger le modèle dans le bon format, nous pouvons utiliser la bibliothèque optimum.
from optimum.onnxruntime import ORTModelForFeatureExtraction
from transformers import AutoTokenizer
model_id = "jinaai/jina-embeddings-v5-text-small-retrieval"
save_dir = "jina_temp_onnx"
tokenizer = AutoTokenizer.from_pretrained(model_id, trust_remote_code=True)
model = ORTModelForFeatureExtraction.from_pretrained(
model_id,
subfolder="onnx",
file_name="model.onnx",
trust_remote_code=True,
)
tokenizer.save_pretrained(save_dir)
model.save_pretrained(save_dir)
Pour utiliser le modèle dans OpenSearch, vous devez regrouper les fichiers du modèle dans un zip avant de les uploader.
zip -r jina_temp_onnx.zip jina_temp_onnx
Le fichier zip doit contenir à la fois le tokenizer JSON et les poids du modèle.
Notez que les modèles modernes peuvent dépasser la limite de 2 GB pour un seul fichier ONNX.
Dans ce cas, les poids sont stockés séparément dans un fichier appelé model.onnx_data.
Pour plus d’informations sur la gestion des grands modèles ONNX, consultez ce guide.
Enfin, il est nécessaire de calculer un SHA256 hash, que nous utiliserons lors de l’enregistrement du modèle. OpenSearch recalculera ce hash après avoir téléchargé le zip afin de vérifier que le fichier correspond exactement à celui que vous avez fourni.
shasum -a 256 jina-v5-small.zip
Pour enregistrer un modèle custom, OpenSearch doit pouvoir accéder au fichier ZIP via HTTP ou HTTPS.
Dans mon cas, comme je travaille en local, j’ai simplement démarré un serveur web temporaire avec la commande suivante :
python -m http.server 8000
Cela sert le répertoire courant sur http://localhost:8000, ce qui rend le fichier ZIP accessible à OpenSearch.
Si OpenSearch s’exécute dans un container Docker, gardez à l’esprit que le container ne peut pas accéder à votre machine hôte via localhost ou via l’adresse locale de l’hôte.
Une fois cela fait, il est temps d’ouvrir DevTools et d’enregistrer le modèle :
POST /_plugins/_ml/models/_register?deploy=true
{
"name": "jinaai/jina-embeddings-v5-text-small-retrieval",
"version": "1.0.0",
"model_format": "ONNX",
"function_name": "TEXT_EMBEDDING",
"model_content_hash_value": "<YOUR_SHA256_HASH_HERE>",
"url": "<YOUR URL>",
"model_config": {
"model_type": "qwen3",
"embedding_dimension": 1024,
"framework_type": "sentence_transformers",
"all_config": """{\"architectures\":[\"Qwen3Model\"],\"attention_bias\":false,\"attention_dropout\":0.0,\"bos_token_id\":151643,\"dtype\":\"bfloat16\",\"eos_token_id\":151645,\"head_dim\":128,\"hidden_act\":\"silu\",\"hidden_size\":1024,\"initializer_range\":0.02,\"intermediate_size\":3072,\"layer_types\":[\"full_attention\",\"full_attention\",\"full_attention\",\"full_attention\",\"full_attention\",\"full_attention\",\"full_attention\",\"full_attention\",\"full_attention\",\"full_attention\",\"full_attention\",\"full_attention\",\"full_attention\",\"full_attention\",\"full_attention\",\"full_attention\",\"full_attention\",\"full_attention\",\"full_attention\",\"full_attention\",\"full_attention\",\"full_attention\",\"full_attention\",\"full_attention\",\"full_attention\",\"full_attention\",\"full_attention\",\"full_attention\"],\"max_position_embeddings\":32768,\"max_window_layers\":28,\"model_type\":\"qwen3\",\"num_attention_heads\":16,\"num_hidden_layers\":28,\"num_key_value_heads\":8,\"pad_token_id\":null,\"rms_norm_eps\":1e-06,\"rope_parameters\":{\"rope_theta\":3500000,\"rope_type\":\"default\"},\"sliding_window\":null,\"task_names\":[\"retrieval\",\"text-matching\",\"clustering\",\"classification\"],\"tie_word_embeddings\":true,\"transformers_version\":\"5.1.0\",\"use_cache\":true,\"use_sliding_window\":false,\"vocab_size\":151936}"""
}
}
Quelques mots sur cette commande :
1024).TEXT_EMBEDDING) indique que ce modèle générera des embeddings pour du texte.config.json du dossier du modèle téléchargé.Une fois cela fait, pensez à utiliser le task ID présent dans la réponse. Cela permet :
Pour récupérer le model ID depuis DevTools, exécutez :
GET /_plugins/_ml/tasks/<your_upload_task_id>
Une fois la tâche d’enregistrement terminée, il est temps de voir le modèle à l’œuvre.
Vous n’avez pas besoin d’indexer des milliers de documents pour vérifier que tout fonctionne. OpenSearch fournit un endpoint _predict qui permet de tester le modèle directement.
Envoyez simplement une phrase exemple au modèle.
POST /_plugins/_ml/models/<model_id>/_predict
{
"text_docs": [
"Jina V5 is running natively on OpenSearch!"
]
}
Comme nous avons configuré ce modèle comme une fonction TEXT_EMBEDDING avec l’architecture qwen3, OpenSearch gérera automatiquement la tokenization et le pooling.
Si tout est correctement configuré, vous recevrez une réponse contenant un vecteur 1024 dimension.
Vous pouvez maintenant utiliser votre modèle pour créer un ingest pipeline avec le text_embedding processor pour l’indexation, et interroger votre vector database avec des semantic queries.
En déployant avec succès Jina V5, nous avons montré qu’il n’est pas nécessaire d’être enfermé dans un écosystème spécifique pour accéder aux dernières avancées en vector search. Même si Elastic a fortement intégré ce modèle à la pointe de la technologie dans sa stack, la disponibilité des poids sur Hugging Face permet aux utilisateurs d’OpenSearch d’obtenir le même niveau de performance.
La clé réside dans le packaging. En regroupant correctement les split ONNX weights et en configurant l’architecture qwen3 dans OpenSearch, vous disposez désormais d’un moteur d’embeddings 1024 dimensions extrêmement puissant.
Cette configuration garantit que votre infrastructure de recherche reste à la pointe, prête pour des applications de semantic retrieval et de RAG à haute performance.