Snabbstart: Chatta med Azure OpenAI-modeller med dina egna data

Exempel på referenskällkodpaket | | (pypi) |

Länkarna ovan refererar till OpenAI API för Python. Det finns ingen Azure-specifik OpenAI Python SDK. Lär dig hur du växlar mellan OpenAI-tjänsterna och Azure OpenAI-tjänsterna.

I den här snabbstarten kan du använda dina egna data med Azure OpenAI-modeller. Genom att använda Azure OpenAI:s modeller på dina data kan du få en kraftfull ai-plattform för konversationer som möjliggör snabbare och mer exakt kommunikation.

Förutsättningar

Lägga till dina data med Azure OpenAI Studio

Dricks

Du kan använda Azure Developer CLI för att programmatiskt skapa de resurser som behövs för Azure OpenAI På dina data

Gå till Azure OpenAI Studio och logga in med autentiseringsuppgifter som har åtkomst till din Azure OpenAI-resurs. Under eller efter inloggningsarbetsflödet väljer du lämplig katalog, Azure-prenumeration och Azure OpenAI-resurs.

  1. Välj panelen Bring your own data (Ta med egna data )

    En skärmbild av Azure OpenAI Studio-landningssidan.

  2. I fönstret som visas väljer du Ladda upp filer (förhandsversion) under Välj datakälla. Azure OpenAI behöver både en lagringsresurs och en sökresurs för att komma åt och indexera dina data.

    Dricks

    1. För att Azure OpenAI ska få åtkomst till ditt lagringskonto måste du aktivera CORS (Cross-origin resource sharing). Om CORS inte redan är aktiverat för Azure Blob Storage-resursen väljer du Aktivera CORS.

    2. Välj din Azure AI Search-resurs och välj bekräftelsen att anslutningen medför användning för ditt konto. Välj sedan Nästa.

    En skärmbild som visar alternativ för att välja en datakälla i Azure OpenAI Studio.

  3. I fönstret Ladda upp filer väljer du Bläddra efter en fil och väljer de filer som du laddade ned från avsnittet förutsättningar eller dina egna data. Välj sedan Ladda upp filer. Välj sedan Nästa.

  4. I fönstret Datahantering kan du välja om du vill aktivera semantisk sökning eller vektorsökning för ditt index.

    Viktigt!

  5. Granska informationen du angav och välj Spara och stäng. Nu kan du chatta med modellen och den använder information från dina data för att konstruera svaret.

Chattlekplats

Börja utforska Azure OpenAI-funktioner med en metod utan kod via chattlekplatsen. Det är bara en textruta där du kan skicka en uppmaning för att generera ett slutförande. Från den här sidan kan du snabbt iterera och experimentera med funktionerna.

Skärmbild av lekplatssidan i Azure OpenAI Studio med avsnitt markerade.

Lekplatsen ger dig alternativ för att skräddarsy din chattupplevelse. Till höger kan du välja Distribution för att avgöra vilken modell som genererar ett svar med hjälp av sökresultaten från ditt index. Du väljer antalet tidigare meddelanden som ska inkluderas som konversationshistorik för framtida genererade svar. Konversationshistorik ger kontext för att generera relaterade svar men förbrukar även tokenanvändning. Förloppsindikatorn för indatatoken håller reda på antalet token för den fråga som du skickar.

Avancerade inställningar till vänster är körningsparametrar som ger dig kontroll över hämtning och sökning efter relevant information från dina data. Ett bra användningsfall är när du vill se till att svar endast genereras baserat på dina data eller om du upptäcker att modellen inte kan generera ett svar baserat på befintlig information om dina data.

  • Strikthet avgör systemets aggressivitet vid filtrering av sökdokument baserat på deras likhetspoäng. Att ange strikthet till 5 anger att systemet aggressivt filtrerar bort dokument och tillämpar ett mycket högt tröskelvärde för likhet. Semantisk sökning kan vara till hjälp i det här scenariot eftersom rangordningsmodellerna gör ett bättre jobb med att härleda frågans avsikt. Lägre nivåer av strikthet ger mer utförliga svar, men kan också innehålla information som inte finns i ditt index. Detta är inställt på 3 som standard.

  • Hämtade dokument är ett heltal som kan anges till 3, 5, 10 eller 20 och styr antalet dokumentsegment som tillhandahålls till den stora språkmodellen för att formulera det slutliga svaret. Som standard är detta inställt på 5.

  • När Begränsa svar på dina data är aktiverat försöker modellen bara förlita sig på dina dokument för svar. Detta är inställt på true som standard.

Skärmbild av de avancerade inställningarna.

Skicka din första fråga. Chattmodellerna fungerar bäst i fråge- och svarsövningar. Till exempel "Vad är mina tillgängliga hälsoplaner?" eller "Vad är alternativet hälsa plus?".

Frågor som kräver dataanalys skulle förmodligen misslyckas, till exempel "Vilken hälsoplan är mest populär?". Frågor som kräver information om alla dina data kommer sannolikt också att misslyckas, till exempel "Hur många dokument har jag laddat upp?". Kom ihåg att sökmotorn letar efter segment med exakta eller liknande termer, fraser eller konstruktion till frågan. Och även om modellen kan förstå frågan, är det inte rätt information för att besvara den typen av frågor om sökresultaten är segment från datauppsättningen.

Chattar begränsas av antalet dokument (segment) som returneras i svaret (begränsat till 3–20 i Azure OpenAI Studio Playground). Som du kan föreställa dig kräver en fullständig genomsökning av hela vektorarkivet att ställa en fråga om "alla titlar".

Distribuera din modell

När du är nöjd med upplevelsen i Azure OpenAI Studio kan du distribuera en webbapp direkt från Studio genom att välja knappen Distribuera till .

En skärmbild som visar knappen för modelldistribution i Azure OpenAI Studio.

Detta ger dig möjlighet att antingen distribuera till ett fristående webbprogram eller en andrepilot i Copilot Studio (förhandsversion) om du använder dina egna data i modellen.

Om du till exempel väljer att distribuera en webbapp:

Första gången du distribuerar en webbapp bör du välja Skapa en ny webbapp. Välj ett namn för appen, som blir en del av appens URL. Exempel: https://<appname>.azurewebsites.net

Välj din prenumeration, resursgrupp, plats och prisplan för den publicerade appen. Om du vill uppdatera en befintlig app väljer du Publicera till en befintlig webbapp och väljer namnet på din tidigare app på den nedrullningsbara menyn.

Om du väljer att distribuera en webbapp kan du läsa de viktiga övervägandena för att använda den.

Hämta nödvändiga variabler

För att kunna göra ett anrop mot Azure OpenAI behöver du följande variabler. Den här snabbstarten förutsätter att du har laddat upp dina data till ett Azure Blob Storage-konto och har skapat ett Azure AI Search-index. Se Lägga till dina data med Hjälp av Azure AI Studio

Variabelnamn Värde
AZURE_OPENAI_ENDPOINT Det här värdet finns i avsnittet Nycklar och slutpunkter när du undersöker din Azure OpenAI-resurs från Azure-portalen. Du kan också hitta värdet i vyn Chattkod>i Azure AI Studio>. En exempelslutpunkt är: https://my-resoruce.openai.azure.com.
AZURE_OPENAI_API_KEY Det här värdet finns i avsnittet Resurshanteringsnycklar>och slutpunkter när du undersöker din Azure OpenAI-resurs från Azure-portalen. Du kan använda antingen KEY1 eller KEY2. Om du alltid har två nycklar kan du rotera och återskapa nycklar på ett säkert sätt utan att orsaka avbrott i tjänsten.
AZURE_OPENAI_DEPLOYMENT_ID Det här värdet motsvarar det anpassade namn som du valde för distributionen när du distribuerade en modell. Det här värdet finns under Resource Management Deployments (Resurshanteringsdistributioner>) i Azure-portalen eller under Hanteringsdistributioner> i Azure AI Studio.
AZURE_AI_SEARCH_ENDPOINT Det här värdet finns i avsnittet Översikt när du undersöker din Azure AI Search-resurs från Azure-portalen.
AZURE_AI_SEARCH_API_KEY Det här värdet finns i avsnittet Inställningar> Keys när du undersöker din Azure AI Search-resurs från Azure-portalen. Du kan använda antingen den primära administratörsnyckeln eller den sekundära administratörsnyckeln. Om du alltid har två nycklar kan du rotera och återskapa nycklar på ett säkert sätt utan att orsaka avbrott i tjänsten.
AZURE_AI_SEARCH_INDEX Det här värdet motsvarar namnet på det index som du skapade för att lagra dina data. Du hittar den i avsnittet Översikt när du undersöker din Azure AI Search-resurs från Azure-portalen.

Miljövariabler

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

Skapa en ny .NET Core-app

I ett konsolfönster (till exempel cmd, PowerShell eller Bash) använder du dotnet new kommandot för att skapa en ny konsolapp med namnet azure-openai-quickstart. Det här kommandot skapar ett enkelt "Hello World"-projekt med en enda C#-källfil: Program.cs.

dotnet new console -n azure-openai-quickstart

Ändra katalogen till den nyligen skapade appmappen. Du kan skapa programmet med:

dotnet build

Kompileringsutdata får inte innehålla några varningar eller fel.

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

Installera OpenAI .NET-klientbiblioteket med:

dotnet add package Azure.AI.OpenAI --prerelease

Öppna filen Program.cs från projektkatalogen och ersätt dess innehåll med följande kod:

Utan strömning av svar

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

Viktigt!

För produktion använder du ett säkert sätt att lagra och komma åt dina autentiseringsuppgifter som Azure Key Vault. Mer information om säkerhet för autentiseringsuppgifter finns i artikeln om Säkerhet för Azure AI-tjänster.

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

Detta väntar tills modellen har genererat hela svaret innan resultatet skrivs ut. Om du vill strömma svaret asynkront och skriva ut resultatet kan du ersätta innehållet i Program.cs med koden i nästa exempel.

Async med strömning

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

Hämta nödvändiga variabler

För att kunna göra ett anrop mot Azure OpenAI behöver du följande variabler. Den här snabbstarten förutsätter att du har laddat upp dina data till ett Azure Blob Storage-konto och har skapat ett Azure AI Search-index. Mer information finns i Lägga till dina data med Hjälp av Azure AI Studio.

Variabelnamn Värde
AZURE_OPENAI_ENDPOINT Du hittar det här värdet i avsnittet Nycklar och slutpunkter när du undersöker din Azure OpenAI-resurs från Azure-portalen. Du kan också hitta värdet i vyn Chattkod>i Azure AI Studio>. En exempelslutpunkt är: https://my-resource.openai.azure.com.
AZURE_OPENAI_API_KEY Du hittar det här värdet i avsnittet Resurshanteringsnycklar>och slutpunkter när du undersöker din Azure OpenAI-resurs från Azure-portalen. Du kan använda antingen KEY1 eller KEY2. Om du alltid har två nycklar kan du rotera och återskapa nycklar på ett säkert sätt utan att orsaka avbrott i tjänsten.
AZURE_OPEN_AI_DEPLOYMENT_ID Det här värdet motsvarar det anpassade namn som du valde för distributionen när du distribuerade en modell. Du hittar det här värdet under Resurshanteringsdistributioner> i Azure-portalen eller under Hanteringsdistributioner> i Azure AI Studio.
AZURE_AI_SEARCH_ENDPOINT Du hittar det här värdet i avsnittet Översikt när du undersöker din Azure AI Search-resurs från Azure-portalen.
AZURE_AI_SEARCH_API_KEY Du hittar det här värdet i avsnittet Inställningar> Keys när du undersöker din Azure AI Search-resurs från Azure-portalen. Du kan använda antingen den primära administratörsnyckeln eller den sekundära administratörsnyckeln. Om du alltid har två nycklar kan du rotera och återskapa nycklar på ett säkert sätt utan att orsaka avbrott i tjänsten.
AZURE_AI_SEARCH_INDEX Det här värdet motsvarar namnet på det index som du skapade för att lagra dina data. Du hittar den i avsnittet Översikt när du undersöker din Azure AI Search-resurs från Azure-portalen.

Miljövariabler

Kommentar

Spring AI standardmodellnamnet till gpt-35-turbo. Det är bara nödvändigt att ange SPRING_AI_AZURE_OPENAI_MODEL värdet om du har distribuerat en modell med ett annat namn.

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

Skapa ett nytt Spring-program

Spring AI stöder för närvarande inte de AzureCognitiveSearchChatExtensionConfiguration alternativ som gör att en Azure AI-fråga kan kapsla in rag-metoden (Retrieval Augmented Generation ) och dölja informationen från användaren. Alternativt kan du fortfarande anropa RAG-metoden direkt i ditt program för att köra frågor mot data i ditt Azure AI Search-index och använda hämtade dokument för att utöka frågan.

Spring AI har stöd för en VectorStore-abstraktion, och du kan omsluta Azure AI Search i en Spring AI VectorStore-implementering för att köra frågor mot dina anpassade data. Följande projekt implementerar en anpassad VectorStore som backas upp av Azure AI Search och kör DIREKT RAG-åtgärder.

I ett Bash-fönster skapar du en ny katalog för din app och navigerar till den.

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

Kör kommandot från arbetskatalogen spring init . Det här kommandot skapar en standardkatalogstruktur för ditt Spring-projekt, inklusive huvudkällfilen för Java-klassen och den pom.xml fil som används för att hantera Maven-baserade projekt.

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

De genererade filerna och mapparna liknar följande struktur:

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

Redigera Spring-program

  1. Redigera filen pom.xml .

    Öppna filen pom.xml i önskad redigerare eller IDE från roten i projektkatalogen och skriv över filen med följande innehåll:

    <?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. Från mappen src/main/java/com/example/aicustomdatademo öppnar du AiCustomDataApplication.java i önskad redigerare eller IDE och klistrar in följande kod:

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

    Viktigt!

    För produktion använder du ett säkert sätt att lagra och komma åt dina autentiseringsuppgifter som Azure Key Vault. Mer information om säkerhet för autentiseringsuppgifter finns i artikeln om Säkerhet för Azure AI-tjänster.

  3. Gå tillbaka till projektrotmappen och kör appen med hjälp av följande kommando:

    ./mvnw spring-boot:run
    

Output

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

Hämta nödvändiga variabler

För att kunna göra ett anrop mot Azure OpenAI behöver du följande variabler. Den här snabbstarten förutsätter att du har laddat upp dina data till ett Azure Blob Storage-konto och har skapat ett Azure AI Search-index. Se Lägga till dina data med Hjälp av Azure AI Studio

Variabelnamn Värde
AZURE_OPENAI_ENDPOINT Det här värdet finns i avsnittet Nycklar och slutpunkter när du undersöker din Azure OpenAI-resurs från Azure-portalen. Du kan också hitta värdet i vyn Chattkod>i Azure AI Studio>. En exempelslutpunkt är: https://my-resoruce.openai.azure.com.
AZURE_OPENAI_API_KEY Det här värdet finns i avsnittet Resurshanteringsnycklar>och slutpunkter när du undersöker din Azure OpenAI-resurs från Azure-portalen. Du kan använda antingen KEY1 eller KEY2. Om du alltid har två nycklar kan du rotera och återskapa nycklar på ett säkert sätt utan att orsaka avbrott i tjänsten.
AZURE_OPENAI_DEPLOYMENT_ID Det här värdet motsvarar det anpassade namn som du valde för distributionen när du distribuerade en modell. Det här värdet finns under Resource Management Deployments (Resurshanteringsdistributioner>) i Azure-portalen eller under Hanteringsdistributioner> i Azure AI Studio.
AZURE_AI_SEARCH_ENDPOINT Det här värdet finns i avsnittet Översikt när du undersöker din Azure AI Search-resurs från Azure-portalen.
AZURE_AI_SEARCH_API_KEY Det här värdet finns i avsnittet Inställningar> Keys när du undersöker din Azure AI Search-resurs från Azure-portalen. Du kan använda antingen den primära administratörsnyckeln eller den sekundära administratörsnyckeln. Om du alltid har två nycklar kan du rotera och återskapa nycklar på ett säkert sätt utan att orsaka avbrott i tjänsten.
AZURE_AI_SEARCH_INDEX Det här värdet motsvarar namnet på det index som du skapade för att lagra dina data. Du hittar den i avsnittet Översikt när du undersöker din Azure AI Search-resurs från Azure-portalen.

Miljövariabler

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

Skapa ett Node-program

Skapa en ny katalog för din app i ett konsolfönster (till exempel cmd, PowerShell eller bash) och navigera till den. Kör npm init sedan kommandot för att skapa ett nodprogram med en package.json fil.

npm init

Installera klientbiblioteket

Installera Azure OpenAI-klienten och Azure Identity-biblioteken för JavaScript med npm:

npm install @azure/openai @azure/identity

Appens package.json-fil uppdateras med beroendena.

Skapa ett exempelprogram

Öppna en kommandotolk där du vill ha det nya projektet och skapa en ny fil med namnet ChatWithOwnData.js. Kopiera följande kod till filen 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 };

Viktigt!

För produktion använder du ett säkert sätt att lagra och komma åt dina autentiseringsuppgifter som Azure Key Vault. Mer information om säkerhet för autentiseringsuppgifter finns i artikeln om Säkerhet för Azure AI-tjänster.

node.exe ChatWithOwnData.js

Output

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.

Hämta nödvändiga variabler

För att kunna göra ett anrop mot Azure OpenAI behöver du följande variabler. Den här snabbstarten förutsätter att du har laddat upp dina data till ett Azure Blob Storage-konto och har skapat ett Azure AI Search-index. Se Lägga till dina data med Hjälp av Azure AI Studio

Variabelnamn Värde
AZURE_OPENAI_ENDPOINT Det här värdet finns i avsnittet Nycklar och slutpunkter när du undersöker din Azure OpenAI-resurs från Azure-portalen. Du kan också hitta värdet i vyn Chattkod>i Azure AI Studio>. En exempelslutpunkt är: https://my-resoruce.openai.azure.com.
AZURE_OPENAI_API_KEY Det här värdet finns i avsnittet Resurshanteringsnycklar>och slutpunkter när du undersöker din Azure OpenAI-resurs från Azure-portalen. Du kan använda antingen KEY1 eller KEY2. Om du alltid har två nycklar kan du rotera och återskapa nycklar på ett säkert sätt utan att orsaka avbrott i tjänsten.
AZURE_OPENAI_DEPLOYMENT_ID Det här värdet motsvarar det anpassade namn som du valde för distributionen när du distribuerade en modell. Det här värdet finns under Resource Management Deployments (Resurshanteringsdistributioner>) i Azure-portalen eller under Hanteringsdistributioner> i Azure AI Studio.
AZURE_AI_SEARCH_ENDPOINT Det här värdet finns i avsnittet Översikt när du undersöker din Azure AI Search-resurs från Azure-portalen.
AZURE_AI_SEARCH_API_KEY Det här värdet finns i avsnittet Inställningar> Keys när du undersöker din Azure AI Search-resurs från Azure-portalen. Du kan använda antingen den primära administratörsnyckeln eller den sekundära administratörsnyckeln. Om du alltid har två nycklar kan du rotera och återskapa nycklar på ett säkert sätt utan att orsaka avbrott i tjänsten.
AZURE_AI_SEARCH_INDEX Det här värdet motsvarar namnet på det index som du skapade för att lagra dina data. Du hittar den i avsnittet Översikt när du undersöker din Azure AI Search-resurs från Azure-portalen.

Miljövariabler

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

Skapa en Python-miljö

  1. Skapa en ny mapp med namnet openai-python för projektet och en ny Python-kodfil med namnet main.py. Ändra till den katalogen:
mkdir openai-python
cd openai-python
  1. Installera följande Python-bibliotek:
pip install openai
pip install python-dotenv

Skapa Python-appen

  1. Öppna filen main.py från projektkatalogen och lägg till följande kod:
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))

Viktigt!

För produktion använder du ett säkert sätt att lagra och komma åt dina autentiseringsuppgifter som Azure Key Vault. Mer information om säkerhet för autentiseringsuppgifter finns i artikeln om Säkerhet för Azure AI-tjänster.

  1. Kör följande kommando:
python main.py

Programmet skriver ut svaret i ett JSON-format som är lämpligt för användning i många scenarier. Den innehåller både svar på din fråga och citat från dina uppladdade filer.

Hämta nödvändiga variabler

För att kunna göra ett anrop mot Azure OpenAI behöver du följande variabler. Den här snabbstarten förutsätter att du har laddat upp dina data till ett Azure Blob Storage-konto och har skapat ett Azure AI Search-index. Se Lägga till dina data med Hjälp av Azure AI Studio

Variabelnamn Värde
AZURE_OPENAI_ENDPOINT Det här värdet finns i avsnittet Nycklar och slutpunkter när du undersöker din Azure OpenAI-resurs från Azure-portalen. Du kan också hitta värdet i vyn Chattkod>i Azure AI Studio>. En exempelslutpunkt är: https://my-resoruce.openai.azure.com.
AZURE_OPENAI_API_KEY Det här värdet finns i avsnittet Resurshanteringsnycklar>och slutpunkter när du undersöker din Azure OpenAI-resurs från Azure-portalen. Du kan använda antingen KEY1 eller KEY2. Om du alltid har två nycklar kan du rotera och återskapa nycklar på ett säkert sätt utan att orsaka avbrott i tjänsten.
AZURE_OPENAI_DEPLOYMENT_ID Det här värdet motsvarar det anpassade namn som du valde för distributionen när du distribuerade en modell. Det här värdet finns under Resource Management Deployments (Resurshanteringsdistributioner>) i Azure-portalen eller under Hanteringsdistributioner> i Azure AI Studio.
AZURE_AI_SEARCH_ENDPOINT Det här värdet finns i avsnittet Översikt när du undersöker din Azure AI Search-resurs från Azure-portalen.
AZURE_AI_SEARCH_API_KEY Det här värdet finns i avsnittet Inställningar> Keys när du undersöker din Azure AI Search-resurs från Azure-portalen. Du kan använda antingen den primära administratörsnyckeln eller den sekundära administratörsnyckeln. Om du alltid har två nycklar kan du rotera och återskapa nycklar på ett säkert sätt utan att orsaka avbrott i tjänsten.
AZURE_AI_SEARCH_INDEX Det här värdet motsvarar namnet på det index som du skapade för att lagra dina data. Du hittar den i avsnittet Översikt när du undersöker din Azure AI Search-resurs från Azure-portalen.

Miljövariabler

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

Exempel på PowerShell-kommandon

Azure OpenAI-chattmodellerna är optimerade för att fungera med indata som är formaterade som en konversation. Variabeln messages skickar en matris med ordlistor med olika roller i konversationen som avgränsas av system, användare, verktyg och assistent. Variabeln dataSources ansluter till ditt Azure Cognitive Search-index och gör att Azure OpenAI-modeller kan svara med dina data.

Om du vill utlösa ett svar från modellen bör du sluta med ett användarmeddelande som anger att det är assistentens tur att svara.

Dricks

Det finns flera parametrar som du kan använda för att ändra modellens svar, till exempel temperature eller top_p. Mer information finns i referensdokumentationen.

# 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

Exempel på utdata

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

Viktigt!

För produktion använder du ett säkert sätt att lagra och komma åt dina autentiseringsuppgifter som PowerShell Secret Management med Azure Key Vault. Mer information om säkerhet för autentiseringsuppgifter finns i artikeln om Säkerhet för Azure AI-tjänster.

Chatta med din modell med hjälp av en webbapp

Om du vill börja chatta med Azure OpenAI-modellen som använder dina data kan du distribuera en webbapp med hjälp av Azure OpenAI Studio eller exempelkod som vi tillhandahåller på GitHub. Den här appen distribueras med Hjälp av Azure App Service och tillhandahåller ett användargränssnitt för att skicka frågor. Den här appen kan användas med Azure OpenAI-modeller som använder dina data eller modeller som inte använder dina data. Mer information om krav, konfiguration och distribution finns i readme-filen på lagringsplatsen. Du kan också anpassa klientdels- och serverdelslogik för webbappen genom att göra ändringar i källkoden.

Hämta nödvändiga variabler

För att kunna göra ett anrop mot Azure OpenAI behöver du följande variabler. Den här snabbstarten förutsätter att du har laddat upp dina data till ett Azure Blob Storage-konto och har skapat ett Azure AI Search-index. Se Lägga till dina data med Hjälp av Azure AI Studio

Variabelnamn Värde
AZURE_OPENAI_ENDPOINT Det här värdet finns i avsnittet Nycklar och slutpunkter när du undersöker din Azure OpenAI-resurs från Azure-portalen. Du kan också hitta värdet i vyn Chattkod>i Azure AI Studio>. En exempelslutpunkt är: https://my-resoruce.openai.azure.com.
AZURE_OPENAI_API_KEY Det här värdet finns i avsnittet Resurshanteringsnycklar>och slutpunkter när du undersöker din Azure OpenAI-resurs från Azure-portalen. Du kan använda antingen KEY1 eller KEY2. Om du alltid har två nycklar kan du rotera och återskapa nycklar på ett säkert sätt utan att orsaka avbrott i tjänsten.
AZURE_OPENAI_DEPLOYMENT_ID Det här värdet motsvarar det anpassade namn som du valde för distributionen när du distribuerade en modell. Det här värdet finns under Resource Management Deployments (Resurshanteringsdistributioner>) i Azure-portalen eller under Hanteringsdistributioner> i Azure AI Studio.
AZURE_AI_SEARCH_ENDPOINT Det här värdet finns i avsnittet Översikt när du undersöker din Azure AI Search-resurs från Azure-portalen.
AZURE_AI_SEARCH_API_KEY Det här värdet finns i avsnittet Inställningar> Keys när du undersöker din Azure AI Search-resurs från Azure-portalen. Du kan använda antingen den primära administratörsnyckeln eller den sekundära administratörsnyckeln. Om du alltid har två nycklar kan du rotera och återskapa nycklar på ett säkert sätt utan att orsaka avbrott i tjänsten.
AZURE_AI_SEARCH_INDEX Det här värdet motsvarar namnet på det index som du skapade för att lagra dina data. Du hittar den i avsnittet Översikt när du undersöker din Azure AI Search-resurs från Azure-portalen.

Miljövariabler

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

Skapa en Go-miljö

  1. Skapa en ny mapp med namnet openai-go för projektet och en ny Go-kodfil med namnet sample.go. Ändra till den katalogen:

    mkdir openai-go
    cd openai-go
    
  2. Installera följande Go-paket:

    go get github.com/Azure/azure-sdk-for-go/sdk/ai/azopenai
    
  3. Aktivera beroendespårning för din kod.

    go mod init example/azure-openai
    

Skapa Go-appen

  1. Öppna filen sample.go från projektkatalogen och lägg till följande kod:

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

    Viktigt!

    För produktion använder du ett säkert sätt att lagra och komma åt dina autentiseringsuppgifter som Azure Key Vault. Mer information om säkerhet för autentiseringsuppgifter finns i artikeln om Säkerhet för Azure AI-tjänster.

  2. Kör följande kommando:

    go run sample.go
    

    Programmet skriver ut svaret med både svar på din fråga och citat från dina uppladdade filer.

Hämta nödvändiga variabler

För att kunna göra ett anrop mot Azure OpenAI behöver du följande variabler. Den här snabbstarten förutsätter att du har laddat upp dina data till ett Azure Blob Storage-konto och har skapat ett Azure AI Search-index. Se Lägga till dina data med Hjälp av Azure AI Studio

Variabelnamn Värde
AZURE_OPENAI_ENDPOINT Det här värdet finns i avsnittet Nycklar och slutpunkter när du undersöker din Azure OpenAI-resurs från Azure-portalen. Du kan också hitta värdet i vyn Chattkod>i Azure AI Studio>. En exempelslutpunkt är: https://my-resoruce.openai.azure.com.
AZURE_OPENAI_API_KEY Det här värdet finns i avsnittet Resurshanteringsnycklar>och slutpunkter när du undersöker din Azure OpenAI-resurs från Azure-portalen. Du kan använda antingen KEY1 eller KEY2. Om du alltid har två nycklar kan du rotera och återskapa nycklar på ett säkert sätt utan att orsaka avbrott i tjänsten.
AZURE_OPENAI_DEPLOYMENT_ID Det här värdet motsvarar det anpassade namn som du valde för distributionen när du distribuerade en modell. Det här värdet finns under Resource Management Deployments (Resurshanteringsdistributioner>) i Azure-portalen eller under Hanteringsdistributioner> i Azure AI Studio.
AZURE_AI_SEARCH_ENDPOINT Det här värdet finns i avsnittet Översikt när du undersöker din Azure AI Search-resurs från Azure-portalen.
AZURE_AI_SEARCH_API_KEY Det här värdet finns i avsnittet Inställningar> Keys när du undersöker din Azure AI Search-resurs från Azure-portalen. Du kan använda antingen den primära administratörsnyckeln eller den sekundära administratörsnyckeln. Om du alltid har två nycklar kan du rotera och återskapa nycklar på ett säkert sätt utan att orsaka avbrott i tjänsten.
AZURE_AI_SEARCH_INDEX Det här värdet motsvarar namnet på det index som du skapade för att lagra dina data. Du hittar den i avsnittet Översikt när du undersöker din Azure AI Search-resurs från Azure-portalen.

Miljövariabler

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

Exempel på cURL-kommandon

Azure OpenAI-chattmodellerna är optimerade för att fungera med indata som är formaterade som en konversation. Variabeln messages skickar en matris med ordlistor med olika roller i konversationen som avgränsas av system, användare, verktyg och assistent. Variabeln dataSources ansluter till ditt Azure AI Search-index och gör att Azure OpenAI-modeller kan svara med dina data.

Om du vill utlösa ett svar från modellen bör du sluta med ett användarmeddelande som anger att det är assistentens tur att svara.

Dricks

Det finns flera parametrar som du kan använda för att ändra modellens svar, till exempel temperature eller top_p. Mer information finns i referensdokumentationen.

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

Exempel på utdata

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

Chatta med din modell med hjälp av en webbapp

Om du vill börja chatta med Azure OpenAI-modellen som använder dina data kan du distribuera en webbapp med hjälp av Azure OpenAI Studio eller exempelkod som vi tillhandahåller på GitHub. Den här appen distribueras med Hjälp av Azure App Service och tillhandahåller ett användargränssnitt för att skicka frågor. Den här appen kan användas med Azure OpenAI-modeller som använder dina data eller modeller som inte använder dina data. Mer information om krav, konfiguration och distribution finns i readme-filen på lagringsplatsen. Du kan också anpassa klientdels- och serverdelslogik för webbappen genom att göra ändringar i källkoden.

Rensa resurser

Om du vill rensa och ta bort en Azure OpenAI- eller Azure AI Search-resurs kan du ta bort resursen eller resursgruppen. Om du tar bort resursgruppen tas även alla andra resurser som är associerade med den bort.

Nästa steg