paint-brush
Bases de données vectorielles - Bases de la recherche de vecteurs et du package Langchain en Pythonpar@shyamganesh
18,016 lectures
18,016 lectures

Bases de données vectorielles - Bases de la recherche de vecteurs et du package Langchain en Python

par Shyam Ganesh S7m2023/09/30
Read on Terminal Reader

Trop long; Pour lire

Dans cet article, je vais vous expliquer les bases des bases de données vectorielles, la recherche de vecteurs et le package Langchain en python pour stocker et interroger des vecteurs similaires. Pour commencer notre parcours d’apprentissage, nous commencerons par un concept clé nommé « Embeddings ». Les intégrations sont un moyen de représenter des données sur une machine dans son propre format compréhensible.
featured image - Bases de données vectorielles - Bases de la recherche de vecteurs et du package Langchain en Python
Shyam Ganesh S HackerNoon profile picture

Dans cet article de blog, je vais vous guider à travers les principes fondamentaux des bases de données vectorielles, de la recherche de vecteurs et du package Langchain en Python, qui facilite le stockage et la récupération de vecteurs comparables.


Pour nous lancer dans notre voyage, nous commencerons par un concept essentiel connu sous le nom d'« intégrations ».

Que sont les intégrations ?

Dans cet article, nous explorerons le concept d'intégration – un aspect fondamental de l'apprentissage automatique qui nous permet de représenter des données textuelles dans un format que les machines peuvent facilement comprendre.


Essentiellement, les intégrations servent de représentations vectorielles du texte, convertissant le réseau complexe de mots, de phrases et de passages dans un format numérique que les machines peuvent traiter.


Une question urgente se pose : les humains peuvent-ils déchiffrer ces intégrations ? La réponse est non. Les intégrations sont essentiellement des séquences de nombres qui encapsulent des informations textuelles.


Par conséquent, comprendre et travailler avec un vecteur d’intégration peut être une tâche ardue pour les humains, alors que les machines la gèrent facilement.


Il existe une myriade de techniques pour générer des intégrations à partir de texte. Les méthodes notables incluent TF-IDF, Word2Vec, Glove et BERT, entre autres. Dans le domaine contemporain de l’apprentissage automatique, les intégrations de phrases ont gagné en popularité par rapport aux intégrations de mots.


Ces incorporations de phrases, représentant l'essence d'un texte, peuvent être obtenues à partir de modèles de transformateur de phrases pré-entraînés tels que « all-MiniLM-L6-V2 » et « all-mpnet-base-v2 ».


Ces modèles produisent des intégrations avec des dimensions fixes, généralement 384 ou 768 dimensions, pour un texte donné.


Maintenant que nous avons exploré les principes fondamentaux des plongements et diverses techniques pour leur génération, concentrons-nous sur le défi du stockage de ces vecteurs de plongement de grande dimension dans un magasin de vecteurs.

Magasins de vecteurs

Un magasin de données vectorielles est une base de données spécialisée conçue pour stocker des représentations intégrées de grande dimension de divers types de données, notamment audio, vidéo, images, texte, etc.


L'une de ses fonctionnalités principales est la capacité de rechercher efficacement des vecteurs dans le magasin qui ressemblent étroitement à un vecteur de requête donné.



Les magasins de vecteurs rationalisent le processus de stockage des intégrations et d'exécution de recherches de similarité entre ces vecteurs, simplifiant ainsi la gestion et la récupération des représentations de données de grande dimension.


Dans le domaine des plongements vectoriels, la recherche de similarité implique de quantifier la proximité ou la relation entre deux ou plusieurs plongements. Généralement, cela est réalisé en calculant la similarité à l’aide de diverses mesures de distance. Certaines mesures de distance couramment utilisées et largement reconnues incluent, entre autres, la distance euclidienne, la distance de Manhattan et la distance cosinusoïdale. Ces métriques nous aident à évaluer le degré de similarité ou de dissimilarité entre les vecteurs, facilitant ainsi des recherches efficaces de similarité au sein des données.


À titre d'exemple, pour déterminer la similitude ou la proximité entre deux points sur un graphique, la distance euclidienne est couramment utilisée. Cette distance peut être calculée à l'aide de la formule suivante :


Distance euclidienne = [(x2 - x1)^2 + (y2 - y1)^2]^0,5



Distance entre 2 points en 2D


Ici, (x1, y1) représente les coordonnées du premier point et (x2, y2) représente les coordonnées du deuxième point sur le graphique. Le résultat de ce calcul fournit une mesure de la séparation spatiale entre les deux points, indiquant leur similitude ou leur dissemblance en termes de positions dans le graphique.


De même, dans la recherche de similarité, les plongements sont représentés dans un espace de grande dimension, chaque enregistrement servant de point de données.


La ligne de code ci-dessous montre comment récupérer les 5 principales intégrations similaires pour des données d'entrée données :

 distance, n = vector_store.search(input_embedding, k=5)


Ce code renverrait une liste des 5 principales intégrations qui ressemblent étroitement aux données d'entrée, ce qui en fait un outil précieux pour diverses applications telles que les systèmes de recommandation, la récupération de contenu, etc.


La sortie de la fonction vector_store.search() comprend les k top-k intégrations similaires ainsi que leurs distances respectives par rapport à input_embedding. Le paramètre "k" est une valeur configurable qui détermine le nombre d'intégrations les plus proches à récupérer dans la recherche de similarité. Vous pouvez définir « k » pour contrôler le nombre souhaité de résultats renvoyés par l'opération de recherche.


Maintenant que nous avons établi une compréhension fondamentale des magasins vectoriels, passons au package LangChain et à FAISS. Ces outils amélioreront encore notre capacité à travailler avec des intégrations de grande dimension et à effectuer des recherches de similarité efficaces.

LangChain en Python

En termes simples, LangChain est un framework conçu pour créer des applications qui exploitent les capacités des grands modèles linguistiques (LLM). Pour des informations et des ressources plus détaillées, vous pouvez vous référer à la documentation officielle de LangChain.


LangChain en python


À l'inverse, FAISS, qui signifie « Facebook AI Similarity Search », est une bibliothèque Python qui offre aux développeurs un moyen rapide et efficace de rechercher des intégrations similaires, s'éloignant des approches conventionnelles basées sur le hachage.


Cette bibliothèque a été développée par l'équipe Facebook AI et offre de puissantes fonctionnalités pour les tâches de recherche de similarités dans des espaces de grande dimension.


FAISS est une bibliothèque open source qui peut être hébergée sur votre propre serveur.


Dans notre exploration de LangChain et FAISS, nous allons maintenant viser à implémenter FAISS dans le cadre LangChain. Vous trouverez ci-dessous quelques API clés de l'intégration FAISS de LangChain sur lesquelles nous nous concentrerons dans cet article :


  1. add_documents() : Cette fonction nous permet d'incorporer des documents supplémentaires dans le magasin de vecteurs.


  2. add_embeddings() : Il permet l’ajout de plus d’intégrations au magasin de vecteurs.


  3. from_documents() : Cette API renvoie un VectorStore basé sur les documents fournis.


  4. from_embeddings() : Cette fonction fournit un index FAISS généré à partir des intégrations données.


  5. load_local() : Utilisez ceci pour charger l'index FAISS à partir du disque.


  6. save_local() : Il vous permet de sauvegarder un index FAISS sur le disque.


  7. similarity_search() : Cette fonction récupère les documents les plus similaires à une requête donnée.


  8. similarity_search_by_vector() : Il récupère les documents les plus similaires à une intégration donnée.


Ces API constituent la base de la combinaison des capacités de LangChain avec FAISS, vous permettant de travailler avec des intégrations et d'effectuer des recherches de similarité efficaces au sein de vos applications.


Le méta-filtrage est une technique précieuse utilisée pour affiner les résultats d'une requête de recherche dans LangChain FAISS. Il existe généralement deux types de méta-filtrage : le pré-filtrage et le post-filtrage. Dans notre framework, nous prenons spécifiquement en charge le post-filtrage pour les requêtes de recherche.


Il est important de noter que le concept de méta-filtrage des résultats de recherche est une fonctionnalité disponible dans la version LangChain de FAISS et n'est pas présent dans l'implémentation originale de FAISS. Cette capacité de post-filtrage améliore la précision et la pertinence des résultats de recherche, offrant des résultats plus personnalisés aux utilisateurs.


Armés de la connaissance des API LangChain FAISS, plongeons-nous dans l'implémentation Python de LangChain FAISS. Cette implémentation vous permettra de travailler avec des intégrations, d'effectuer des recherches de similarité et d'appliquer des techniques de post-filtrage pour affiner vos résultats de recherche dans le cadre LangChain.


N'hésitez pas à explorer et à exploiter ces fonctionnalités pour créer des applications qui exploitent la puissance des grands modèles linguistiques et la recherche avancée de similarité avec FAISS.

Démo Python LangChain FAISS

Base de données

Dans ce guide pédagogique, nous avons choisi l'ensemble de données de Stanford comme ensemble de données de base et ajouté quelques colonnes pour montrer le travail de méta-filtrage dans LangChain FAISS.


Nous commencerons par installer et importer les packages requis

 !pip install langchain[all] !pip3 install Langchain[FAISS] !pip install faiss-cpu # WARNING: langchain 0.0.74 does not provide the extra 'faiss'
 from langchain import FAISS import pandas as pd import numpy as np import os import time import pickle


Maintenant, nous allons importer l'ensemble de données :

 passage_data = pd.read_csv("/Users/shyam/Python_Programs/Text Similarity Codes/Standford_Edited.csv") passage_data.drop(columns=["Unnamed: 0"],axis=1, inplace=True) passage_data 

Aperçu de l'ensemble de données


Ayant l'ensemble de données, nous devons initialiser une fonction d'intégration pour convertir les données texte en vecteurs. Nous avons utilisé « sentence-transformers/all-MiniLM-L6-V2 » qui génère des plongements en 384 dimensions,

 from langchain.embeddings import SentenceTransformerEmbeddings embedding_function = SentenceTransformerEmbeddings(model_name="all-MiniLM-L6-v2")


Nous définirons les informations de métadonnées. Dans les métadonnées, nous avons ajouté l'ID du document et la langue du document pour chaque intégration (contenu),

 start=time.time() metadatas = [] for index, row in passage_data.iterrows(): doc_meta = { "id": row['Id'], "language": row['Language'] } metadatas.append(doc_meta)


Ça y est… Nous allons construire notre index FAISS maintenant,

 faiss = FAISS.from_texts(passage_data['Content'].tolist(), embedding_function, metadatas) print("Time Taken --> ", time.time()-start)


Maintenant, nous allons essayer de sauvegarder l'index FAISS sur le disque et de le recharger :

 faiss.save_local("/Users/shyam/Python_Programs/LangChain_FAISS", "Standford") loaded_faiss = faiss.load_local("/Users/shyam/Python_Programs/LangChain_FAISS",embedding_function, "Standford")


Nous avons terminé la création de l'index FAISS, le stockage et le chargement. C’est le temps de l’inférence. Nous allons essayer de rechercher quelques requêtes et tester l'index FAISS.


Tout d’abord, nous obtiendrons les cinq principaux documents similaires liés à « l’athéisme ».

 start=time.time() loaded_faiss.similarity_search_with_score("What is atheism?",5) 

La sortie de « l'athéisme »


Eh bien, les résultats sont convaincants. Mais nous allons quand même explorer davantage…


Cette fois, nous allons essayer une requête dans un langage différent avec un méta-filtrage. Nous poserons une requête russe indiquant que les critères de filtrage doivent être {lang: 'ru_RU'}.

 #Что такое атеизм? - Russian loaded_faiss.similarity_search_with_score("Что такое атеизм?",5, {"language":"ru_RU"}, 10)


Ici, nous avons mentionné la prise des dix documents les plus similaires du magasin de vecteurs, puis l'application de notre condition de filtrage pour obtenir les cinq principaux documents pour notre requête.

Résultat de la requête post-filtrage


À la conclusion de cet article, j'espère que vous avez acquis une solide compréhension des magasins de vecteurs et de la recherche de vecteurs. Nous avons également fourni une démonstration de LangChain FAISS pour illustrer ses fonctionnalités.


Je vous encourage fortement à explorer d'autres magasins de vecteurs tels que ChromaDb, Qdrant, Milvus, etc.


Chaque magasin vectoriel présente son ensemble unique d'avantages et d'inconvénients, alors faites votre sélection en fonction des exigences spécifiques de votre cas d'utilisation.


Je vous souhaite un voyage d’apprentissage agréable et fructueux !