Nous constaterons qu’il existe des URL en double, mais celles-ci n’indiquent pas nécessairement des enregistrements en double en tant que GIF unique plusieurs descriptions peuvent être attribuées.
Le pipeline de recherche prendra, à un niveau élevé, notre requête en langage naturel comme “un chien qui parle au téléphone” et recherchez dans les descriptions GIF existantes tout ce qui a une image similaire sens à cette requête.
Dans ce contexte, nous décrivons sens comme similarité sémantique , qui sont tous deux des termes chargés et peuvent faire référence à beaucoup de choses. Par exemple, les deux phrases sont-elles similaire? Dans ce cas, cela dépendrait beaucoup de notre cas d’utilisation.
Autre exemple : laquelle des deux phrases suivantes se ressemble le plus ?
Si nous voulions trouver des phrases ayant une signification similaire, le choix évident serait A
et C
. Faire correspondre ceux avec B
aurait peu de sens. Cependant, ce n’est pas le cas si nous recherchons des couples question-réponse ; dans ce cas, B
devrait correspondre très étroitement avec A
et C
.
Il est important d’identifier ce que votre cas d’utilisation requiert dans sa définition de « similarité sémantique » . Pour nous, nous voulons vraiment identifier la similitude générique. C’est-à-dire que nous voulons A
et C
correspondre, et B
pour ne correspondre ni à l’un ni à l’autre.
Pour ce faire, nous allons transformer nos phrases en plongements vectoriels denses . Ces vecteurs denses peuvent être stockés dans un base de données vectorielle où nous pouvons très rapidement comparer des vecteurs et identifier les plus similaires sur la base de métriques telles que la distance euclidienne et la similarité cosinus.
La base de données vectorielle gère le stockage et la recherche rapide de nos vecteurs intégrés, mais nous avons encore besoin d’un moyen de créer ces vecteurs intégrés.
Pour ce faire, nous utilisons des modèles de transformateur NLP appelés récupérateurs qui sont affinée pour la création plongements de phrases . Ces plongements/vecteurs de phrases peuvent représenter numériquement la sens derrière le texte qu’ils représentent.
La réunion de ces deux composants nous donne un pipeline de recherche sémantique que nous pouvons utiliser pour récupérer des descriptions GIF sémantiquement similaires en fonction d’une requête.
Voyons comment nous pouvons mettre tout cela ensemble.
Nous allons commencer par initialiser notre modèle de retriever. Bon nombre des retrievers les plus puissants utilisent un transformateur de phrase architecture, qui sont mieux pris en charge via le sentence-transformers
bibliothèque, installé via un pip install sentence-transformers
.
Pour trouver des modèles de transformateurs de phrases, nous allons à huggingface.co/models et chercher sentence-transformers
pour le officiel modèles de transformateurs de phrases.
Cependant, il existe d’autres modèles que nous pouvons utiliser, comme le all-MiniLM-L6-v2
transformateur de phrase formé lors d’un événement spécial sur plus de 1 milliard de paires d’entraînement . Nous utiliserons ce modèle.
Il y a quelques détails importants ici :
signifie que le modèle peut lire jusqu’à 128 jetons d’entrée.
se réfère en fait à la phrase taille d’encastrement. Cela signifie que le modèle produira une représentation vectorielle à 384 dimensions du texte d’entrée.
Pour les courtes descriptions GIF de plusieurs mots de notre ensemble de données, une longueur de séquence maximale de 128 est plus qu’assez .
Nous devons utiliser le phrase taille d’intégration lors de l’initialisation de notre base de données vectorielle, nous stockons donc cela dans le embed_dim
variables ci-dessus.
Pour initialiser notre base de données vectorielles, nous devons d’abord nous inscrire à un clé API Pinecone gratuite et installez le client Pinecone Python via pip install pinecone-client
. Une fois prêt, nous initialisons :
Ici, nous spécifions un nom d’index de 'gif-search'
; n’hésitez pas à choisir ce que vous aimez. C’est simplement un nom. La metric
est plus important et dépend du modèle utilisé.
Pour notre modèle choisi, nous pouvons voir dans son modèle de carte qu’il a été formé à l’utilisation similarité cosinus c’est pourquoi nous avons précisé es métriques alternatives incluent
Nous avons initialisé notre base de données vectorielle et nos composants de récupération, afin que nous puissions passer à l’intégration et à l’indexation de nos données.
Le processus d’intégration et d’indexation est beaucoup plus rapide lorsque nous effectuons ces étapes pour plusieurs enregistrements en parallèle . Cependant, nous ne pouvons pas traiter tous nos enregistrements en même temps car le modèle de récupération doit déplacer tout ce qu’il intègre dans la mémoire sur puce, qui est limitée.
Pour éviter cette limite tout en gardant les temps d’indexation aussi rapides que possible, nous traitons tout par lots de 64
.
Ici, nous extrayons le batch
de nos données df
. Nous encodons les descriptions via notre modèle de récupération, créons des métadonnées (couvrant à la fois descriptifs et URL ) et créez des ID de format de chaîne. À partir de là, nous avons tout ce dont nous avons besoin pour créer documents qui ressemblera à ceci :
quand nous upsert
ces documents à l’indice Pinecone, nous le faisons par lots de 64 . Après tout cela, nous utilisons pour vérifier que nous avons inséré tous 125 782 documents dont nous disposons.
La dernière étape de l’interrogation de nos données couvre :
Encoder une requête comme “les chiens parlent au téléphone” créer un vecteur de requête ,
Récupération de similaires vecteurs de contexte de Pomme de pin,
Obtenir des GIF pertinents à partir des URL trouvées dans nos champs de métadonnées.
Pas une et deux sera exécuté par une fonction nommée search_gif
:
Pour afficher les GIF, nous affichons HTML <img>
éléments utilisant les URL de métadonnées pour pointer vers les bons GIF. Nous le faisons en utilisant le display_gif
fonction:
Testons quelques requêtes.
Cela semble assez précis, nous avons donc réussi à assembler facilement ce pipeline de recherche GIF. Avec un petit effort supplémentaire nous pouvons traduire ces étapes en créant une application Web en utilisant quelque chose comme Streamlit .