Créer des incorporations avec l’extension Azure AI
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.
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).