Utilisez Milvus et Airbyte pour la recherche de similarité sur toutes vos données
Milvus est une base de données vectorielle open source populaire. Les vecteurs sont des tableaux de nombres à haute dimension. Lorsque l’on travaille avec des grands modèles de langage (LLM), les « embeddings » désignent spécifiquement la dernière couche cachée au sein du composant Encoder d’un réseau de neurones profond basé sur un transformeur. Cette couche d’embedding est un ensemble de vecteurs représentant le sens sémantique de mots ou de pixels (pour du texte ou des images).
Étant donné la richesse des informations contenues dans la couche d’embedding d’un LLM entraîné, le stockage et la récupération efficaces des vecteurs sont devenus essentiels. Milvus est une base de données vectorielle spécialement conçue pour stocker, indexer et rechercher efficacement des données vectorielles à haute dimension. Les bases de données vectorielles sont généralement utilisées pour des recherches de similarité dans des données non structurées, ce qui permet d’améliorer les réponses de chat génératif, les recommandations de produits et d’autres applications.
En utilisant Airbyte, il est simple de transférer des données depuis de nombreuses sources différentes vers Milvus, tout en calculant les embeddings vectoriels des textes au passage.
La puissance des embeddings réside dans leur capacité à rechercher des éléments d’information pertinents, même si des concepts similaires sont formulés différemment. Cet article utilisera cette fonctionnalité pour rendre un formulaire de support de site web plus intelligent en recherchant des informations pertinentes à la volée. Cela servira à informer l’utilisateur sur des tickets similaires déjà traités et à mettre en avant des articles pertinents de la base de connaissances qui pourraient aider à résoudre le problème sans l’aide d’un agent de support.
Nous utiliserons Zilliz Cloud comme magasin vectoriel, Airbyte pour extraire et charger les données, l’API d’embedding d’OpenAI pour calculer les embeddings, et Streamlit pour créer un formulaire de soumission intelligent affichant des données pertinentes.
Vous aurez besoin de :
Compte Zendesk (ou une autre source de données depuis laquelle vous souhaitez synchroniser des données)
Compte Airbyte ou instance locale
Clé API OpenAI
Compte Zilliz Cloud ou cluster Milvus local
Python 3.10 installé localement
Étape 1 : Configurer le cluster Milvus
Sur cloud.zilliz.com, vous pouvez vous inscrire pour obtenir un cluster gratuit afin de stocker vos embeddings vecteurs pour la recherche de similarité. Une fois votre compte créé, vous devez configurer un nouveau cluster.
Les entités individuelles (dans notre cas, les tickets de support et les articles de la base de connaissances) sont stockées dans une « collection » — une fois votre cluster configuré, vous devez créer une collection. Choisissez un nom approprié et définissez la Dimension sur 1536 pour correspondre à la dimensionnalité vectorielle générée par le service d’embeddings d’OpenAI :
Après la création, Zilliz vous affichera le point de terminaison et la clé API — notez-les, car nous en aurons besoin à l’étape suivante.
Étape 2 : Configurer la connexion dans Airbyte
Notre base de données est prête, transférons quelques données ! Pour cela, nous devons configurer une connexion dans Airbyte. Inscrivez-vous à un compte Airbyte Cloud sur cloud.airbyte.com ou lancez une instance locale comme décrit dans la documentation.
Une fois votre instance en cours d’exécution, nous devons configurer la connexion — cliquez sur « New connection » et choisissez le connecteur « Zendesk Support » comme source.
Sur Airbyte Cloud, vous pouvez facilement vous authentifier en cliquant sur le bouton Authenticate. Lorsque vous utilisez une instance Airbyte locale, suivez les instructions indiquées sur la page de documentation.
Info::
Si vous souhaitez utiliser une autre source de données — le reste de cet article s’applique à toutes sortes de sources textuelles
::
Après avoir cliqué sur le bouton « Test and Save », Airbyte vérifiera si la connexion peut être établie. Si tout fonctionne correctement, l’étape suivante consiste à configurer la destination vers laquelle déplacer les données. Ici, choisissez le connecteur « Milvus ».
Le connecteur Milvus fait trois choses :
- Découpage et formatage - Diviser les enregistrements Zendesk en texte et métadonnées. Si le texte est plus grand que la taille de bloc spécifiée, les enregistrements sont divisés en plusieurs parties qui sont chargées individuellement dans la collection. Le découpage du texte (ou chunking) peut, par exemple, se produire dans le cas de longs tickets de support ou d’articles de connaissances volumineux. En divisant le texte, vous pouvez garantir que les recherches donnent toujours des résultats utiles.
Partons sur une taille de bloc de 1000 tokens et des champs de texte body, title, description et subject, car ceux-ci seront présents dans les données que nous recevrons de Zendesk.
Embedding - L’utilisation de modèles de Machine Learning transforme les blocs de texte produits par la partie traitement en embeddings vectoriels que vous pouvez ensuite rechercher par similarité sémantique. Pour créer les embeddings, vous devez fournir la clé API OpenAI. Airbyte enverra chaque bloc à OpenAI et ajoutera le vecteur résultant aux entités chargées dans votre cluster Milvus.
Indexation - Une fois que vous avez vectorisé les blocs, vous pouvez les charger dans la base de données. Pour ce faire, insérez les informations que vous avez obtenues lors de la configuration de votre cluster et de votre collection dans Zilliz cloud.
Cliquer sur « Test and save » vérifiera si tout est correctement aligné (identifiants valides, la collection existe et possède la même dimensionnalité vectorielle que l’embedding configuré, etc.)
La dernière étape avant que les données soient prêtes à circuler consiste à sélectionner les « streams » à synchroniser. Un stream est une collection d’enregistrements dans la source. Comme Zendesk prend en charge un grand nombre de streams qui ne sont pas pertinents pour notre cas d’utilisation, sélectionnons uniquement « tickets » et « articles » et désactivons tous les autres pour économiser de la bande passante et nous assurer que seules les informations pertinentes apparaîtront dans les recherches :
Vous pouvez sélectionner les champs à extraire de la source en cliquant sur le nom du stream. Le mode de synchronisation « Incremental | Append + Deduped » signifie que les exécutions ultérieures de la connexion maintiennent Zendesk et Milvus synchronisés tout en transférant un minimum de données (uniquement les articles et tickets qui ont changé depuis la dernière exécution).
Dès que la connexion est configurée, Airbyte commencera à synchroniser les données. Cela peut prendre quelques minutes avant qu’elles n’apparaissent dans votre collection Milvus.
Si vous sélectionnez une fréquence de réplication, Airbyte s’exécutera régulièrement pour maintenir votre collection Milvus à jour avec les changements apportés aux articles Zendesk et les nouveaux problèmes créés.
Vous pouvez vérifier dans l’interface utilisateur Zilliz cloud comment les données sont structurées dans la collection en accédant au playground et en exécutant une requête « Query Data » avec un filtre défini sur « _ab_stream == \”tickets\” »
Comme vous pouvez le voir dans la vue Result, chaque enregistrement provenant de Zendesk est stocké sous forme d’entités distinctes dans Milvus avec toutes les métadonnées spécifiées. Le bloc de texte sur lequel l’embedding est basé est affiché comme la propriété « text » — c’est le texte qui a été intégré à l’aide d’OpenAI et sur lequel nous effectuerons nos recherches.
Étape 3 : Créer une application Streamlit interrogeant la collection
Nos données sont prêtes — nous devons maintenant créer l’application pour les utiliser. Dans ce cas, l’application sera un simple formulaire de support permettant aux utilisateurs de soumettre des cas de support. Lorsque l’utilisateur cliquera sur envoyer, nous ferons deux choses :
Rechercher des tickets similaires soumis par des utilisateurs de la même organisation
Rechercher des articles de base de connaissances qui pourraient être pertinents pour l’utilisateur
Dans les deux cas, nous exploiterons la recherche sémantique à l’aide des embeddings OpenAI. Pour ce faire, la description du problème saisie par l’utilisateur est également intégrée et utilisée pour récupérer des entités similaires depuis le cluster Milvus. S’il existe des résultats pertinents, ils sont affichés sous le formulaire.
Vous aurez besoin d’une installation locale de Python, car nous utiliserons Streamlit pour implémenter l’application.
Tout d’abord, installez Streamlit, la bibliothèque cliente Milvus et la bibliothèque cliente OpenAI en local :
pip install streamlit pymilvus openai
Pour afficher un formulaire de support basique, créez un fichier python app.py :
import streamlit as st
with st.form("my_form"):
st.write("Submit a support case")
text_val = st.text_area("Describe your problem")
submitted = st.form_submit_button("Submit")
if submitted:
# TODO check for related support cases and articles
st.write("Submitted!")
Pour exécuter votre application, utilisez Streamlit run :
streamlit run app.py
Cela affichera un formulaire basique :
Le code de cet exemple est également disponible sur GitHub.
Ensuite, vérifions s’il existe des tickets ouverts qui pourraient être pertinents. Pour ce faire, nous intégrons le texte saisi par l’utilisateur à l’aide d’OpenAI, puis effectuons une recherche de similarité sur notre collection, en filtrant les tickets encore ouverts. S’il y en a un avec une distance très faible entre le ticket fourni et le ticket existant, informez-en l’utilisateur et ne soumettez pas :
import os
import pymilvus
import openai
org_id = 360033549136 # TODO Load from customer login data
pymilvus.connections.connect(uri=os.environ["MILVUS_URL"], token=os.environ["MILVUS_TOKEN"])
collection = pymilvus.Collection("zendesk")
embedding = openai.Embedding.create(input=text_val, model="text-embedding-ada-002")['data'][0]['embedding']
results = collection.search(data=[embedding], anns_field="vector", param={}, limit=5, output_fields=["_id", "subject", "description"], expr=f'status == "new" and organization_id == {org_id}')
st.write(results[0]) # debug output just for now
if len(results[0]) > 0 and results[0].distances[0] < 0.35:
matching_ticket = results[0][0].entity
st.write(f"This case seems very similar to {matching_ticket.get('subject')} (id #{matching_ticket.get('_id')}). Make sure it has not been submitted before")
else:
st.write("Submitted!")
Plusieurs choses se passent ici :
La connexion au cluster Milvus est configurée.
Le service OpenAI est utilisé pour générer un embedding de la description saisie par l’utilisateur.
Une recherche de similarité est effectuée, en filtrant les résultats par le statut du ticket et l’identifiant de l’organisation (car seuls les tickets ouverts de la même organisation sont pertinents).
S’il y a des résultats et que la distance entre les vecteurs d’embedding du ticket existant et du texte nouvellement saisi est inférieure à un certain seuil, signalez ce fait.
Pour exécuter la nouvelle application, vous devez d’abord définir les variables d’environnement pour OpenAI et Milvus :
export MILVUS_TOKEN=...
export MILVUS_URL=https://...
export OPENAI_API_KEY=sk-...
streamlit run app.py
Lorsque vous essayez de soumettre un ticket qui existe déjà, voici à quoi ressemblera le résultat :
Le code de cet exemple est également disponible sur GitHub.
Comme vous pouvez le voir dans la sortie de débogage verte masquée dans la version finale, deux tickets correspondaient à notre recherche (avec le statut new, provenant de l’organisation actuelle et proches du vecteur d’embedding). Cependant, le premier (pertinent) était mieux classé que le second (non pertinent dans cette situation), ce qui se reflète dans la valeur de distance plus faible. Cette relation est capturée dans les vecteurs d’embedding sans correspondance directe de mots, comme dans une recherche plein texte classique.
Pour conclure, affichons des informations utiles après la soumission du ticket afin de fournir à l’utilisateur autant d’informations pertinentes que possible dès le départ.
Pour ce faire, nous allons effectuer une deuxième recherche après la soumission du ticket afin de récupérer les articles de la base de connaissances les plus pertinents :
article_results = collection.search(data=[embedding], anns_field="vector", param={}, limit=5, output_fields=["title", "html_url"], expr=f'_ab_stream == "articles"')
st.write(article_results[0])
if len(article_results[0]) > 0:
st.write("We also found some articles that might help you:")
for hit in article_results[0]:
st.write(f"* [{hit.entity.get('title')}]({hit.entity.get('html_url')})")
S’il n’existe aucun ticket de support ouvert avec un score de similarité élevé, le nouveau ticket est soumis et les articles de connaissance pertinents sont affichés ci-dessous :
Le code de cet exemple est également disponible sur Github.
Bien que l’interface utilisateur présentée ici ne soit pas un véritable formulaire de support, mais un exemple destiné à illustrer le cas d’utilisation, la combinaison d’Airbyte et de Milvus est très puissante : elle facilite le chargement de texte depuis une grande variété de sources (des bases de données comme Postgres aux API comme Zendesk ou GitHub, jusqu’aux sources entièrement personnalisées créées avec le SDK d’Airbyte ou le générateur visuel de connecteurs) et son indexation sous forme d’embeddings dans Milvus, un puissant moteur de recherche vectorielle capable de passer à l’échelle pour d’énormes volumes de données.
Airbyte et Milvus sont open source et entièrement gratuits à utiliser sur votre infrastructure, avec des offres cloud permettant de déléguer les opérations si vous le souhaitez.
Au-delà du cas d’utilisation classique de recherche sémantique illustré dans cet article, la configuration générale peut également être utilisée pour créer un chatbot de questions-réponses avec la méthode RAG (Retrieval Augmented Generation), des systèmes de recommandation, ou pour contribuer à rendre la publicité plus pertinente et plus efficace.
Continuer à lire

Zilliz Cloud Now Available in AWS Asia Pacific (Seoul)
Zilliz Cloud is now available in AWS Seoul — low-latency vector search, in-country data residency, and one-step migration for Korean AI teams. 31 regions across 5 clouds.

Announcing VDBBench 1.0: Open-Source VectorDB Benchmarking with Your Real-World Production Workloads
Discover VDBBench 1.0, an open-source tool for benchmarking vector databases with real-world production data, streaming ingestion, and concurrent workloads.

Vector Databases vs. Graph Databases
Use a vector database for AI-powered similarity search; use a graph database for complex relationship-based queries and network analysis.



