Quickstart: Chatten met Azure OpenAI-modellen met uw eigen gegevens

Voorbeelden van referentiebroncodepakket | | (pypi) |

De bovenstaande koppelingen verwijzen naar de OpenAI-API voor Python. Er is geen Azure-specifieke OpenAI Python SDK. Meer informatie over het schakelen tussen de OpenAI-services en Azure OpenAI-services.

In deze quickstart kunt u uw eigen gegevens gebruiken met Azure OpenAI-modellen. Door de modellen van Azure OpenAI op uw gegevens te gebruiken, beschikt u over een krachtig AI-platform voor gesprekken dat snellere en nauwkeurigere communicatie mogelijk maakt.

Vereisten

Uw gegevens toevoegen met Behulp van Azure OpenAI Studio

Navigeer naar Azure OpenAI Studio en meld u aan met referenties die toegang hebben tot uw Azure OpenAI-resource. Selecteer tijdens of na de aanmeldingswerkstroom de juiste map, het Azure-abonnement en de Azure OpenAI-resource.

  1. Selecteer de tegel Bring Your Own Data

    Een schermopname van de landingspagina van Azure OpenAI Studio.

  2. Selecteer bestanden uploaden (preview) onder Gegevensbron selecteren in het deelvenster dat wordt weergegeven. Azure OpenAI heeft zowel een opslagresource als een zoekresource nodig om uw gegevens te kunnen openen en indexeren.

    Tip

    1. Voor toegang tot uw opslagaccount moet u Cross-Origin Resource Sharing (CORS) inschakelen voor Azure OpenAI. Als CORS nog niet is ingeschakeld voor de Azure Blob Storage-resource, selecteert u CORS inschakelen.

    2. Selecteer uw Azure AI Search-resource en selecteer de bevestiging dat er gebruik wordt gemaakt voor uw account. Selecteer Volgende.

    Een schermopname met opties voor het selecteren van een gegevensbron in Azure OpenAI Studio.

  3. Selecteer in het deelvenster Bestanden uploaden de optie Bladeren naar een bestand en selecteer de bestanden die u hebt gedownload in de sectie Vereisten of uw eigen gegevens. Selecteer vervolgens Bestanden uploaden. Selecteer Volgende.

  4. In het deelvenster Gegevensbeheer kunt u kiezen of u semantische zoekopdrachten of vectorzoekopdrachten voor uw index wilt inschakelen.

    Belangrijk

    • Semantische zoekopdrachten en vectorzoekopdrachten zijn onderhevig aan aanvullende prijzen. U moet Basic of hoger SKU kiezen om semantische zoekopdrachten of vectorzoekopdrachten in te schakelen. Zie het verschil in prijscategorieën en servicelimieten voor meer informatie.
    • Om de kwaliteit van het ophalen van gegevens en modelreacties te verbeteren, raden we u aan semantische zoekopdrachten in te schakelen voor de volgende gegevensbrontalen: Engels, Frans, Spaans, Portugees, Italiaans, Duitsland, Chinees (Zh), Japans, Koreaans, Russisch en Arabisch.
  5. Controleer de gegevens die u hebt ingevoerd en selecteer Opslaan en sluiten. U kunt nu chatten met het model en er worden gegevens uit uw gegevens gebruikt om het antwoord samen te stellen.

Chatspeeltuin

Begin met het verkennen van de mogelijkheden van Azure OpenAI met een no-code-benadering via de chatspeelplaats. Het is gewoon een tekstvak waarin u een prompt kunt indienen om een voltooiing te genereren. Op deze pagina kunt u snel herhalen en experimenteren met de mogelijkheden.

Schermopname van de pagina speeltuin van Azure OpenAI Studio met secties gemarkeerd.

De speeltuin biedt u opties om uw chatervaring aan te passen. Aan de rechterkant kunt u Implementatie selecteren om te bepalen welk model een antwoord genereert met behulp van de zoekresultaten uit uw index. U kiest het aantal eerdere berichten dat u wilt opnemen als gespreksgeschiedenis voor toekomstige gegenereerde antwoorden. Gespreksgeschiedenisgeeft context voor het genereren van gerelateerde antwoorden, maar verbruikt ook tokengebruik. De voortgangsindicator van het invoertoken houdt het aantal tokens bij van de vraag die u indient.

De geavanceerde instellingen aan de linkerkant zijn runtimeparameters, waarmee u controle hebt over het ophalen en doorzoeken van relevante informatie uit uw gegevens. Een goed gebruiksvoorbeeld is wanneer u ervoor wilt zorgen dat antwoorden alleen worden gegenereerd op basis van uw gegevens of als u vindt dat het model geen antwoord kan genereren op basis van bestaande informatie over uw gegevens.

  • Striktheid bepaalt de sterkte van het systeem bij het filteren van zoekdocumenten op basis van hun overeenkomstenscores. Het instellen van striktheid op 5 geeft aan dat het systeem documenten agressief uitfiltert, waarbij een zeer hoge gelijkenisdrempel wordt toegepast. Semantische zoekopdrachten kunnen in dit scenario nuttig zijn, omdat de classificatiemodellen een betere taak hebben om de intentie van de query uit te stellen. Lagere striktheidsniveaus produceren uitgebreidere antwoorden, maar bevatten mogelijk ook informatie die zich niet in uw index bevindt. Dit is standaard ingesteld op 3.

  • Opgehaalde documenten zijn een geheel getal dat kan worden ingesteld op 3, 5, 10 of 20 en bepaalt het aantal documentsegmenten dat aan het grote taalmodel is verstrekt voor het formuleren van het uiteindelijke antwoord. Dit is standaard ingesteld op 5.

  • Wanneer antwoorden op uw gegevens beperken is ingeschakeld, probeert het model alleen te vertrouwen op uw documenten voor antwoorden. Dit is standaard ingesteld op true.

Schermopname van de geavanceerde instellingen.

Uw eerste query verzenden. De chatmodellen presteren het beste in vraag- en antwoordoefeningen. Bijvoorbeeld 'Wat zijn mijn beschikbare gezondheidsplannen?' of 'Wat is de status plusoptie?'.

Query's waarvoor gegevensanalyse is vereist, mislukken waarschijnlijk, zoals 'Welk statusplan is het populairst?'. Query's waarvoor informatie over al uw gegevens is vereist, mislukken waarschijnlijk ook, zoals 'Hoeveel documenten heb ik geüpload?'. Houd er rekening mee dat de zoekmachine zoekt naar segmenten met exacte of vergelijkbare termen, woordgroepen of constructie voor de query. En hoewel het model de vraag misschien begrijpt, is het niet de juiste informatie om dat soort vragen te beantwoorden als zoekresultaten segmenten uit de gegevensset zijn.

Chats worden beperkt door het aantal documenten (segmenten) dat wordt geretourneerd in het antwoord (beperkt tot 3-20 in azure OpenAI Studio-speeltuin). Zoals u zich kunt voorstellen, is het stellen van een vraag over 'alle titels' een volledige scan van het hele vectorarchief vereist.

Uw model implementeren

Zodra u tevreden bent met de ervaring in Azure OpenAI Studio, kunt u rechtstreeks vanuit Studio een web-app implementeren door de knop Implementeren te selecteren.

Een schermopname van de knop voor modelimplementatie in Azure OpenAI Studio.

Dit biedt u de mogelijkheid om te implementeren in een zelfstandige webtoepassing of een copilot in Copilot Studio (preview) als u uw eigen gegevens op het model gebruikt.

Als u er bijvoorbeeld voor kiest om een web-app te implementeren:

De eerste keer dat u een web-app implementeert, selecteert u Een nieuwe web-app maken. Kies een naam voor de app, die deel gaat uitmaken van de APP-URL. Bijvoorbeeld: https://<appname>.azurewebsites.net.

Selecteer uw abonnement, resourcegroep, locatie en prijsplan voor de gepubliceerde app. Als u een bestaande app wilt bijwerken, selecteert u Publiceren naar een bestaande web-app en kiest u de naam van uw vorige app in de vervolgkeuzelijst.

Als u ervoor kiest om een web-app te implementeren, raadpleegt u de belangrijke overwegingen voor het gebruik ervan.

Vereiste variabelen ophalen

Als u azure OpenAI wilt aanroepen, hebt u de volgende variabelen nodig. In deze quickstart wordt ervan uitgegaan dat u uw gegevens hebt geüpload naar een Azure Blob Storage-account en een Azure AI Search-index hebt gemaakt. Zie Uw gegevens toevoegen met Behulp van Azure AI Studio

Naam van de variabele Weergegeven als
AZURE_OPENAI_ENDPOINT Deze waarde vindt u in de sectie Sleutels en eindpunten bij het onderzoeken van uw Azure OpenAI-resource vanuit Azure Portal. U kunt ook de waarde vinden in de codeweergave voor chatspeeltuinen>van Azure AI Studio>. Een voorbeeldeindpunt is: https://my-resoruce.openai.azure.com.
AZURE_OPENAI_API_KEY Deze waarde vindt u in de sectie Sleutels en eindpunten voor resourcebeheer>bij het onderzoeken van uw Azure OpenAI-resource vanuit Azure Portal. U kunt KEY1 of KEY2 gebruiken. Als u altijd twee sleutels hebt, kunt u sleutels veilig roteren en opnieuw genereren zonder een serviceonderbreking te veroorzaken.
AZURE_OPENAI_DEPLOYMENT_ID Deze waarde komt overeen met de aangepaste naam die u voor uw implementatie hebt gekozen bij het implementeren van een model. Deze waarde vindt u onder ResourceBeheer-implementaties> in Azure Portal of ook onder Beheerimplementaties> in Azure AI Studio.
AZURE_AI_SEARCH_ENDPOINT Deze waarde vindt u in de sectie Overzicht wanneer u uw Azure AI Search-resource bekijkt vanuit Azure Portal.
AZURE_AI_SEARCH_API_KEY Deze waarde vindt u in de sectie Instellingen> Sleutels bij het onderzoeken van uw Azure AI Search-resource vanuit Azure Portal. U kunt de primaire beheerderssleutel of secundaire beheerderssleutel gebruiken. Als u altijd twee sleutels hebt, kunt u sleutels veilig roteren en opnieuw genereren zonder een serviceonderbreking te veroorzaken.
AZURE_AI_SEARCH_INDEX Deze waarde komt overeen met de naam van de index die u hebt gemaakt om uw gegevens op te slaan. U vindt deze in de sectie Overzicht wanneer u uw Azure AI Search-resource bekijkt vanuit Azure Portal.

Omgevingsvariabelen

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

Een nieuwe .NET Core-app maken

Gebruik in een consolevenster (zoals cmd, PowerShell of Bash) de opdracht dotnet new om een nieuwe console-app te maken met de naam azure-openai-quickstart. Met deze opdracht maakt u een eenvoudig 'Hallo wereld'-project met één C#-bronbestand: Program.cs.

dotnet new console -n azure-openai-quickstart

Wijzig uw map in de zojuist gemaakte app-map. U kunt de toepassing maken met:

dotnet build

De build-uitvoer mag geen waarschuwingen of fouten bevatten.

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

Installeer de OpenAI .NET-clientbibliotheek met:

dotnet add package Azure.AI.OpenAI --prerelease

Open in de projectmap het Program.cs-bestand en vervang de inhoud door de volgende code:

Zonder antwoordstreaming

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("===");

Belangrijk

Gebruik voor productie een veilige manier om uw referenties op te slaan en te openen, zoals Azure Key Vault. Zie het artikel over beveiliging van Azure AI-services voor meer informatie over referentiebeveiliging.

dotnet run program.cs

Uitvoer

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]"
}
===

Dit wacht totdat het model het volledige antwoord heeft gegenereerd voordat de resultaten worden afgedrukt. Als u het antwoord asynchroon wilt streamen en de resultaten wilt afdrukken, kunt u de inhoud van Program.cs vervangen door de code in het volgende voorbeeld.

Asynchroon met streaming

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);
    }
}

Vereiste variabelen ophalen

Als u azure OpenAI wilt aanroepen, hebt u de volgende variabelen nodig. In deze quickstart wordt ervan uitgegaan dat u uw gegevens hebt geüpload naar een Azure Blob Storage-account en een Azure AI Search-index hebt gemaakt. Zie Uw gegevens toevoegen met Behulp van Azure AI Studio voor meer informatie.

Naam van de variabele Weergegeven als
AZURE_OPENAI_ENDPOINT U vindt deze waarde in de sectie Sleutels en eindpunten wanneer u uw Azure OpenAI-resource bekijkt vanuit Azure Portal. U kunt ook de waarde vinden in de codeweergave voor chatspeeltuinen>van Azure AI Studio>. Een voorbeeldeindpunt is: https://my-resource.openai.azure.com.
AZURE_OPENAI_API_KEY U vindt deze waarde in de sectie Sleutels en eindpunten voor resourcebeheer>wanneer u uw Azure OpenAI-resource bekijkt vanuit Azure Portal. U kunt KEY1 of KEY2 gebruiken. Als u altijd twee sleutels hebt, kunt u sleutels veilig roteren en opnieuw genereren zonder een serviceonderbreking te veroorzaken.
AZURE_OPEN_AI_DEPLOYMENT_ID Deze waarde komt overeen met de aangepaste naam die u voor uw implementatie hebt gekozen bij het implementeren van een model. U vindt deze waarde onder Resource Management-implementaties> in Azure Portal of ook onder Beheerimplementaties> in Azure AI Studio.
AZURE_AI_SEARCH_ENDPOINT U vindt deze waarde in de sectie Overzicht wanneer u uw Azure AI Search-resource bekijkt vanuit Azure Portal.
AZURE_AI_SEARCH_API_KEY U vindt deze waarde in de sectie Instellingen> Sleutels bij het onderzoeken van uw Azure AI Search-resource vanuit Azure Portal. U kunt de primaire beheerderssleutel of secundaire beheerderssleutel gebruiken. Als u altijd twee sleutels hebt, kunt u sleutels veilig roteren en opnieuw genereren zonder een serviceonderbreking te veroorzaken.
AZURE_AI_SEARCH_INDEX Deze waarde komt overeen met de naam van de index die u hebt gemaakt om uw gegevens op te slaan. U vindt deze in de sectie Overzicht wanneer u uw Azure AI Search-resource bekijkt vanuit Azure Portal.

Omgevingsvariabelen

Notitie

In Spring AI wordt de modelnaam standaard ingesteld op gpt-35-turbo. Het is alleen nodig om de SPRING_AI_AZURE_OPENAI_MODEL waarde op te geven als u een model met een andere naam hebt geïmplementeerd.

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

Een nieuwe Spring-toepassing maken

Spring AI biedt momenteel geen ondersteuning voor de AzureCognitiveSearchChatExtensionConfiguration opties waarmee een Azure AI-query de rag-methode (Retrieval Augmented Generation ) kan inkapselen en de details van de gebruiker kan verbergen. Als alternatief kunt u de RAG-methode nog steeds rechtstreeks in uw toepassing aanroepen om gegevens in uw Azure AI Search-index op te vragen en opgehaalde documenten te gebruiken om uw query te verbeteren.

Spring AI ondersteunt een VectorStore-abstractie en u kunt Azure AI Search verpakken in een Spring AI VectorStore-implementatie om query's uit te voeren op uw aangepaste gegevens. In het volgende project wordt een aangepaste VectorStore geïmplementeerd die wordt ondersteund door Azure AI Search en worden RAG-bewerkingen rechtstreeks uitgevoerd.

Maak in een Bash-venster een nieuwe map voor uw app en navigeer ernaartoe.

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

Voer de opdracht spring init uit vanuit uw werkmap. Met deze opdracht maakt u een standaardmapstructuur voor uw Spring-project, inclusief het belangrijkste Bronbestand van Java-klasse en het pom.xml-bestand dat wordt gebruikt voor het beheren van op Maven gebaseerde projecten.

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

De gegenereerde bestanden en mappen lijken op de volgende structuur:

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

Spring-toepassing bewerken

  1. Bewerk het pom.xml bestand.

    Open vanuit de hoofdmap van de projectmap het pom.xml-bestand in de gewenste editor of IDE en overschrijf het bestand met de volgende inhoud:

    <?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. Open in de map src/main/java/com/example/aicustomdatademo AiCustomDataApplication.java in de gewenste editor of IDE en plak de volgende code:

    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;
        }
    
    }
    

    Belangrijk

    Gebruik voor productie een veilige manier om uw referenties op te slaan en te openen, zoals Azure Key Vault. Zie het artikel over beveiliging van Azure AI-services voor meer informatie over referentiebeveiliging.

  3. Ga terug naar de hoofdmap van het project en voer de app uit met behulp van de volgende opdracht:

    ./mvnw spring-boot:run
    

Uitvoer

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: 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.

Vereiste variabelen ophalen

Als u azure OpenAI wilt aanroepen, hebt u de volgende variabelen nodig. In deze quickstart wordt ervan uitgegaan dat u uw gegevens hebt geüpload naar een Azure Blob Storage-account en een Azure AI Search-index hebt gemaakt. Zie Uw gegevens toevoegen met Behulp van Azure AI Studio

Naam van de variabele Weergegeven als
AZURE_OPENAI_ENDPOINT Deze waarde vindt u in de sectie Sleutels en eindpunten bij het onderzoeken van uw Azure OpenAI-resource vanuit Azure Portal. U kunt ook de waarde vinden in de codeweergave voor chatspeeltuinen>van Azure AI Studio>. Een voorbeeldeindpunt is: https://my-resoruce.openai.azure.com.
AZURE_OPENAI_API_KEY Deze waarde vindt u in de sectie Sleutels en eindpunten voor resourcebeheer>bij het onderzoeken van uw Azure OpenAI-resource vanuit Azure Portal. U kunt KEY1 of KEY2 gebruiken. Als u altijd twee sleutels hebt, kunt u sleutels veilig roteren en opnieuw genereren zonder een serviceonderbreking te veroorzaken.
AZURE_OPENAI_DEPLOYMENT_ID Deze waarde komt overeen met de aangepaste naam die u voor uw implementatie hebt gekozen bij het implementeren van een model. Deze waarde vindt u onder ResourceBeheer-implementaties> in Azure Portal of ook onder Beheerimplementaties> in Azure AI Studio.
AZURE_AI_SEARCH_ENDPOINT Deze waarde vindt u in de sectie Overzicht wanneer u uw Azure AI Search-resource bekijkt vanuit Azure Portal.
AZURE_AI_SEARCH_API_KEY Deze waarde vindt u in de sectie Instellingen> Sleutels bij het onderzoeken van uw Azure AI Search-resource vanuit Azure Portal. U kunt de primaire beheerderssleutel of secundaire beheerderssleutel gebruiken. Als u altijd twee sleutels hebt, kunt u sleutels veilig roteren en opnieuw genereren zonder een serviceonderbreking te veroorzaken.
AZURE_AI_SEARCH_INDEX Deze waarde komt overeen met de naam van de index die u hebt gemaakt om uw gegevens op te slaan. U vindt deze in de sectie Overzicht wanneer u uw Azure AI Search-resource bekijkt vanuit Azure Portal.

Omgevingsvariabelen

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

Een Node-toepassing maken

Maak in een consolevenster (zoals cmd, PowerShell of Bash) een nieuwe map voor de app, en navigeer naar deze map. Voer vervolgens de npm init opdracht uit om een knooppunttoepassing te maken met een package.json-bestand .

npm init

De clientbibliotheek installeren

Installeer de Azure OpenAI-client en Azure Identity-bibliotheken voor JavaScript met npm:

npm install @azure/openai @azure/identity

Het package.json-bestand van uw app wordt bijgewerkt met de afhankelijkheden.

Een voorbeeldtoepassing maken

Open een opdrachtprompt waar u het nieuwe project wilt en maak een nieuw bestand met de naam ChatWithOwnData.js. Kopieer de volgende code naar het ChatWithOwnData.js-bestand.

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 };

Belangrijk

Gebruik voor productie een veilige manier om uw referenties op te slaan en te openen, zoals Azure Key Vault. Zie het artikel over beveiliging van Azure AI-services voor meer informatie over referentiebeveiliging.

node.exe ChatWithOwnData.js

Uitvoer

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.

Vereiste variabelen ophalen

Als u azure OpenAI wilt aanroepen, hebt u de volgende variabelen nodig. In deze quickstart wordt ervan uitgegaan dat u uw gegevens hebt geüpload naar een Azure Blob Storage-account en een Azure AI Search-index hebt gemaakt. Zie Uw gegevens toevoegen met Behulp van Azure AI Studio

Naam van de variabele Weergegeven als
AZURE_OPENAI_ENDPOINT Deze waarde vindt u in de sectie Sleutels en eindpunten bij het onderzoeken van uw Azure OpenAI-resource vanuit Azure Portal. U kunt ook de waarde vinden in de codeweergave voor chatspeeltuinen>van Azure AI Studio>. Een voorbeeldeindpunt is: https://my-resoruce.openai.azure.com.
AZURE_OPENAI_API_KEY Deze waarde vindt u in de sectie Sleutels en eindpunten voor resourcebeheer>bij het onderzoeken van uw Azure OpenAI-resource vanuit Azure Portal. U kunt KEY1 of KEY2 gebruiken. Als u altijd twee sleutels hebt, kunt u sleutels veilig roteren en opnieuw genereren zonder een serviceonderbreking te veroorzaken.
AZURE_OPENAI_DEPLOYMENT_ID Deze waarde komt overeen met de aangepaste naam die u voor uw implementatie hebt gekozen bij het implementeren van een model. Deze waarde vindt u onder ResourceBeheer-implementaties> in Azure Portal of ook onder Beheerimplementaties> in Azure AI Studio.
AZURE_AI_SEARCH_ENDPOINT Deze waarde vindt u in de sectie Overzicht wanneer u uw Azure AI Search-resource bekijkt vanuit Azure Portal.
AZURE_AI_SEARCH_API_KEY Deze waarde vindt u in de sectie Instellingen> Sleutels bij het onderzoeken van uw Azure AI Search-resource vanuit Azure Portal. U kunt de primaire beheerderssleutel of secundaire beheerderssleutel gebruiken. Als u altijd twee sleutels hebt, kunt u sleutels veilig roteren en opnieuw genereren zonder een serviceonderbreking te veroorzaken.
AZURE_AI_SEARCH_INDEX Deze waarde komt overeen met de naam van de index die u hebt gemaakt om uw gegevens op te slaan. U vindt deze in de sectie Overzicht wanneer u uw Azure AI Search-resource bekijkt vanuit Azure Portal.

Omgevingsvariabelen

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

Een Python-omgeving maken

  1. Maak een nieuwe map met de naam openai-python voor uw project en een nieuw Python-codebestand met de naam main.py. Ga naar die map:
mkdir openai-python
cd openai-python
  1. Installeer de volgende Python-bibliotheken:
pip install openai
pip install python-dotenv

De Python-app maken

  1. Open in de projectmap het main.py-bestand en voeg de volgende code toe:
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(
    base_url=f"{endpoint}/openai/deployments/{deployment}/extensions",
    api_key=api_key,
    api_version="2023-08-01-preview",
)

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

print(completion.model_dump_json(indent=2))

Belangrijk

Gebruik voor productie een veilige manier om uw referenties op te slaan en te openen, zoals Azure Key Vault. Zie het artikel over beveiliging van Azure AI-services voor meer informatie over referentiebeveiliging.

  1. Voer de volgende opdracht uit:
python main.py

De toepassing drukt het antwoord af in een JSON-indeling die geschikt is voor gebruik in veel scenario's. Het bevat zowel antwoorden op uw query als bronvermeldingen uit uw geüploade bestanden.

Vereiste variabelen ophalen

Als u azure OpenAI wilt aanroepen, hebt u de volgende variabelen nodig. In deze quickstart wordt ervan uitgegaan dat u uw gegevens hebt geüpload naar een Azure Blob Storage-account en een Azure AI Search-index hebt gemaakt. Zie Uw gegevens toevoegen met Behulp van Azure AI Studio

Naam van de variabele Weergegeven als
AZURE_OPENAI_ENDPOINT Deze waarde vindt u in de sectie Sleutels en eindpunten bij het onderzoeken van uw Azure OpenAI-resource vanuit Azure Portal. U kunt ook de waarde vinden in de codeweergave voor chatspeeltuinen>van Azure AI Studio>. Een voorbeeldeindpunt is: https://my-resoruce.openai.azure.com.
AZURE_OPENAI_API_KEY Deze waarde vindt u in de sectie Sleutels en eindpunten voor resourcebeheer>bij het onderzoeken van uw Azure OpenAI-resource vanuit Azure Portal. U kunt KEY1 of KEY2 gebruiken. Als u altijd twee sleutels hebt, kunt u sleutels veilig roteren en opnieuw genereren zonder een serviceonderbreking te veroorzaken.
AZURE_OPENAI_DEPLOYMENT_ID Deze waarde komt overeen met de aangepaste naam die u voor uw implementatie hebt gekozen bij het implementeren van een model. Deze waarde vindt u onder ResourceBeheer-implementaties> in Azure Portal of ook onder Beheerimplementaties> in Azure AI Studio.
AZURE_AI_SEARCH_ENDPOINT Deze waarde vindt u in de sectie Overzicht wanneer u uw Azure AI Search-resource bekijkt vanuit Azure Portal.
AZURE_AI_SEARCH_API_KEY Deze waarde vindt u in de sectie Instellingen> Sleutels bij het onderzoeken van uw Azure AI Search-resource vanuit Azure Portal. U kunt de primaire beheerderssleutel of secundaire beheerderssleutel gebruiken. Als u altijd twee sleutels hebt, kunt u sleutels veilig roteren en opnieuw genereren zonder een serviceonderbreking te veroorzaken.
AZURE_AI_SEARCH_INDEX Deze waarde komt overeen met de naam van de index die u hebt gemaakt om uw gegevens op te slaan. U vindt deze in de sectie Overzicht wanneer u uw Azure AI Search-resource bekijkt vanuit Azure Portal.

Omgevingsvariabelen

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

Voorbeelden van PowerShell-opdrachten

De Azure OpenAI-chatmodellen zijn geoptimaliseerd voor gebruik met invoer die is opgemaakt als een gesprek. De messages variabele geeft een matrix van woordenlijsten door met verschillende rollen in het gesprek dat is uitgelijnd door systeem, gebruiker, hulpprogramma en assistent. De dataSources variabele maakt verbinding met uw Azure Cognitive Search-index en stelt Azure OpenAI-modellen in staat om te reageren met behulp van uw gegevens.

Als u een reactie van het model wilt activeren, moet u eindigen met een gebruikersbericht dat aangeeft dat het de beurt is van de assistent om te reageren.

Tip

Er zijn verschillende parameters die u kunt gebruiken om het antwoord van het model te wijzigen, zoals temperature of top_p. Raadpleeg de referentiedocumentatie voor meer informatie.

# 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

Voorbeelduitvoer

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

Belangrijk

Gebruik voor productie een veilige manier om uw referenties op te slaan en te openen, zoals Het PowerShell-geheimbeheer met Azure Key Vault. Zie het artikel over beveiliging van Azure AI-services voor meer informatie over referentiebeveiliging.

Chatten met uw model met behulp van een web-app

Als u wilt chatten met het Azure OpenAI-model dat gebruikmaakt van uw gegevens, kunt u een web-app implementeren met behulp van Azure OpenAI Studio of voorbeeldcode die we op GitHub bieden. Deze app wordt geïmplementeerd met behulp van Azure App Service en biedt een gebruikersinterface voor het verzenden van query's. Deze app kan worden gebruikt in Azure OpenAI-modellen die gebruikmaken van uw gegevens of modellen die uw gegevens niet gebruiken. Zie het leesmij-bestand in de opslagplaats voor instructies over vereisten, installatie en implementatie. U kunt desgewenst de front-end- en back-endlogica van de web-app aanpassen door wijzigingen aan te brengen in de broncode.

Vereiste variabelen ophalen

Als u azure OpenAI wilt aanroepen, hebt u de volgende variabelen nodig. In deze quickstart wordt ervan uitgegaan dat u uw gegevens hebt geüpload naar een Azure Blob Storage-account en een Azure AI Search-index hebt gemaakt. Zie Uw gegevens toevoegen met Behulp van Azure AI Studio

Naam van de variabele Weergegeven als
AZURE_OPENAI_ENDPOINT Deze waarde vindt u in de sectie Sleutels en eindpunten bij het onderzoeken van uw Azure OpenAI-resource vanuit Azure Portal. U kunt ook de waarde vinden in de codeweergave voor chatspeeltuinen>van Azure AI Studio>. Een voorbeeldeindpunt is: https://my-resoruce.openai.azure.com.
AZURE_OPENAI_API_KEY Deze waarde vindt u in de sectie Sleutels en eindpunten voor resourcebeheer>bij het onderzoeken van uw Azure OpenAI-resource vanuit Azure Portal. U kunt KEY1 of KEY2 gebruiken. Als u altijd twee sleutels hebt, kunt u sleutels veilig roteren en opnieuw genereren zonder een serviceonderbreking te veroorzaken.
AZURE_OPENAI_DEPLOYMENT_ID Deze waarde komt overeen met de aangepaste naam die u voor uw implementatie hebt gekozen bij het implementeren van een model. Deze waarde vindt u onder ResourceBeheer-implementaties> in Azure Portal of ook onder Beheerimplementaties> in Azure AI Studio.
AZURE_AI_SEARCH_ENDPOINT Deze waarde vindt u in de sectie Overzicht wanneer u uw Azure AI Search-resource bekijkt vanuit Azure Portal.
AZURE_AI_SEARCH_API_KEY Deze waarde vindt u in de sectie Instellingen> Sleutels bij het onderzoeken van uw Azure AI Search-resource vanuit Azure Portal. U kunt de primaire beheerderssleutel of secundaire beheerderssleutel gebruiken. Als u altijd twee sleutels hebt, kunt u sleutels veilig roteren en opnieuw genereren zonder een serviceonderbreking te veroorzaken.
AZURE_AI_SEARCH_INDEX Deze waarde komt overeen met de naam van de index die u hebt gemaakt om uw gegevens op te slaan. U vindt deze in de sectie Overzicht wanneer u uw Azure AI Search-resource bekijkt vanuit Azure Portal.

Omgevingsvariabelen

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

Een Go-omgeving maken

  1. Maak een nieuwe map met de naam openai-go voor uw project en een nieuw Go-codebestand met de naam sample.go. Ga naar die map:

    mkdir openai-go
    cd openai-go
    
  2. Installeer de volgende Go-pakketten:

    go get github.com/Azure/azure-sdk-for-go/sdk/ai/azopenai
    
  3. Schakel het bijhouden van afhankelijkheden in voor uw code.

    go mod init example/azure-openai
    

De Go-app maken

  1. Open in de projectmap het bestand sample.go en voeg de volgende code toe:

    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,
     )
    }
    

    Belangrijk

    Gebruik voor productie een veilige manier om uw referenties op te slaan en te openen, zoals Azure Key Vault. Zie het artikel over beveiliging van Azure AI-services voor meer informatie over referentiebeveiliging.

  2. Voer de volgende opdracht uit:

    go run sample.go
    

    De toepassing drukt het antwoord af, inclusief antwoorden op uw query en bronvermeldingen uit uw geüploade bestanden.

Vereiste variabelen ophalen

Als u azure OpenAI wilt aanroepen, hebt u de volgende variabelen nodig. In deze quickstart wordt ervan uitgegaan dat u uw gegevens hebt geüpload naar een Azure Blob Storage-account en een Azure AI Search-index hebt gemaakt. Zie Uw gegevens toevoegen met Behulp van Azure AI Studio

Naam van de variabele Weergegeven als
AZURE_OPENAI_ENDPOINT Deze waarde vindt u in de sectie Sleutels en eindpunten bij het onderzoeken van uw Azure OpenAI-resource vanuit Azure Portal. U kunt ook de waarde vinden in de codeweergave voor chatspeeltuinen>van Azure AI Studio>. Een voorbeeldeindpunt is: https://my-resoruce.openai.azure.com.
AZURE_OPENAI_API_KEY Deze waarde vindt u in de sectie Sleutels en eindpunten voor resourcebeheer>bij het onderzoeken van uw Azure OpenAI-resource vanuit Azure Portal. U kunt KEY1 of KEY2 gebruiken. Als u altijd twee sleutels hebt, kunt u sleutels veilig roteren en opnieuw genereren zonder een serviceonderbreking te veroorzaken.
AZURE_OPENAI_DEPLOYMENT_ID Deze waarde komt overeen met de aangepaste naam die u voor uw implementatie hebt gekozen bij het implementeren van een model. Deze waarde vindt u onder ResourceBeheer-implementaties> in Azure Portal of ook onder Beheerimplementaties> in Azure AI Studio.
AZURE_AI_SEARCH_ENDPOINT Deze waarde vindt u in de sectie Overzicht wanneer u uw Azure AI Search-resource bekijkt vanuit Azure Portal.
AZURE_AI_SEARCH_API_KEY Deze waarde vindt u in de sectie Instellingen> Sleutels bij het onderzoeken van uw Azure AI Search-resource vanuit Azure Portal. U kunt de primaire beheerderssleutel of secundaire beheerderssleutel gebruiken. Als u altijd twee sleutels hebt, kunt u sleutels veilig roteren en opnieuw genereren zonder een serviceonderbreking te veroorzaken.
AZURE_AI_SEARCH_INDEX Deze waarde komt overeen met de naam van de index die u hebt gemaakt om uw gegevens op te slaan. U vindt deze in de sectie Overzicht wanneer u uw Azure AI Search-resource bekijkt vanuit Azure Portal.

Omgevingsvariabelen

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

Voorbeeld van cURL-opdrachten

De Azure OpenAI-chatmodellen zijn geoptimaliseerd voor gebruik met invoer die is opgemaakt als een gesprek. De messages variabele geeft een matrix van woordenlijsten door met verschillende rollen in het gesprek dat is uitgelijnd door systeem, gebruiker, hulpprogramma en assistent. De dataSources variabele maakt verbinding met uw Azure AI Search-index en stelt Azure OpenAI-modellen in staat om te reageren met behulp van uw gegevens.

Als u een reactie van het model wilt activeren, moet u eindigen met een gebruikersbericht dat aangeeft dat het de beurt is van de assistent om te reageren.

Tip

Er zijn verschillende parameters die u kunt gebruiken om het antwoord van het model te wijzigen, zoals temperature of top_p. Raadpleeg de referentiedocumentatie voor meer informatie.

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?"
        }
    ]
}
'

Voorbeelduitvoer

{
    "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
    }
}

Chatten met uw model met behulp van een web-app

Als u wilt chatten met het Azure OpenAI-model dat gebruikmaakt van uw gegevens, kunt u een web-app implementeren met behulp van Azure OpenAI Studio of voorbeeldcode die we op GitHub bieden. Deze app wordt geïmplementeerd met behulp van Azure App Service en biedt een gebruikersinterface voor het verzenden van query's. Deze app kan worden gebruikt in Azure OpenAI-modellen die gebruikmaken van uw gegevens of modellen die uw gegevens niet gebruiken. Zie het leesmij-bestand in de opslagplaats voor instructies over vereisten, installatie en implementatie. U kunt desgewenst de front-end- en back-endlogica van de web-app aanpassen door wijzigingen aan te brengen in de broncode.

Resources opschonen

Als u een Azure OpenAI- of Azure AI Search-resource wilt opschonen en verwijderen, kunt u de resource of resourcegroep verwijderen. Als u de resourcegroep verwijdert, worden ook alle bijbehorende resources verwijderd.

Volgende stappen