Créer des incorporations avec l’extension Azure AI

Effectué

Pour exécuter une recherche sémantique, vous devez comparer l’incorporation de requête aux incorporations des éléments recherchés. L’extension azure_ai pour Azure Database pour PostgreSQL - Serveur flexible s’intègre à Azure OpenAI pour générer des vecteurs d’incorporation.

Diagramme montrant le texte d’entrée « lorem ipsum » envoyé à l’API d’incorporation Azure OpenAI, ce qui entraîne un tableau vectoriel de nombres.

Présentation de azure_ai et d’Azure OpenAI

L’extension flexible Azure Database pour PostgreSQL pour Azure AI fournit des fonctions définies par l’utilisateur pour s’intégrer aux services Azure AI, notamment Azure OpenAI et Azure Cognitive Services.

L’API Azure OpenAI Embeddings génère un vecteur d’incorporation du texte d’entrée. Utilisez cette API pour définir les incorporations pour tous les éléments recherchés. Le l’extension azure_ai du schéma azure_openai facilite l’appel de l’API à partir de SQL pour générer des incorporations, qu’il s’agisse d’initialiser des incorporations d’éléments ou de créer une incorporation de requête à la volée. Ces incorporations peuvent ensuite être utilisées pour effectuer une recherche de similarité vectorielle, ou en d’autres termes, la recherche sémantique.

Utilisation de l’extension azure_ai avec Azure OpenAI

Pour appeler l’API Azure OpenAI Embeddings à partir de PostgreSQL, vous devez activer et configurer l’extension azure_ai, accorder l’accès à Azure OpenAI et déployer un modèle Azure OpenAI. Pour plus d’informations, consultez la documentation Azure OpenAI sur le serveur flexible Azure Database pour PostgreSQL.

Une fois l’environnement prêt et que l’extension est listée, exécutez ce code SQL :

/* Enable the extension. */
CREATE EXTENSION azure_ai;

Vous devez également configurer le point de terminaison et la clé d’accès de votre ressource de service OpenAI :

SELECT azure_ai.set_setting('azure_openai.endpoint', '{your-endpoint-url}');
SELECT azure_ai.set_setting('azure_openai.subscription_key', '{your-api-key}}');

Une fois azure_ai et Azure OpenAI configurés, l’extraction et le stockage d’incorporations sont une question simple d’appel d’une fonction dans la requête SQL. En supposant qu’une table listings avec une colonne description et une colonne listing_vector vous permet de générer et de stocker l’incorporation pour toutes les descriptions avec la requête suivante. Remplacez {your-deployment-name} par le nom du déploiement à partir d’Azure OpenAI Studio pour le modèle que vous avez créé.

UPDATE listings
SET listing_vector = azure_openai.create_embeddings('{your-deployment-name}', description, max_attempts => 5, retry_delay_ms => 500)
WHERE listing_vector IS NULL;

La colonne vectorielle listing_vector doit avoir le même nombre de dimensions que le modèle de langage produit.

Pour afficher un incorporation de document, exécutez la requête suivante :

SELECT listing_vector FROM listings LIMIT 1;

Le résultat est un vecteur de nombres à virgule flottante. Vous pouvez d’abord exécuter \x pour rendre la sortie plus lisible.

Générer une incorporation de requête dynamiquement

Une fois que vous avez incorporé les documents que vous souhaitez rechercher, vous pouvez exécuter une requête de recherche sémantique. Pour ce faire, vous devez également générer une incorporation pour le texte de la requête.

Le schéma azure_openai de l’extension azure_ai vous permet de générer des incorporations dans SQL. Par exemple, pour rechercher les trois premières listes dont le texte est le plus sémantiquement similaire à la requête « Trouver des emplacements dans un quartier marchable », exécutez le code SQL suivant :

SELECT id, description FROM listings
ORDER BY listing_vector <=> azure_openai.create_embeddings('{your-deployment-name}', 'Find me places in a walkable neighborhood.')::vector
LIMIT 3;

L’opérateur <=> calcule la distance de cosinus entre les deux vecteurs, la métrique de similarité sémantique. Plus les vecteurs sont rapprochés, plus la sémantique est similaire ; plus les vecteurs sont plus différents sémantiquement.

L’opérateur ::vector convertit les incorporations générées en tableaux de vecteurs PostgreSQL.

La requête retourne les trois premiers ID de liste et descriptions, classés de moins en moins différents (plus à moins similaires).