Image générée avec Idéogramme.ai
Ainsi, vous entendrez peut-être tous ces termes de base de données vectorielles. Certains pourraient le comprendre, d’autres non. Ne vous inquiétez pas si vous ne les connaissez pas, car les bases de données vectorielles ne sont devenues un sujet plus important que ces dernières années.
Les bases de données vectorielles ont gagné en popularité grâce à l’introduction de l’IA générative auprès du public, en particulier le LLM.
De nombreux produits LLM, tels que GPT-4 et Gemini, facilitent notre travail en fournissant une capacité de génération de texte pour notre saisie. Eh bien, les bases de données vectorielles jouent en réalité un rôle dans ces produits LLM.
Mais comment fonctionnait la base de données vectorielles ? Et quelles sont leurs pertinences dans le LLM ?
La question ci-dessus est celle à laquelle nous répondrions dans cet article. Eh bien, explorons-les ensemble.
Une base de données vectorielle est un stockage de base de données spécialisé conçu pour stocker, indexer et interroger des données vectorielles. Il est souvent optimisé pour les données vectorielles de grande dimension, car il s’agit généralement de la sortie du modèle d’apprentissage automatique, en particulier LLM.
Dans le contexte d’une base de données vectorielles, le vecteur est une représentation mathématique des données. Chaque vecteur est constitué d’un tableau de points numériques représentant la position des données. Le vecteur est souvent utilisé dans le LLM pour représenter les données texte, car un vecteur est plus facile à traiter que les données texte.
Dans l’espace LLM, le modèle pourrait avoir une entrée de texte et transformer le texte en un vecteur de grande dimension représentant les caractéristiques sémantiques et syntaxiques du texte. Ce processus est ce que nous appelons l’intégration. En termes plus simples, l’intégration est un processus qui transforme le texte en vecteurs contenant des données numériques.
L’intégration utilise généralement un modèle de réseau neuronal appelé modèle d’intégration pour représenter le texte dans l’espace d’intégration.
Utilisons un exemple de texte : « J’aime la science des données ». Les représenter avec le modèle OpenAI text-embedding-3-small donnerait un vecteur de 1536 dimensions.
[0.024739108979701996, -0.04105354845523834, 0.006121257785707712, -0.02210472710430622, 0.029098540544509888,...]
Le nombre dans le vecteur est la coordonnée dans l’espace d’intégration du modèle. Ensemble, ils formeraient une représentation unique du sens de la phrase issue du modèle.
Vector Database serait alors responsable du stockage de ces sorties de modèle d’intégration. L’utilisateur peut alors interroger, indexer et récupérer le vecteur selon ses besoins.
Cela suffit peut-être pour une introduction, et passons à une pratique plus technique. Nous essaierions d’établir et de stocker des vecteurs avec une base de données de vecteurs open source appelée Tisser.
Weaviate est une base de données vectorielles open source évolutive qui sert de cadre pour stocker notre vecteur. Nous pouvons exécuter Weaviate dans des instances comme Docker ou utiliser Weaviate Cloud Services (WCS).
Pour commencer à utiliser Weaviate, nous devons installer les packages en utilisant le code suivant :
pip install weaviate-client
Pour faciliter les choses, nous utiliserions un cluster sandbox de WCS pour faire office de base de données vectorielles. Weaviate fournit un cluster gratuit de 14 jours que nous pouvons utiliser pour stocker nos vecteurs sans enregistrer de mode de paiement. Pour ce faire, vous devez vous inscrire sur leur Console WCS initialement.
Une fois sur la plateforme WCS, sélectionnez Créer un cluster et saisissez le nom de votre Sandbox. L’interface utilisateur devrait ressembler à l’image ci-dessous.
Image par auteur
N’oubliez pas d’activer l’authentification, car nous souhaitons également accéder à ce cluster via la clé API WCS. Une fois le cluster prêt, recherchez la clé API et l’URL du cluster, que nous utiliserons pour accéder à la base de données vectorielles.
Une fois que tout sera prêt, nous simulerons le stockage de notre premier vecteur dans la base de données de vecteurs.
Pour l’exemple de stockage de la base de données vectorielles, j’utiliserais le Collection de livres exemple d’ensemble de données de Kaggle. Je n’utiliserais que les 100 premières lignes et 3 colonnes (titre, description, intro).
import pandas as pd
data = pd.read_csv('commonlit_texts.csv', nrows = 100, usecols=['title', 'description', 'intro'])
Laissons de côté nos données et connectons-nous à notre base de données vectorielles. Tout d’abord, nous devons configurer une connexion à distance à l’aide de la clé API et de l’URL de votre cluster.
import weaviate
import os
import requests
import json
cluster_url = "Your Cluster URL"
wcs_api_key = "Your WCS API Key"
Openai_api_key ="Your OpenAI API Key"
client = weaviate.connect_to_wcs(
cluster_url=cluster_url,
auth_credentials=weaviate.auth.AuthApiKey(wcs_api_key),
headers={
"X-OpenAI-Api-Key": openai_api_key
}
)
Une fois que vous avez configuré votre variable client, nous nous connecterons au service Weaviate Cloud et créerons une classe pour stocker le vecteur. La classe dans Weaviate est la collection de données ou des analogues du nom de table dans une base de données relationnelle.
import weaviate.classes as wvc
client.connect()
book_collection = client.collections.create(
name="BookCollection",
vectorizer_config=wvc.config.Configure.Vectorizer.text2vec_openai(),
generative_config=wvc.config.Configure.Generative.openai()
)
Dans le code ci-dessus, nous nous connectons au cluster Weaviate et créons une classe BookCollection. L’objet de classe utilise également le modèle d’intégration OpenAI text2vec pour vectoriser les données texte et le module génératif OpenAI.
Essayons de stocker les données texte dans une base de données vectorielle. Pour ce faire, vous pouvez utiliser le code suivant.
sent_to_vdb = data.to_dict(orient="records")
book_collection.data.insert_many(sent_to_vdb)
Image par auteur
Nous venons de stocker avec succès notre ensemble de données dans la base de données vectorielles ! Est-ce facile ?
Maintenant, vous pourriez être curieux de connaître les cas d’utilisation des bases de données vectorielles avec LLM. C’est ce dont nous allons discuter ensuite.
Quelques cas d’utilisation dans lesquels LLM peut être appliqué avec Vector Database. Explorons-les ensemble.
Recherche sémantique
La recherche sémantique est un processus de recherche de données en utilisant le sens de la requête pour récupérer des résultats pertinents plutôt que de s’appuyer uniquement sur la recherche traditionnelle basée sur des mots clés.
Le processus implique l’utilisation du modèle LLM d’intégration de la requête et l’exécution d’une recherche de similarité d’intégration dans notre base de données vectorielle intégrée.
Essayons d’utiliser Weaviate pour effectuer une recherche sémantique basée sur une requête spécifique.
book_collection = client.collections.get("BookCollection")
client.connect()
response = book_collection.query.near_text(
query="childhood story,
limit=2
)
Dans le code ci-dessus, nous essayons d’effectuer une recherche sémantique avec Weaviate pour trouver les deux principaux livres étroitement liés à l’histoire d’enfance de la requête. La recherche sémantique utilise le modèle d’intégration OpenAI que nous avons précédemment mis en place. Le résultat est ce que vous pouvez voir ci-dessous.
{'title': 'Act Your Age', 'description': 'A young girl is told over and over again to act her age.', 'intro': 'Colleen Archer has written for nHighlightsn. In this short story, a young girl is told over and over again to act her age.nAs you read, take notes on what Frances is doing when she is told to act her age. '}
{'title': 'The Anklet', 'description': 'A young woman must deal with unkind and spiteful treatment from her two older sisters.', 'intro': "Neil Philip is a writer and poet who has retold the best-known stories from nThe Arabian Nightsn for a modern day audience. nThe Arabian Nightsn is the English-language nickname frequently given to nOne Thousand and One Arabian Nightsn, a collection of folk tales written and collected in the Middle East during the Islamic Golden Age of the 8th to 13th centuries. In this tale, a poor young woman must deal with mistreatment by members of her own family.nAs you read, take notes on the youngest sister's actions and feelings."}
Comme vous pouvez le constater, aucun mot direct sur les histoires d’enfance ne figure dans le résultat ci-dessus. Cependant, le résultat reste étroitement lié à une histoire destinée aux enfants.
Recherche générative
La recherche générative pourrait être définie comme une application d’extension de la recherche sémantique. La recherche générative, ou Retrieval Augmented Generation (RAG), utilise l’invite LLM avec la recherche sémantique qui a récupéré les données de la base de données vectorielles.
Avec RAG, le résultat de la recherche de requête est traité vers LLM, nous les obtenons donc sous la forme souhaitée au lieu des données brutes. Essayons une implémentation simple du RAG avec Vector Database.
response = book_collection.generate.near_text(
query="childhood story",
limit=2,
grouped_task="Write a short LinkedIn post about these books."
)
print(response.generated)
Le résultat est visible dans le texte ci-dessous.
Excited to share two captivating short stories that explore themes of age and mistreatment. "Act Your Age" by Colleen Archer follows a young girl who is constantly told to act her age, while "The Anklet" by Neil Philip delves into the unkind treatment faced by a young woman from her older sisters. These thought-provoking tales will leave you reflecting on societal expectations and family dynamics. #ShortStories #Literature #BookRecommendations 📚
Comme vous pouvez le voir, le contenu des données est le même qu’avant mais a maintenant été traité avec OpenAI LLM pour fournir une courte publication LinkedIn. De cette façon, RAG est utile lorsque nous souhaitons une sortie de forme spécifique à partir des données.
Réponse aux questions avec RAG
Dans notre exemple précédent, nous avons utilisé une requête pour obtenir les données souhaitées, et RAG a traité ces données pour obtenir le résultat souhaité.
Cependant, nous pouvons transformer la capacité RAG en un outil de réponse aux questions. Nous pouvons y parvenir en les combinant avec le framework LangChain.
Tout d’abord, installons les packages nécessaires.
pip install langchain
pip install langchain_community
pip install langchain_openai
Ensuite, essayons d’importer les packages et de lancer les variables dont nous avons besoin pour faire fonctionner le contrôle qualité avec RAG.
from langchain.chains import RetrievalQA
from langchain_community.vectorstores import Weaviate
import weaviate
from langchain_openai import OpenAIEmbeddings
from langchain_openai.llms.base import OpenAI
llm = OpenAI(openai_api_key = openai_api_key, model_name="gpt-3.5-turbo-instruct", temperature = 1)
embeddings = OpenAIEmbeddings(openai_api_key = openai_api_key )
client = weaviate.Client(
url=cluster_url, auth_client_secret=weaviate.AuthApiKey(wcs_api_key)
)
Dans le code ci-dessus, nous avons configuré le LLM pour la génération de texte, le modèle d’intégration et la connexion client Weaviate.
Ensuite, nous définissons la connexion Weaviate à la base de données Vector.
weaviate_vectorstore = Weaviate(client=client, index_name="BookCollection", text_key='intro',by_text = False, embedding=embeddings)
retriever = weaviate_vectorstore.as_retriever()
Dans le code ci-dessus, faites de Weaviate Database BookCollection l’outil RAG qui rechercherait la fonctionnalité « intro » lorsque vous y êtes invité.
Ensuite, nous créerions une chaîne de questions-réponses à partir de LangChain avec le code ci-dessous.
qa_chain = RetrievalQA.from_chain_type(
llm=llm, chain_type="stuff", retriever = retriever
)
Tout est maintenant prêt. Essayons le contrôle qualité avec RAG en utilisant l’exemple de code suivant.
response = qa_chain.invoke(
"Who is the writer who write about love between two goldfish?")
print(response)
Le résultat est présenté dans le texte ci-dessous.
{'query': 'Who is the writer who write about love between two goldfish?', 'result': ' The writer is Grace Chua.'}
Avec la base de données Vector comme endroit pour stocker toutes les données texte, nous pouvons implémenter RAG pour effectuer le contrôle qualité avec LangChain. Est-ce que c’est chouette ?
Une base de données vectorielles est une solution de stockage spécialisée conçue pour stocker, indexer et interroger des données vectorielles. Il est souvent utilisé pour stocker des données textuelles et implémenté en conjonction avec des modèles linguistiques étendus (LLM). Cet article tentera une configuration pratique de la base de données vectorielle Weaviate, y compris des exemples de cas d’utilisation tels que la recherche sémantique, la génération augmentée par récupération (RAG) et la réponse aux questions avec RAG.
Cornellius Yudha Wijaya est directeur adjoint de la science des données et rédacteur de données. Tout en travaillant à temps plein chez Allianz Indonesia, il aime partager des conseils sur Python et les données via les réseaux sociaux et la rédaction. Cornellius écrit sur une variété de sujets liés à l’IA et à l’apprentissage automatique.