Share via


Démarrage rapide : converser des modèles Azure OpenAI à l’aide de vos propres données

Référence | Code source | Package (pypi) | Exemples

Les liens ci-dessus font référence à l’API OpenAI pour Python. Il n’existe aucun kit de développement logiciel (SDK) Python OpenAI spécifique à Azure. Découvrez comment basculer entre les services OpenAI et les services Azure OpenAI.

Dans ce guide de démarrage rapide, vous pouvez utiliser vos propres données avec des modèles Azure OpenAI. L’utilisation des modèles Azure OpenAI sur vos données peut vous fournir une puissante plateforme d’IA conversationnelle qui permet une communication plus rapide et plus précise.

Prérequis

Ajouter vos données à l’aide d’Azure OpenAI Studio

Conseil

Vous pouvez utiliser l’interface cli pour développeurs Azure pour créer par programmation les ressources nécessaires à Azure OpenAI sur vos données

Accédez à Azure OpenAI Studio et connectez-vous avec les informations d’identification qui ont accès à votre ressource Azure OpenAI. Pendant ou après le flux de travail de connexion, sélectionnez le répertoire approprié, l’abonnement Azure et la ressource Azure OpenAI.

  1. Sélectionnez la vignette Apporter vos propres données

    Capture d’écran de la page d’accueil d’Azure OpenAI Studio.

  2. Dans le volet qui s’affiche, sélectionnez Charger des fichiers (préversion) sous Sélectionner une source de données. Azure OpenAI a besoin à la fois d’une ressource de stockage et d’une ressource de recherche pour accéder à vos données et les indexer.

    Conseil

    1. Pour qu’Azure OpenAI accède à votre compte de stockage, vous devez activer le partage des ressources cross-origin (CORS). Si CORS n’est pas déjà activé pour la ressource Stockage Blob Azure, sélectionnez Activer CORS.

    2. Sélectionnez votre ressource Recherche Azure AI, puis sélectionnez l’acceptation que la connexion à celle-ci entraînera une utilisation sur votre compte. Sélectionnez ensuite Suivant.

    Capture d’écran des options de sélection d’une source de données dans Azure OpenAI Studio.

  3. Dans le volet Charger des fichiers, sélectionnez Rechercher un fichier et sélectionnez les fichiers que vous avez téléchargés dans la section Conditions préalables, ou vos propres données. Sélectionnez ensuite Charger des fichiers. Sélectionnez ensuite Suivant.

  4. Dans le volet Gestion des données, vous pouvez choisir d’activer la recherche sémantique ou la recherche vectorielle pour votre index.

    Important

    • La recherche sémantique et la recherche vectorielle sont soumises à une tarification supplémentaire. Vous devez choisir Référence SKU de base ou supérieure pour activer la recherche sémantique ou la recherche vectorielle. Pour plus d’informations, consultez Différences de niveau tarifaire et limites de service.
    • Afin d’améliorer la qualité de la récupération des informations et de la réponse du modèle, nous vous recommandons d’activer la recherche sémantique pour les langues de source de données suivantes : anglais, français, espagnol, portugais, italien, allemand, chinois (zh), japonais, coréen, russe et arabe.
  5. Vérifiez les détails saisis et sélectionnez Save and close (Enregistrer et fermer). Vous pouvez maintenant converser avec le modèle et il utilisera les informations de vos données pour construire la réponse.

Terrain de jeu de conversation

Commencez à explorer les fonctionnalités Azure OpenAI avec une approche sans code au moyen du terrain de jeu de conversation. Il s’agit simplement d’une zone de texte dans laquelle vous pouvez envoyer une invite pour générer une saisie semi-automatique. À partir de cette page, vous pouvez rapidement itérer et expérimenter les fonctionnalités.

Capture d’écran de la page du terrain de jeu de Azure OpenAI Studio avec les sections en surbrillance.

Le terrain de jeu vous offre des options pour personnaliser votre expérience de conversation. À droite, vous pouvez sélectionner Déploiement pour déterminer quel modèle génère une réponse à l’aide des résultats de la recherche de votre index. Vous choisissez le nombre de messages passés à inclure comme historique des conversations pour les réponses générées ultérieurement. L’historique des conversations apporte un contexte pour générer des réponses associées, mais consomme également l’utilisation des jetons. L’indicateur de progression du jeton d’entrée effectue le suivi du nombre de jetons de la question que vous envoyez.

Les paramètres avancés à gauche sont des paramètres de runtime, qui vous permettent de contrôler la récupération et la recherche d’informations pertinentes à partir de vos données. Un bon cas d’usage est lorsque vous souhaitez vous assurer que les réponses sont générées uniquement en fonction de vos données ou lorsque vous trouvez que le modèle ne peut pas générer une réponse en fonction des informations existantes sur vos données.

  • La rigueur détermine l'agressivité du système dans le filtrage des documents de recherche en fonction de leurs scores de similarité. La définition de la rigueur sur 5 indique que le système filtrera agressivement les documents, en appliquant un seuil de similarité très élevé. La recherche sémantique peut être utile dans ce scénario, car les modèles de classement effectuent mieux l’interprétation de l’intention de la requête. Les niveaux de rigueur inférieurs produisent des réponses plus détaillées, mais peuvent également inclure des informations qui ne figurent pas dans votre index. Cette valeur est définie sur 3 par défaut.

  • Documents récupérés est un nombre entier qui peut être défini sur 3, 5, 10 ou 20. Il contrôle le nombre de blocs de documents fournis au grand modèle de langage pour formuler la réponse finale. Par défaut, elle a la valeur 5.

  • Lorsque Limiter les réponses à vos données est activée, le modèle tente de s’appuyer uniquement sur vos documents pour les réponses. Cette valeur est définie sur true par défaut.

Capture d’écran des paramètres avancés.

Envoyez votre première requête. Les modèles de conversation sont le plus performants dans les exercices de questions et réponses. Par exemple, « Quels sont mes plans d’intégrité disponibles ? » ou « Qu’est-ce que l’option Health plus ? ».

Les requêtes qui nécessitent une analyse des données échouent probablement, telles que « Quel plan d’intégrité est le plus populaire ? ». Les requêtes qui nécessitent des informations sur toutes vos données échoueront également, telles que « Combien de documents ai-je chargé ? ». N’oubliez pas que le moteur de recherche mène une recherche des segments ayant des termes, expressions ou construction exacts ou similaires à la requête. Et bien que le modèle puisse comprendre la question, si les résultats de la recherche sont des blocs du jeu de données, ce ne sont pas les bonnes informations pour répondre à ce type de question.

Les conversations sont limitées par le nombre de documents (blocs) retournés dans la réponse (limite de 3 à 20 dans le terrain de jeu Azure OpenAI Studio). Comme vous pouvez l’imaginer, poser une question sur « tous les titres » nécessite une analyse complète de l’intégralité du magasin vectoriel.

Déployer votre modèle

Une fois satisfait de votre expérience dans Azure OpenAI Studio, vous pouvez déployer une application web directement à partir de Studio en sélectionnant le bouton Déployer sur.

Capture d’écran montrant le bouton de déploiement du modèle dans Azure OpenAI Studio.

Cela vous donne la possibilité de déployer sur une application web autonome ou un copilote dans Copilot Studio (préversion) si vous utilisez vos propres données sur le modèle.

Si vous choisissez par exemple de déployer une application web :

La première fois que vous déployez une application web, vous devez sélectionner Créer une application web. Choisissez un nom pour l’application, qui fera partie de l’URL de l’application. Par exemple : https://<appname>.azurewebsites.net.

Sélectionnez votre abonnement, votre groupe de ressources, votre emplacement et votre plan tarifaire pour l’application publiée. Pour mettre à jour une application existante, sélectionnez Publier sur une application web existante, puis choisissez le nom de votre application précédente dans le menu déroulant.

Si vous choisissez de déployer une application web, consultez les Points importants à prendre en compte pour son utilisation.

Récupérer les variables requises

Pour effectuer un appel sur Azure OpenAI, vous aurez besoin des variables suivantes. Ce guide de démarrage rapide suppose que vous avez chargé vos données dans un compte de stockage d’objets blob Azure et que vous avez créé un index Recherche Azure AI. Consultez Ajouter vos données à l’aide d’Azure AI Studio.

Nom de la variable Valeur
AZURE_OPENAI_ENDPOINT Cette valeur se trouve dans la section Clés et point de terminaison quand vous examinez votre ressource Azure OpenAI à partir du portail Azure. Vous pouvez également trouver la valeur dans Azure AI Studio>Terrain de jeu de conversation>Mode Code. Voici un exemple de point de terminaison : https://my-resoruce.openai.azure.com.
AZURE_OPENAI_API_KEY Cette valeur se trouve dans la section Gestion des ressources>Clés et points de terminaison quand vous examinez votre ressource Azure OpenAI depuis le portail Azure. Vous pouvez utiliser soit KEY1, soit KEY2. Avoir toujours deux clés vous permet de faire pivoter et de régénérer en toute sécurité les clés sans provoquer d’interruption de service.
AZURE_OPENAI_DEPLOYMENT_ID Cette valeur correspond au nom personnalisé que vous avez choisi pour votre déploiement lorsque vous avez déployé un modèle. Cette valeur se trouve sous Gestion des ressources>Déploiements dans le portail Microsoft Azure ou sousGestion>Déploiements dans Azure AI Studio.
AZURE_AI_SEARCH_ENDPOINT Cette valeur se trouve dans la section Vue d’ensemble quand vous examinez votre ressource Recherche Azure AI à partir du Portail Azure.
AZURE_AI_SEARCH_API_KEY Cette valeur se trouve dans la section Paramètres>Clés quand vous examinez votre ressource Recherche Azure AI à partir du Portail Azure. Vous pouvez utiliser la clé d’administration primaire ou secondaire. Avoir toujours deux clés vous permet de faire pivoter et de régénérer en toute sécurité les clés sans provoquer d’interruption de service.
AZURE_AI_SEARCH_INDEX Cette valeur correspond au nom de l’index que vous avez créé pour stocker vos données. Vous le trouverez dans la section Vue d’ensemble lors de l’examen de votre ressource Recherche Azure AI à partir du Portail Azure.

Variables d'environnement

setx AZURE_OPENAI_ENDPOINT REPLACE_WITH_YOUR_AOAI_ENDPOINT_VALUE_HERE
setx AZURE_OPENAI_API_KEY REPLACE_WITH_YOUR_AOAI_KEY_VALUE_HERE
setx AZURE_OPENAI_DEPLOYMENT_ID REPLACE_WITH_YOUR_AOAI_DEPLOYMENT_VALUE_HERE
setx AZURE_AI_SEARCH_ENDPOINT REPLACE_WITH_YOUR_AZURE_SEARCH_RESOURCE_VALUE_HERE
setx AZURE_AI_SEARCH_API_KEY REPLACE_WITH_YOUR_AZURE_SEARCH_RESOURCE_KEY_VALUE_HERE
setx AZURE_AI_SEARCH_INDEX REPLACE_WITH_YOUR_INDEX_NAME_HERE

Créez une application .NET Core

Dans une fenêtre de console (par exemple cmd, PowerShell ou Bash), utilisez la commande dotnet new pour créer une application console avec le nom azure-openai-quickstart. Cette commande crée un projet « Hello World » simple avec un seul fichier source C# : Program.cs.

dotnet new console -n azure-openai-quickstart

Déplacez vos répertoires vers le dossier d’application nouvellement créé. Vous pouvez générer l’application avec :

dotnet build

La sortie de génération ne doit contenir aucun avertissement ni erreur.

...
Build succeeded.
 0 Warning(s)
 0 Error(s)
...

Installez la bibliothèque de client .NET OpenAI avec :

dotnet add package Azure.AI.OpenAI --prerelease

À partir du répertoire du projet, ouvrez le fichier Program.cs et remplacez le contenu par le code suivant :

Sans diffusion en continu de réponse

using Azure;
using Azure.AI.OpenAI;
using System.Text.Json;
using static System.Environment;

string azureOpenAIEndpoint = GetEnvironmentVariable("AZURE_OPENAI_ENDPOINT");
string azureOpenAIKey = GetEnvironmentVariable("AZURE_OPENAI_API_KEY");
string deploymentName = GetEnvironmentVariable("AZURE_OPENAI_DEPLOYMENT_ID");
string searchEndpoint = GetEnvironmentVariable("AZURE_AI_SEARCH_ENDPOINT");
string searchKey = GetEnvironmentVariable("AZURE_AI_SEARCH_API_KEY");
string searchIndex = GetEnvironmentVariable("AZURE_AI_SEARCH_INDEX");


var client = new OpenAIClient(new Uri(azureOpenAIEndpoint), new AzureKeyCredential(azureOpenAIKey));

var chatCompletionsOptions = new ChatCompletionsOptions()
{
    Messages =
    {
        new ChatRequestUserMessage("What are my available health plans?"),
    },
    AzureExtensionsOptions = new AzureChatExtensionsOptions()
    {
        Extensions =
        {
            new AzureCognitiveSearchChatExtensionConfiguration()
            {
                SearchEndpoint = new Uri(searchEndpoint),
                Key = searchKey,
                IndexName = searchIndex,
            },
        }
    },
    DeploymentName = deploymentName
};

Response<ChatCompletions> response = client.GetChatCompletions(chatCompletionsOptions);

ChatResponseMessage responseMessage = response.Value.Choices[0].Message;

Console.WriteLine($"Message from {responseMessage.Role}:");
Console.WriteLine("===");
Console.WriteLine(responseMessage.Content);
Console.WriteLine("===");

Console.WriteLine($"Context information (e.g. citations) from chat extensions:");
Console.WriteLine("===");
foreach (ChatResponseMessage contextMessage in responseMessage.AzureExtensionsContext.Messages)
{
    string contextContent = contextMessage.Content;
    try
    {
        var contextMessageJson = JsonDocument.Parse(contextMessage.Content);
        contextContent = JsonSerializer.Serialize(contextMessageJson, new JsonSerializerOptions()
        {
            WriteIndented = true,
        });
    }
    catch (JsonException)
    {}
    Console.WriteLine($"{contextMessage.Role}: {contextContent}");
}
Console.WriteLine("===");

Important

Pour la production, utilisez un moyen sécurisé de stocker et d’accéder à vos informations d’identification comme Azure Key Vault. Pour plus d’informations sur la sécurité des informations d’identification, consultez l’article de sécurité Azure AI services.

dotnet run program.cs

Output

Answer from assistant:
===
The available health plans in the Contoso Electronics plan and benefit packages are the Northwind Health Plus and Northwind Standard plans [^1^].
===
Context information (e.g. citations) from chat extensions:
===
tool: {
  "citations": [
    {
      "content": "...",
      "id": null,
      "title": "...",
      "filepath": "...",
      "url": "...",
      "metadata": {
        "chunking": "orignal document size=1011. Scores=3.6390076 and None.Org Highlight count=38."
      },
      "chunk_id": "2"
    },
    ...
  ],
  "intent": "[\u0022What are my available health plans?\u0022]"
}
===

Cela attendra que le modèle ait généré l’intégralité de sa réponse avant d’imprimer les résultats. Par ailleurs, si vous souhaitez diffuser la réponse en continu de manière asynchrone et imprimer les résultats, vous pouvez remplacer le contenu de Program.cs par le code de l’exemple suivant.

Diffusion asynchrone en continu

using Azure;
using Azure.AI.OpenAI;
using System.Text.Json;
using static System.Environment;

string azureOpenAIEndpoint = GetEnvironmentVariable("AZURE_OPENAI_ENDPOINT");
string azureOpenAIKey = GetEnvironmentVariable("AZURE_OPENAI_API_KEY");
string deploymentName = GetEnvironmentVariable("AZURE_OPENAI_DEPLOYMENT_ID");
string searchEndpoint = GetEnvironmentVariable("AZURE_AI_SEARCH_ENDPOINT");
string searchKey = GetEnvironmentVariable("AZURE_AI_SEARCH_API_KEY");
string searchIndex = GetEnvironmentVariable("AZURE_AI_SEARCH_INDEX");


var client = new OpenAIClient(new Uri(azureOpenAIEndpoint), new AzureKeyCredential(azureOpenAIKey));

var chatCompletionsOptions = new ChatCompletionsOptions()
{
    DeploymentName = deploymentName,
    Messages =
    {
        new ChatRequestUserMessage("What are my available health plans?"),
    },
    AzureExtensionsOptions = new AzureChatExtensionsOptions()
    {
        Extensions =
        {
            new AzureCognitiveSearchChatExtensionConfiguration()
            {
                SearchEndpoint = new Uri(searchEndpoint),
                Key = searchKey,
                IndexName = searchIndex,
            },
        }
    }
};
await foreach (StreamingChatCompletionsUpdate chatUpdate in client.GetChatCompletionsStreaming(chatCompletionsOptions))
{
    if (chatUpdate.Role.HasValue)
    {
        Console.Write($"{chatUpdate.Role.Value.ToString().ToUpperInvariant()}: ");
    }
    if (!string.IsNullOrEmpty(chatUpdate.ContentUpdate))
    {
        Console.Write(chatUpdate.ContentUpdate);
    }
}

Récupérer les variables requises

Pour effectuer un appel sur Azure OpenAI, vous aurez besoin des variables suivantes. Ce guide de démarrage rapide suppose que vous avez chargé vos données dans un compte de stockage d’objets blob Azure et que vous avez créé un index Recherche Azure AI. Pour plus d’informations, consultez Ajouter vos données à l’aide d’Azure AI Studio.

Nom de la variable Valeur
AZURE_OPENAI_ENDPOINT Vous trouverez cette valeur dans la section Clés et point de terminaison lors de l’examen de votre ressource Azure OpenAI à partir du portail Azure. Vous pouvez également trouver la valeur dans Azure AI Studio>Terrain de jeu de conversation>Mode Code. Voici un exemple de point de terminaison : https://my-resource.openai.azure.com.
AZURE_OPENAI_API_KEY Vous trouverez cette valeur dans Gestion des ressources>Clés et point de terminaison lors de l’examen de votre ressource Azure OpenAI à partir du portail Azure. Vous pouvez utiliser soit KEY1, soit KEY2. Avoir toujours deux clés vous permet de faire pivoter et de régénérer en toute sécurité les clés sans provoquer d’interruption de service.
AZURE_OPEN_AI_DEPLOYMENT_ID Cette valeur correspond au nom personnalisé que vous avez choisi pour votre déploiement lorsque vous avez déployé un modèle. Vous trouverez cette valeur sous Gestion des ressources>Déploiements dans le portail Azure ou sous Gestion>Déploiements dans Azure AI Studio.
AZURE_AI_SEARCH_ENDPOINT Vous trouverez cette valeur dans la section Vue d’ensemble lors de l’examen de votre ressource Recherche d’Azure AI à partir du portail Azure.
AZURE_AI_SEARCH_API_KEY Vous trouverez cette valeur dans la section Paramètres>Clés lors de l’examen de votre ressource Recherche d’Azure AI à partir du portail Azure. Vous pouvez utiliser la clé d’administration primaire ou secondaire. Avoir toujours deux clés vous permet de faire pivoter et de régénérer en toute sécurité les clés sans provoquer d’interruption de service.
AZURE_AI_SEARCH_INDEX Cette valeur correspond au nom de l’index que vous avez créé pour stocker vos données. Vous le trouverez dans la section Vue d’ensemble lors de l’examen de votre ressource Recherche Azure AI à partir du Portail Azure.

Variables d'environnement

Remarque

Spring AI affecte par défaut le nom du modèle à gpt-35-turbo. Il n’est nécessaire de fournir la valeur SPRING_AI_AZURE_OPENAI_MODEL que si vous avez déployé un modèle avec un autre nom.

export SPRING_AI_AZURE_OPENAI_ENDPOINT=REPLACE_WITH_YOUR_AOAI_ENDPOINT_VALUE_HERE
export SPRING_AI_AZURE_OPENAI_API_KEY=REPLACE_WITH_YOUR_AOAI_KEY_VALUE_HERE
export SPRING_AI_AZURE_COGNITIVE_SEARCH_ENDPOINT=REPLACE_WITH_YOUR_AZURE_SEARCH_RESOURCE_VALUE_HERE
export SPRING_AI_AZURE_COGNITIVE_SEARCH_API_KEY=REPLACE_WITH_YOUR_AZURE_SEARCH_RESOURCE_KEY_VALUE_HERE
export SPRING_AI_AZURE_COGNITIVE_SEARCH_INDEX=REPLACE_WITH_YOUR_INDEX_NAME_HERE
export SPRING_AI_AZURE_OPENAI_MODEL=REPLACE_WITH_YOUR_MODEL_NAME_HERE

Créer une application Spring

Spring AI ne prend actuellement pas en charge les options de AzureCognitiveSearchChatExtensionConfiguration qui permettent à une requête Azure AI d’encapsuler la méthode Récupération augmentée (RAG) et de masquer les détails de l’utilisateur. En guise d’alternative, vous pouvez toujours appeler la méthode RAG directement dans votre application pour interroger des données dans votre index Recherche Azure AI et utiliser des documents récupérés pour augmenter votre requête.

Spring AI prend en charge une abstraction VectorStore, et vous pouvez encapsuler Recherche Azure AI dans une implémentation Spring AI VectorStore pour interroger vos données personnalisées. Le projet suivant implémente un VectorStore personnalisé soutenu par Recherche Azure AI et exécute directement des opérations RAG.

Dans une fenêtre Bash, créez un répertoire pour votre application et accédez-y.

mkdir ai-custom-data-demo && cd ai-custom-data-demo

Exécutez la commande spring init à partir de votre répertoire de travail. Cette commande crée une structure de répertoires standard pour votre projet Spring, y compris le fichier source de classe Java principal et le fichier pom.xml utilisé pour la gestion des projets Maven.

spring init -a ai-custom-data-demo -n AICustomData --force --build maven -x

Les fichiers et dossiers générés ressemblent à la structure suivante :

ai-custom-data-demo/
|-- pom.xml
|-- mvn
|-- mvn.cmd
|-- HELP.md
|-- src/
    |-- main/
    |   |-- resources/
    |   |   |-- application.properties
    |   |-- java/
    |       |-- com/
    |           |-- example/
    |               |-- aicustomdatademo/
    |                   |-- AiCustomDataApplication.java
    |-- test/
        |-- java/
            |-- com/
                |-- example/
                    |-- aicustomdatademo/
                        |-- AiCustomDataApplicationTests.java

Modifier l’application Spring

  1. Modifiez le fichier pom.xml.

    À partir de la racine du répertoire du projet, ouvrez le fichier pom.xml dans votre éditeur ou IDE préféré et remplacez le fichier par le contenu suivant :

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>3.2.0</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
        <groupId>com.example</groupId>
        <artifactId>ai-custom-data-demo</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <name>AICustomData</name>
        <description>Demo project for Spring Boot</description>
        <properties>
            <java.version>17</java.version>
        </properties>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.experimental.ai</groupId>
                <artifactId>spring-ai-azure-openai-spring-boot-starter</artifactId>
                <version>0.7.0-SNAPSHOT</version>
            </dependency>
            <dependency>
                <groupId>com.azure</groupId>
                <artifactId>azure-search-documents</artifactId>
                <version>11.6.0-beta.10</version>
                <exclusions>
                    <!-- exclude this to avoid changing the default serializer and the null-value behavior -->
                    <exclusion>
                        <groupId>com.azure</groupId>
                        <artifactId>azure-core-serializer-json-jackson</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <optional>true</optional>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
        </dependencies>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
        <repositories>
            <repository>
                <id>spring-snapshots</id>
                <name>Spring Snapshots</name>
                <url>https://repo.spring.io/snapshot</url>
                <releases>
                    <enabled>false</enabled>
                </releases>
            </repository>
        </repositories>
    </project>
    
  2. À partir du dossier src/main/java/com/example/aicustomdatademo , ouvrez AiCustomDataApplication.java dans votre éditeur ou IDE préféré et collez le code suivant :

    package com.example.aicustomdatademo;
    
    import java.util.Collections;
    import java.util.List;
    import java.util.Map;
    import java.util.Optional;
    import java.util.stream.Collectors;
    
    import org.springframework.ai.client.AiClient;
    import org.springframework.ai.document.Document;
    import org.springframework.ai.embedding.EmbeddingClient;
    import org.springframework.ai.prompt.Prompt;
    import org.springframework.ai.prompt.SystemPromptTemplate;
    import org.springframework.ai.prompt.messages.MessageType;
    import org.springframework.ai.prompt.messages.UserMessage;
    import org.springframework.ai.vectorstore.VectorStore;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.boot.CommandLineRunner;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.context.annotation.Bean;
    
    import com.azure.core.credential.AzureKeyCredential;
    import com.azure.core.util.Context;
    import com.azure.search.documents.SearchClient;
    import com.azure.search.documents.SearchClientBuilder;
    import com.azure.search.documents.models.IndexingResult;
    import com.azure.search.documents.models.SearchOptions;
    import com.azure.search.documents.models.RawVectorQuery;
    
    import lombok.AllArgsConstructor;
    import lombok.NoArgsConstructor;
    import lombok.Builder;
    import lombok.Data;
    import lombok.extern.jackson.Jacksonized;
    
    @SpringBootApplication
    public class AiCustomDataApplication implements CommandLineRunner
    {
        private static final String ROLE_INFO_KEY = "role";
    
        private static final String template = """
                You are a helpful assistant. Use the information from the DOCUMENTS section to augment answers.
    
                DOCUMENTS:
                {documents}
                """;
    
        @Value("${spring.ai.azure.cognitive-search.endpoint}")
        private String acsEndpoint;
    
        @Value("${spring.ai.azure.cognitive-search.api-key}")
        private String acsApiKey;
    
        @Value("${spring.ai.azure.cognitive-search.index}")
        private String acsIndexName;
    
        @Autowired
        private AiClient aiClient;
    
        @Autowired
        private EmbeddingClient embeddingClient;
    
        public static void main(String[] args) {
            SpringApplication.run(AiCustomDataApplication.class, args);
        }
    
        @Override
        public void run(String... args) throws Exception
        {
            System.out.println(String.format("Sending custom data prompt to AI service. One moment please...\r\n"));
    
            final var store = vectorStore(embeddingClient);
    
            final String question = "What are my available health plans?";
    
            final var candidateDocs = store.similaritySearch(question);
    
            final var userMessage = new UserMessage(question);
    
            final String docPrompts =
                    candidateDocs.stream().map(entry -> entry.getContent()).collect(Collectors.joining("\n"));
    
            final SystemPromptTemplate promptTemplate = new SystemPromptTemplate(template);
            final var systemMessage = promptTemplate.createMessage(Map.of("documents", docPrompts));
    
            final var prompt = new Prompt(List.of(systemMessage, userMessage));
    
            final var resps = aiClient.generate(prompt);
    
            System.out.println(String.format("Prompt created %d generated response(s).", resps.getGenerations().size()));
    
            resps.getGenerations().stream()
              .forEach(gen -> {
                  final var role = gen.getInfo().getOrDefault(ROLE_INFO_KEY, MessageType.ASSISTANT.getValue());
    
                  System.out.println(String.format("Generated respose from \"%s\": %s", role, gen.getText()));
              });
    
        }
    
        @Bean
        public VectorStore vectorStore(EmbeddingClient embeddingClient)
        {
            final SearchClient searchClient = new SearchClientBuilder()
                    .endpoint(acsEndpoint)
                    .credential(new AzureKeyCredential(acsApiKey))
                    .indexName(acsIndexName)
                    .buildClient();
            return new AzureCognitiveSearchVectorStore(searchClient, embeddingClient);
        }
    
        public static class AzureCognitiveSearchVectorStore implements VectorStore
        {
            private static final int DEFAULT_TOP_K = 4;
    
            private static final Double DEFAULT_SIMILARITY_THRESHOLD = 0.0;
    
            private SearchClient searchClient;
    
            private final EmbeddingClient embeddingClient;
    
            public AzureCognitiveSearchVectorStore(SearchClient searchClient, EmbeddingClient embeddingClient)
            {
                this.searchClient = searchClient;
                this.embeddingClient = embeddingClient;
            }
    
            @Override
            public void add(List<Document> documents)
            {
                final var docs = documents.stream().map(document -> {
    
                    final var embeddings = embeddingClient.embed(document);
    
                    return new DocEntry(document.getId(), "", document.getContent(), embeddings);
    
                }).toList();
    
                searchClient.uploadDocuments(docs);
            }
    
            @Override
            public Optional<Boolean> delete(List<String> idList)
            {
                final List<DocEntry> docIds = idList.stream().map(id -> DocEntry.builder().id(id).build())
                    .toList();
    
                var results = searchClient.deleteDocuments(docIds);
    
                boolean resSuccess = true;
    
                for (IndexingResult result : results.getResults())
                    if (!result.isSucceeded()) {
                        resSuccess = false;
                        break;
                    }
    
                return Optional.of(resSuccess);
            }
    
            @Override
            public List<Document> similaritySearch(String query)
            {
                return similaritySearch(query, DEFAULT_TOP_K);
            }
    
            @Override
            public List<Document> similaritySearch(String query, int k)
            {
                return similaritySearch(query, k, DEFAULT_SIMILARITY_THRESHOLD);
            }
    
            @Override
            public List<Document> similaritySearch(String query, int k, double threshold)
            {
                final var searchQueryVector = new RawVectorQuery()
                        .setVector(toFloatList(embeddingClient.embed(query)))
                        .setKNearestNeighborsCount(k)
                        .setFields("contentVector");
    
                final var searchResults = searchClient.search(null,
                        new SearchOptions().setVectorQueries(searchQueryVector), Context.NONE);
    
                return searchResults.stream()
                        .filter(r -> r.getScore() >= threshold)
                        .map(r -> {
    
                            final DocEntry entry = r.getDocument(DocEntry.class);
    
                            final Document doc = new Document(entry.getId(), entry.getContent(), Collections.emptyMap());
                            doc.setEmbedding(entry.getContentVector());
    
                            return doc;
                        })
                        .collect(Collectors.toList());
            }
    
            private List<Float> toFloatList(List<Double> doubleList)
            {
                return doubleList.stream().map(Double::floatValue).toList();
            }
    
        }
    
        @Data
        @Builder
        @Jacksonized
        @AllArgsConstructor
        @NoArgsConstructor
        static class DocEntry
        {
            private String id;
    
            private String hash;
    
            private String content;
    
            private List<Double> contentVector;
        }
    
    }
    

    Important

    Pour la production, utilisez un moyen sécurisé de stocker et d’accéder à vos informations d’identification comme Azure Key Vault. Pour plus d’informations sur la sécurité des informations d’identification, consultez l’article de sécurité Azure AI services.

  3. Revenez au dossier racine du projet et exécutez l’application à l’aide de la commande suivante :

    ./mvnw spring-boot:run
    

Sortie

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::                (v3.1.5)

2023-11-07T14:40:45.250-06:00  INFO 18557 --- [           main] c.e.a.AiCustomDataApplication            : No active profile set, falling back to 1 default profile: "default"
2023-11-07T14:40:46.035-06:00  INFO 18557 --- [           main] c.e.a.AiCustomDataApplication            : Started AiCustomDataApplication in 1.095 seconds (process running for 1.397)
Sending custom data prompt to AI service. One moment please...

Prompt created 1 generated response(s).
Generated response from "assistant": The available health plans in the Contoso Electronics plan and benefit packages are the Northwind Health Plus and Northwind Standard plans.

Récupérer les variables requises

Pour effectuer un appel sur Azure OpenAI, vous aurez besoin des variables suivantes. Ce guide de démarrage rapide suppose que vous avez chargé vos données dans un compte de stockage d’objets blob Azure et que vous avez créé un index Recherche Azure AI. Consultez Ajouter vos données à l’aide d’Azure AI Studio.

Nom de la variable Valeur
AZURE_OPENAI_ENDPOINT Cette valeur se trouve dans la section Clés et point de terminaison quand vous examinez votre ressource Azure OpenAI à partir du portail Azure. Vous pouvez également trouver la valeur dans Azure AI Studio>Terrain de jeu de conversation>Mode Code. Voici un exemple de point de terminaison : https://my-resoruce.openai.azure.com.
AZURE_OPENAI_API_KEY Cette valeur se trouve dans la section Gestion des ressources>Clés et points de terminaison quand vous examinez votre ressource Azure OpenAI depuis le portail Azure. Vous pouvez utiliser soit KEY1, soit KEY2. Avoir toujours deux clés vous permet de faire pivoter et de régénérer en toute sécurité les clés sans provoquer d’interruption de service.
AZURE_OPENAI_DEPLOYMENT_ID Cette valeur correspond au nom personnalisé que vous avez choisi pour votre déploiement lorsque vous avez déployé un modèle. Cette valeur se trouve sous Gestion des ressources>Déploiements dans le portail Microsoft Azure ou sousGestion>Déploiements dans Azure AI Studio.
AZURE_AI_SEARCH_ENDPOINT Cette valeur se trouve dans la section Vue d’ensemble quand vous examinez votre ressource Recherche Azure AI à partir du Portail Azure.
AZURE_AI_SEARCH_API_KEY Cette valeur se trouve dans la section Paramètres>Clés quand vous examinez votre ressource Recherche Azure AI à partir du Portail Azure. Vous pouvez utiliser la clé d’administration primaire ou secondaire. Avoir toujours deux clés vous permet de faire pivoter et de régénérer en toute sécurité les clés sans provoquer d’interruption de service.
AZURE_AI_SEARCH_INDEX Cette valeur correspond au nom de l’index que vous avez créé pour stocker vos données. Vous le trouverez dans la section Vue d’ensemble lors de l’examen de votre ressource Recherche Azure AI à partir du Portail Azure.

Variables d'environnement

setx AZURE_OPENAI_ENDPOINT REPLACE_WITH_YOUR_AOAI_ENDPOINT_VALUE_HERE
setx AZURE_OPENAI_API_KEY REPLACE_WITH_YOUR_AOAI_KEY_VALUE_HERE
setx AZURE_OPENAI_DEPLOYMENT_ID REPLACE_WITH_YOUR_AOAI_DEPLOYMENT_VALUE_HERE
setx AZURE_AI_SEARCH_ENDPOINT REPLACE_WITH_YOUR_AZURE_SEARCH_RESOURCE_VALUE_HERE
setx AZURE_AI_SEARCH_API_KEY REPLACE_WITH_YOUR_AZURE_SEARCH_RESOURCE_KEY_VALUE_HERE
setx AZURE_AI_SEARCH_INDEX REPLACE_WITH_YOUR_INDEX_NAME_HERE

Créer une application Node

Dans une fenêtre de console (telle que cmd, PowerShell ou bash), créez un répertoire pour votre application et accédez-y. Exécutez ensuite la commande npm init pour créer une application de nœud avec un fichier package.json.

npm init

Installer la bibliothèque de client

Installez le client Azure OpenAI et les bibliothèques d’identités Azure pour JavaScript avec npm :

npm install @azure/openai @azure/identity

Le fichier package.json de votre application sera mis à jour avec les dépendances.

Créer un exemple d’application

Ouvrez une invite de commandes à l’emplacement où vous souhaitez placer le nouveau projet, puis créez un fichier nommé ChatWithOwnData.js. Copiez le code suivant dans le fichier ChatWithOwnData.js.

const { OpenAIClient, AzureKeyCredential } = require("@azure/openai");

// Set the Azure and AI Search values from environment variables
const endpoint = process.env["AZURE_OPENAI_ENDPOINT"];
const azureApiKey = process.env["AZURE_OPENAI_API_KEY"];
const deploymentId = process.env["AZURE_OPENAI_DEPLOYMENT_ID"];
const searchEndpoint = process.env["AZURE_AI_SEARCH_ENDPOINT"];
const searchKey = process.env["AZURE_AI_SEARCH_API_KEY"];
const searchIndex = process.env["AZURE_AI_SEARCH_INDEX"];


async function main(){
  const client = new OpenAIClient(endpoint, new AzureKeyCredential(azureApiKey));

  const messages = [
    { role: "user", content: "What are my available health plans?" },
  ];

  console.log(`Message: ${messages.map((m) => m.content).join("\n")}`);

  const events = await client.streamChatCompletions(deploymentId, messages, { 
    maxTokens: 128,
    azureExtensionOptions: {
      extensions: [
        {
          type: "AzureCognitiveSearch",
          endpoint: searchEndpoint,
          key: searchKey,
          indexName: searchIndex,
        },
      ],
    },
  });
  let response = "";
  for await (const event of events) {
    for (const choice of event.choices) {
      const newText = choice.delta?.content;
      if (!!newText) {
        response += newText;
        // To see streaming results as they arrive, uncomment line below
        // console.log(newText);
      }
    }
  }
  console.log(response);
}

main().catch((err) => {
  console.error("The sample encountered an error:", err);
});



module.exports = { main };

Important

Pour la production, utilisez un moyen sécurisé de stocker et d’accéder à vos informations d’identification comme Azure Key Vault. Pour plus d’informations sur la sécurité des informations d’identification, consultez l’article de sécurité Azure AI services.

node.exe ChatWithOwnData.js

Sortie

Message: What are my available health plans?
The available health plans in the Contoso Electronics plan and benefit packages are the Northwind Health Plus and Northwind Standard plans.

Récupérer les variables requises

Pour effectuer un appel sur Azure OpenAI, vous aurez besoin des variables suivantes. Ce guide de démarrage rapide suppose que vous avez chargé vos données dans un compte de stockage d’objets blob Azure et que vous avez créé un index Recherche Azure AI. Consultez Ajouter vos données à l’aide d’Azure AI Studio.

Nom de la variable Valeur
AZURE_OPENAI_ENDPOINT Cette valeur se trouve dans la section Clés et point de terminaison quand vous examinez votre ressource Azure OpenAI à partir du portail Azure. Vous pouvez également trouver la valeur dans Azure AI Studio>Terrain de jeu de conversation>Mode Code. Voici un exemple de point de terminaison : https://my-resoruce.openai.azure.com.
AZURE_OPENAI_API_KEY Cette valeur se trouve dans la section Gestion des ressources>Clés et points de terminaison quand vous examinez votre ressource Azure OpenAI depuis le portail Azure. Vous pouvez utiliser soit KEY1, soit KEY2. Avoir toujours deux clés vous permet de faire pivoter et de régénérer en toute sécurité les clés sans provoquer d’interruption de service.
AZURE_OPENAI_DEPLOYMENT_ID Cette valeur correspond au nom personnalisé que vous avez choisi pour votre déploiement lorsque vous avez déployé un modèle. Cette valeur se trouve sous Gestion des ressources>Déploiements dans le portail Microsoft Azure ou sousGestion>Déploiements dans Azure AI Studio.
AZURE_AI_SEARCH_ENDPOINT Cette valeur se trouve dans la section Vue d’ensemble quand vous examinez votre ressource Recherche Azure AI à partir du Portail Azure.
AZURE_AI_SEARCH_API_KEY Cette valeur se trouve dans la section Paramètres>Clés quand vous examinez votre ressource Recherche Azure AI à partir du Portail Azure. Vous pouvez utiliser la clé d’administration primaire ou secondaire. Avoir toujours deux clés vous permet de faire pivoter et de régénérer en toute sécurité les clés sans provoquer d’interruption de service.
AZURE_AI_SEARCH_INDEX Cette valeur correspond au nom de l’index que vous avez créé pour stocker vos données. Vous le trouverez dans la section Vue d’ensemble lors de l’examen de votre ressource Recherche Azure AI à partir du Portail Azure.

Variables d'environnement

setx AZURE_OPENAI_ENDPOINT REPLACE_WITH_YOUR_AOAI_ENDPOINT_VALUE_HERE
setx AZURE_OPENAI_API_KEY REPLACE_WITH_YOUR_AOAI_KEY_VALUE_HERE
setx AZURE_OPENAI_DEPLOYMENT_ID REPLACE_WITH_YOUR_AOAI_DEPLOYMENT_VALUE_HERE
setx AZURE_AI_SEARCH_ENDPOINT REPLACE_WITH_YOUR_AZURE_SEARCH_RESOURCE_VALUE_HERE
setx AZURE_AI_SEARCH_API_KEY REPLACE_WITH_YOUR_AZURE_SEARCH_RESOURCE_KEY_VALUE_HERE
setx AZURE_AI_SEARCH_INDEX REPLACE_WITH_YOUR_INDEX_NAME_HERE

Créer un environnement Python

  1. Créez un dossier nommé openai-python pour votre projet et un fichier de code Python nommé main.py. Passez à ce répertoire :
mkdir openai-python
cd openai-python
  1. Installez les bibliothèques Python suivantes :
pip install openai
pip install python-dotenv

Créer l’application Python

  1. À partir du répertoire du projet, ouvrez le fichier main.py, puis ajoutez le code suivant :
import os
import openai
import dotenv

dotenv.load_dotenv()

endpoint = os.environ.get("AZURE_OPENAI_ENDPOINT")
api_key = os.environ.get("AZURE_OPENAI_API_KEY")
deployment = os.environ.get("AZURE_OPENAI_DEPLOYMENT_ID")

client = openai.AzureOpenAI(
    azure_endpoint=endpoint,
    api_key=api_key,
    api_version="2024-02-01",
)

completion = client.chat.completions.create(
    model=deployment,
    messages=[
        {
            "role": "user",
            "content": "What are my available health plans?",
        },
    ],
    extra_body={
        "data_sources":[
            {
                "type": "azure_search",
                "parameters": {
                    "endpoint": os.environ["AZURE_AI_SEARCH_ENDPOINT"],
                    "index_name": os.environ["AZURE_AI_SEARCH_INDEX"],
                    "authentication": {
                        "type": "api_key",
                        "key": os.environ["AZURE_AI_SEARCH_API_KEY"],
                    }
                }
            }
        ],
    }
)

print(completion.model_dump_json(indent=2))

Important

Pour la production, utilisez un moyen sécurisé de stocker et d’accéder à vos informations d’identification comme Azure Key Vault. Pour plus d’informations sur la sécurité des informations d’identification, consultez l’article de sécurité Azure AI services.

  1. Exécutez la commande suivante :
python main.py

L’application imprime la réponse dans un format JSON adapté à une utilisation dans de nombreux scénarios. Elle inclut les réponses à vos requêtes et citations de vos fichiers chargés.

Récupérer les variables requises

Pour effectuer un appel sur Azure OpenAI, vous aurez besoin des variables suivantes. Ce guide de démarrage rapide suppose que vous avez chargé vos données dans un compte de stockage d’objets blob Azure et que vous avez créé un index Recherche Azure AI. Consultez Ajouter vos données à l’aide d’Azure AI Studio.

Nom de la variable Valeur
AZURE_OPENAI_ENDPOINT Cette valeur se trouve dans la section Clés et point de terminaison quand vous examinez votre ressource Azure OpenAI à partir du portail Azure. Vous pouvez également trouver la valeur dans Azure AI Studio>Terrain de jeu de conversation>Mode Code. Voici un exemple de point de terminaison : https://my-resoruce.openai.azure.com.
AZURE_OPENAI_API_KEY Cette valeur se trouve dans la section Gestion des ressources>Clés et points de terminaison quand vous examinez votre ressource Azure OpenAI depuis le portail Azure. Vous pouvez utiliser soit KEY1, soit KEY2. Avoir toujours deux clés vous permet de faire pivoter et de régénérer en toute sécurité les clés sans provoquer d’interruption de service.
AZURE_OPENAI_DEPLOYMENT_ID Cette valeur correspond au nom personnalisé que vous avez choisi pour votre déploiement lorsque vous avez déployé un modèle. Cette valeur se trouve sous Gestion des ressources>Déploiements dans le portail Microsoft Azure ou sousGestion>Déploiements dans Azure AI Studio.
AZURE_AI_SEARCH_ENDPOINT Cette valeur se trouve dans la section Vue d’ensemble quand vous examinez votre ressource Recherche Azure AI à partir du Portail Azure.
AZURE_AI_SEARCH_API_KEY Cette valeur se trouve dans la section Paramètres>Clés quand vous examinez votre ressource Recherche Azure AI à partir du Portail Azure. Vous pouvez utiliser la clé d’administration primaire ou secondaire. Avoir toujours deux clés vous permet de faire pivoter et de régénérer en toute sécurité les clés sans provoquer d’interruption de service.
AZURE_AI_SEARCH_INDEX Cette valeur correspond au nom de l’index que vous avez créé pour stocker vos données. Vous le trouverez dans la section Vue d’ensemble lors de l’examen de votre ressource Recherche Azure AI à partir du Portail Azure.

Variables d'environnement

setx AZURE_OPENAI_ENDPOINT REPLACE_WITH_YOUR_AOAI_ENDPOINT_VALUE_HERE
setx AZURE_OPENAI_API_KEY REPLACE_WITH_YOUR_AOAI_KEY_VALUE_HERE
setx AZURE_OPENAI_DEPLOYMENT_ID REPLACE_WITH_YOUR_AOAI_DEPLOYMENT_VALUE_HERE
setx AZURE_AI_SEARCH_ENDPOINT REPLACE_WITH_YOUR_AZURE_SEARCH_RESOURCE_VALUE_HERE
setx AZURE_AI_SEARCH_API_KEY REPLACE_WITH_YOUR_AZURE_SEARCH_RESOURCE_KEY_VALUE_HERE
setx AZURE_AI_SEARCH_INDEX REPLACE_WITH_YOUR_INDEX_NAME_HERE

Exemples de commandes PowerShell

Les modèles Azure OpenAI sont optimisés pour fonctionner avec des entrées au format de conversation. La variable messages transmet un tableau de dictionnaires avec différents rôles dans la conversation délimités par système, utilisateur, outil et assistant. La variable dataSources se connecte à votre index Recherche cognitive Azure et permet aux modèles Azure OpenAI de répondre à l’aide de vos données.

Pour déclencher une réponse à partir du modèle, vous devez voir un message utilisateur indiquant que c’est au tour de l’assistant de répondre.

Conseil

Vous pouvez utiliser plusieurs paramètres pour modifier la réponse du modèle, comme temperature ou top_p. Pour plus d’informations, consultez la documentation de référence.

# Azure OpenAI metadata variables
   $openai = @{
       api_key     = $Env:AZURE_OPENAI_API_KEY
       api_base    = $Env:AZURE_OPENAI_ENDPOINT # your endpoint should look like the following https://YOUR_RESOURCE_NAME.openai.azure.com/
       api_version = '2023-07-01-preview' # this may change in the future
       name        = 'YOUR-DEPLOYMENT-NAME-HERE' #This will correspond to the custom name you chose for your deployment when you deployed a model.
   }

   $acs = @{
       search_endpoint     = 'YOUR ACS ENDPOINT' # your endpoint should look like the following https://YOUR_RESOURCE_NAME.search.windows.net/
       search_key    = 'YOUR-ACS-KEY-HERE' # or use the Get-Secret cmdlet to retrieve the value
       search_index = 'YOUR-INDEX-NAME-HERE' # the name of your ACS index
   }

   # Completion text
   $body = @{
    dataSources = @(
        @{
            type = 'AzureCognitiveSearch'
            parameters = @{
                    endpoint = $acs.search_endpoint
                    key = $acs.search_key
                    indexName = $acs.search_index
                }
        }
    )
    messages = @(
            @{
                role = 'user'
                content = 'What are my available health plans?'
            }
    )
   } | convertto-json -depth 5

   # Header for authentication
   $headers = [ordered]@{
       'api-key' = $openai.api_key
   }

   # Send a completion call to generate an answer
   $url = "$($openai.api_base)/openai/deployments/$($openai.name)/extensions/chat/completions?api-version=$($openai.api_version)"

   $response = Invoke-RestMethod -Uri $url -Headers $headers -Body $body -Method Post -ContentType 'application/json'
   return $response.choices.messages[1].content

Exemple de sortie

The available health plans in the Contoso Electronics plan and benefit packages are the Northwind Health Plus and Northwind Standard plans.

Important

Pour la production, utilisez un moyen sécurisé de stocker et d’accéder à vos informations d’identification, comme La gestion des secrets PowerShell dans Azure Key Vault. Pour plus d’informations sur la sécurité des informations d’identification, consultez l’article de sécurité Azure AI services.

Converser avec votre modèle à l’aide d’une application web

Pour commencer à discuter avec le modèle Azure OpenAI qui utilise vos données, vous pouvez déployer une application web en utilisant Azure OpenAI Studio ou l’exemple de code que nous fournissons sur GitHub. Cette application se déploie à l’aide d’Azure App Service et fournit une interface utilisateur pour l’envoi de requêtes. Cette application peut être utilisée des modèles Azure OpenAI qui utilisent vos données, ou des modèles qui n’utilisent pas vos données. Consultez le fichier lisez-moi dans le référentiel pour obtenir des instructions sur la configuration requise, l’installation et le déploiement. Vous pouvez éventuellement personnaliser la logique frontend et back-end de l’application web en modifiant le code source.

Récupérer les variables requises

Pour effectuer un appel sur Azure OpenAI, vous aurez besoin des variables suivantes. Ce guide de démarrage rapide suppose que vous avez chargé vos données dans un compte de stockage d’objets blob Azure et que vous avez créé un index Recherche Azure AI. Consultez Ajouter vos données à l’aide d’Azure AI Studio.

Nom de la variable Valeur
AZURE_OPENAI_ENDPOINT Cette valeur se trouve dans la section Clés et point de terminaison quand vous examinez votre ressource Azure OpenAI à partir du portail Azure. Vous pouvez également trouver la valeur dans Azure AI Studio>Terrain de jeu de conversation>Mode Code. Voici un exemple de point de terminaison : https://my-resoruce.openai.azure.com.
AZURE_OPENAI_API_KEY Cette valeur se trouve dans la section Gestion des ressources>Clés et points de terminaison quand vous examinez votre ressource Azure OpenAI depuis le portail Azure. Vous pouvez utiliser soit KEY1, soit KEY2. Avoir toujours deux clés vous permet de faire pivoter et de régénérer en toute sécurité les clés sans provoquer d’interruption de service.
AZURE_OPENAI_DEPLOYMENT_ID Cette valeur correspond au nom personnalisé que vous avez choisi pour votre déploiement lorsque vous avez déployé un modèle. Cette valeur se trouve sous Gestion des ressources>Déploiements dans le portail Microsoft Azure ou sousGestion>Déploiements dans Azure AI Studio.
AZURE_AI_SEARCH_ENDPOINT Cette valeur se trouve dans la section Vue d’ensemble quand vous examinez votre ressource Recherche Azure AI à partir du Portail Azure.
AZURE_AI_SEARCH_API_KEY Cette valeur se trouve dans la section Paramètres>Clés quand vous examinez votre ressource Recherche Azure AI à partir du Portail Azure. Vous pouvez utiliser la clé d’administration primaire ou secondaire. Avoir toujours deux clés vous permet de faire pivoter et de régénérer en toute sécurité les clés sans provoquer d’interruption de service.
AZURE_AI_SEARCH_INDEX Cette valeur correspond au nom de l’index que vous avez créé pour stocker vos données. Vous le trouverez dans la section Vue d’ensemble lors de l’examen de votre ressource Recherche Azure AI à partir du Portail Azure.

Variables d'environnement

setx AZURE_OPENAI_ENDPOINT REPLACE_WITH_YOUR_AOAI_ENDPOINT_VALUE_HERE
setx AZURE_OPENAI_API_KEY REPLACE_WITH_YOUR_AOAI_KEY_VALUE_HERE
setx AZURE_OPENAI_DEPLOYMENT_ID REPLACE_WITH_YOUR_AOAI_DEPLOYMENT_VALUE_HERE
setx AZURE_AI_SEARCH_ENDPOINT REPLACE_WITH_YOUR_AZURE_SEARCH_RESOURCE_VALUE_HERE
setx AZURE_AI_SEARCH_API_KEY REPLACE_WITH_YOUR_AZURE_SEARCH_RESOURCE_KEY_VALUE_HERE
setx AZURE_AI_SEARCH_INDEX REPLACE_WITH_YOUR_INDEX_NAME_HERE

Créer un environnement Go

  1. Créez un dossier nommé openai-go pour votre projet et un fichier de code Go nommé sample.go. Passez à ce répertoire :

    mkdir openai-go
    cd openai-go
    
  2. Installez les packages Go suivants :

    go get github.com/Azure/azure-sdk-for-go/sdk/ai/azopenai
    
  3. Activez le suivi des dépendances pour votre code.

    go mod init example/azure-openai
    

Créer l’application Go

  1. Dans le répertoire du projet, ouvrez le fichier sample.go et ajoutez le code suivant :

    package main
    
    import (
     "context"
     "fmt"
     "log"
     "os"
    
     "github.com/Azure/azure-sdk-for-go/sdk/ai/azopenai"
     "github.com/Azure/azure-sdk-for-go/sdk/azcore"
     "github.com/Azure/azure-sdk-for-go/sdk/azcore/to"
    )
    
    func main() {
     azureOpenAIKey := os.Getenv("AZURE_OPENAI_API_KEY")
     modelDeploymentID := os.Getenv("AZURE_OPENAI_DEPLOYMENT_ID")
    
     // Ex: "https://<your-azure-openai-host>.openai.azure.com"
     azureOpenAIEndpoint := os.Getenv("AZURE_OPENAI_ENDPOINT")
    
     // Azure AI Search configuration
     searchIndex := os.Getenv("AZURE_AI_SEARCH_INDEX")
     searchEndpoint := os.Getenv("AZURE_AI_SEARCH_ENDPOINT")
     searchAPIKey := os.Getenv("AZURE_AI_SEARCH_API_KEY")
    
     if azureOpenAIKey == "" || modelDeploymentID == "" || azureOpenAIEndpoint == "" || searchIndex == "" || searchEndpoint == "" || searchAPIKey == "" {
     	fmt.Fprintf(os.Stderr, "Skipping example, environment variables missing\n")
     	return
     }
    
     keyCredential := azcore.NewKeyCredential(azureOpenAIKey)
    
     // In Azure OpenAI you must deploy a model before you can use it in your client. For more information
     // see here: https://learn.microsoft.com/azure/cognitive-services/openai/how-to/create-resource
     client, err := azopenai.NewClientWithKeyCredential(azureOpenAIEndpoint, keyCredential, nil)
    
     if err != nil {
     	//  TODO: Update the following line with your application specific error handling logic
     	log.Fatalf("ERROR: %s", err)
     }
    
     resp, err := client.GetChatCompletions(context.TODO(), azopenai.ChatCompletionsOptions{
     	Messages: []azopenai.ChatRequestMessageClassification{
     		&azopenai.ChatRequestUserMessage{Content: azopenai.NewChatRequestUserMessageContent("What are my available health plans?")},
     	},
     	MaxTokens: to.Ptr[int32](512),
     	AzureExtensionsOptions: []azopenai.AzureChatExtensionConfigurationClassification{
     		&azopenai.AzureCognitiveSearchChatExtensionConfiguration{
     			// This allows Azure OpenAI to use an Azure AI Search index.
     			//
     			// > Because the model has access to, and can reference specific sources to support its responses, answers are not only based on its pretrained knowledge
     			// > but also on the latest information available in the designated data source. This grounding data also helps the model avoid generating responses
     			// > based on outdated or incorrect information.
     			//
     			// Quote from here: https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/use-your-data
     			Parameters: &azopenai.AzureCognitiveSearchChatExtensionParameters{
     				Endpoint:  &searchEndpoint,
     				IndexName: &searchIndex,
     				Authentication: &azopenai.OnYourDataAPIKeyAuthenticationOptions{
     					Key: &searchAPIKey,
     				},
     			},
     		},
     	},
     	DeploymentName: &modelDeploymentID,
     }, nil)
    
     if err != nil {
     	//  TODO: Update the following line with your application specific error handling logic
     	log.Fatalf("ERROR: %s", err)
     }
    
     // Contains contextual information from your Azure chat completion extensions, configured above in `AzureExtensionsOptions`
     msgContext := resp.Choices[0].Message.Context
    
     fmt.Fprintf(os.Stderr, "Extensions Context Role: %s\nExtensions Context (length): %d\n",
     	*msgContext.Messages[0].Role,
     	len(*msgContext.Messages[0].Content))
    
     fmt.Fprintf(os.Stderr, "ChatRole: %s\nChat content: %s\n",
     	*resp.Choices[0].Message.Role,
     	*resp.Choices[0].Message.Content,
     )
    }
    

    Important

    Pour la production, utilisez un moyen sécurisé de stocker et d’accéder à vos informations d’identification comme Azure Key Vault. Pour plus d’informations sur la sécurité des informations d’identification, consultez l’article de sécurité Azure AI services.

  2. Exécutez la commande suivante :

    go run sample.go
    

    L’application imprime la réponse, y compris les réponses à votre requête et à vos citations à partir de vos fichiers chargés.

Récupérer les variables requises

Pour effectuer un appel sur Azure OpenAI, vous aurez besoin des variables suivantes. Ce guide de démarrage rapide suppose que vous avez chargé vos données dans un compte de stockage d’objets blob Azure et que vous avez créé un index Recherche Azure AI. Consultez Ajouter vos données à l’aide d’Azure AI Studio.

Nom de la variable Valeur
AZURE_OPENAI_ENDPOINT Cette valeur se trouve dans la section Clés et point de terminaison quand vous examinez votre ressource Azure OpenAI à partir du portail Azure. Vous pouvez également trouver la valeur dans Azure AI Studio>Terrain de jeu de conversation>Mode Code. Voici un exemple de point de terminaison : https://my-resoruce.openai.azure.com.
AZURE_OPENAI_API_KEY Cette valeur se trouve dans la section Gestion des ressources>Clés et points de terminaison quand vous examinez votre ressource Azure OpenAI depuis le portail Azure. Vous pouvez utiliser soit KEY1, soit KEY2. Avoir toujours deux clés vous permet de faire pivoter et de régénérer en toute sécurité les clés sans provoquer d’interruption de service.
AZURE_OPENAI_DEPLOYMENT_ID Cette valeur correspond au nom personnalisé que vous avez choisi pour votre déploiement lorsque vous avez déployé un modèle. Cette valeur se trouve sous Gestion des ressources>Déploiements dans le portail Microsoft Azure ou sousGestion>Déploiements dans Azure AI Studio.
AZURE_AI_SEARCH_ENDPOINT Cette valeur se trouve dans la section Vue d’ensemble quand vous examinez votre ressource Recherche Azure AI à partir du Portail Azure.
AZURE_AI_SEARCH_API_KEY Cette valeur se trouve dans la section Paramètres>Clés quand vous examinez votre ressource Recherche Azure AI à partir du Portail Azure. Vous pouvez utiliser la clé d’administration primaire ou secondaire. Avoir toujours deux clés vous permet de faire pivoter et de régénérer en toute sécurité les clés sans provoquer d’interruption de service.
AZURE_AI_SEARCH_INDEX Cette valeur correspond au nom de l’index que vous avez créé pour stocker vos données. Vous le trouverez dans la section Vue d’ensemble lors de l’examen de votre ressource Recherche Azure AI à partir du Portail Azure.

Variables d'environnement

setx AZURE_OPENAI_ENDPOINT REPLACE_WITH_YOUR_AOAI_ENDPOINT_VALUE_HERE
setx AZURE_OPENAI_API_KEY REPLACE_WITH_YOUR_AOAI_KEY_VALUE_HERE
setx AZURE_OPENAI_DEPLOYMENT_ID REPLACE_WITH_YOUR_AOAI_DEPLOYMENT_VALUE_HERE
setx AZURE_AI_SEARCH_ENDPOINT REPLACE_WITH_YOUR_AZURE_SEARCH_RESOURCE_VALUE_HERE
setx AZURE_AI_SEARCH_API_KEY REPLACE_WITH_YOUR_AZURE_SEARCH_RESOURCE_KEY_VALUE_HERE
setx AZURE_AI_SEARCH_INDEX REPLACE_WITH_YOUR_INDEX_NAME_HERE

Exemples de commandes cURL

Les modèles Azure OpenAI sont optimisés pour fonctionner avec des entrées au format de conversation. La variable messages transmet un tableau de dictionnaires avec différents rôles dans la conversation délimités par système, utilisateur, outil et assistant. La variable dataSources se connecte à votre index Recherche Azure AI et permet aux modèles Azure OpenAI de répondre à l’aide de vos données.

Pour déclencher une réponse à partir du modèle, vous devez voir un message utilisateur indiquant que c’est au tour de l’assistant de répondre.

Conseil

Vous pouvez utiliser plusieurs paramètres pour modifier la réponse du modèle, comme temperature ou top_p. Pour plus d’informations, consultez la documentation de référence.

curl -i -X POST $AZURE_OPENAI_ENDPOINT/openai/deployments/$AZURE_OPENAI_DEPLOYMENT_ID/chat/completions?api-version=2024-02-15-preview \
-H "Content-Type: application/json" \
-H "api-key: $AZURE_OPENAI_API_KEY" \
-d \
'
{
    "data_sources": [
        {
            "type": "AzureCognitiveSearch",
            "parameters": {
                "endpoint": "'$AZURE_AI_SEARCH_ENDPOINT'",
                "key": "'$AZURE_AI_SEARCH_API_KEY'",
                "index_name": "'$AZURE_AI_SEARCH_INDEX'"
            }
        }
    ],
    "messages": [
        {
            "role": "user",
            "content": "What are my available health plans?"
        }
    ]
}
'

Exemple de sortie

{
    "id": "12345678-1a2b-3c4e5f-a123-12345678abcd",
    "model": "gpt-4",
    "created": 1709835345,
    "object": "extensions.chat.completion",
    "choices": [
        {
            "index": 0,
            "finish_reason": "stop",
            "message": {
                "role": "assistant",
                "content": "The available health plans in the Contoso Electronics plan and benefit packages are the Northwind Health Plus and Northwind Standard plans. [doc1].",
                "end_turn": true,
                "context": {
                    "citations": [
                        {
                            "content": "...",
                            "title": "...",
                            "url": "https://mysearch.blob.core.windows.net/xyz/001.txt",
                            "filepath": "001.txt",
                            "chunk_id": "0"
                        }
                    ],
                    "intent": "[\"Available health plans\"]"
                }
            }
        }
    ],
    "usage": {
        "prompt_tokens": 3779,
        "completion_tokens": 105,
        "total_tokens": 3884
    }
}

Converser avec votre modèle à l’aide d’une application web

Pour commencer à discuter avec le modèle Azure OpenAI qui utilise vos données, vous pouvez déployer une application web en utilisant Azure OpenAI Studio ou l’exemple de code que nous fournissons sur GitHub. Cette application se déploie à l’aide d’Azure App Service et fournit une interface utilisateur pour l’envoi de requêtes. Cette application peut être utilisée des modèles Azure OpenAI qui utilisent vos données, ou des modèles qui n’utilisent pas vos données. Consultez le fichier lisez-moi dans le référentiel pour obtenir des instructions sur la configuration requise, l’installation et le déploiement. Vous pouvez éventuellement personnaliser la logique frontend et back-end de l’application web en modifiant le code source.

Nettoyer les ressources

Si vous voulez nettoyer et supprimer une ressource Azure OpenAI ou Recherche Azure AI, vous pouvez supprimer la ressource ou le groupe de ressources. La suppression du groupe de ressources efface également les autres ressources qui y sont associées.

Étapes suivantes