Schnellstart: Chatten mit Azure OpenAI-Modellen mithilfe Ihrer eigenen Daten

Referenz | Quellcode | Paket (pypi) | Beispiele

Die obigen Links verweisen auf die OpenAI-API für Python. Es gibt kein Azure-spezifisches OpenAI Python SDK. Erfahren Sie, wie Sie zwischen den OpenAI-Diensten und Azure OpenAI-Diensten wechseln.

In dieser Schnellstartanleitung können Sie Ihre eigenen Daten mit Azure OpenAI-Modellen verwenden. Wenn Sie Azure OpenAI-Modelle für Ihre Daten verwenden, erhalten Sie eine leistungsstarke Konversations-KI-Plattform, die eine schnellere und präzisere Kommunikation ermöglicht.

Voraussetzungen

Hinzufügen Ihrer Daten mithilfe von Azure OpenAI Studio

Tipp

Sie können die Azure Developer CLI verwenden, um programmgesteuert die erforderlichen Ressourcen für Azure OpenAI für Ihre Daten zu erstellen.

Navigieren Sie zu Azure OpenAI Studio, und melden Sie sich mit den Anmeldeinformationen an, mit denen Sie Zugriff auf Ihre Azure OpenAI-Ressource haben. Wählen Sie während oder nach dem Anmeldeworkflow das passende Verzeichnis, Azure-Abonnement und die Azure OpenAI-Ressource aus.

  1. Wählen Sie die Kachel Eigene Daten verwenden aus.

    Ein Screenshot der Azure OpenAI Studio-Angebotsseite.

  2. Wählen Sie im daraufhin angezeigten Bereich unter Datenquelle auswählen die Option Dateien hochladen (Vorschau) aus. Azure OpenAI benötigt sowohl eine Speicherressource als auch eine Suchressource, um auf Ihre Daten zuzugreifen und diese zu indizieren.

    Tipp

    1. Damit Azure OpenAI auf Ihr Speicherkonto zugreifen kann, müssen Sie die Ressourcenfreigabe zwischen verschiedenen Ursprüngen (Cross-Origin Resource Sharing, CORS) aktivieren. Wenn CORS für die Azure Blob Storage-Ressource noch nicht aktiviert ist, wählen Sie CORS aktivieren aus.

    2. Wählen Sie Ihre Azure KI Search-Ressource und dann die Bestätigung, dass die Verbindung für Ihr Konto genutzt wird, aus. Wählen Sie Weiteraus.

    Ein Screenshot der Optionen zum Auswählen der Datenquelle in Azure OpenAI Studio.

  3. Wählen Sie im Bereich Dateien hochladen die Option Nach einer Datei suchen aus, und wählen Sie die Dateien aus, die Sie aus dem Abschnitt Voraussetzungen oder Ihren eigenen Daten heruntergeladen haben. Wählen Sie dann Dateien hochladen aus. Wählen Sie Weiteraus.

  4. Im Bereich Datenverwaltung können Sie auswählen, ob die semantische Suche oder die Vektorsuche für Ihren Index aktiviert werden soll.

    Wichtig

    • Für die semantische Suche und die Vektorsuche fallen zusätzliche Gebühren an. Sie müssen die SKU "Basic" oder eine höhere SKU auswählen, um die semantische Suche oder die Vektorsuche zu aktivieren. Weitere Informationen finden Sie unter Tarifdifferenz und Diensteinschränkungen.
    • Um die Qualität des Informationsabrufs und der Modellantwort zu verbessern, wird empfohlen, die semantische Suche für die folgenden Datenquellensprachen zu aktivieren: Englisch, Französisch, Spanisch, Portugiesisch, Italienisch, Deutsch, Chinesisch (Zh), Japanisch, Koreanisch, Russisch und Arabisch.
  5. Überprüfen Sie die eingegebenen Details, und wählen Sie Speichern und schließen aus. Sie können jetzt mit dem Modell chatten, und es verwendet Informationen aus Ihren Daten, um Antworten zu erstellen.

Playground für Chats

Beginnen Sie mit der Erkundung der Azure OpenAI-Funktionen mit einem No-Code-Ansatz mithilfe des Chatplaygrounds. Es handelt sich ganz einfach um ein Textfeld, in das Sie einen Befehlstext eingeben, um eine Vervollständigung zu generieren. Auf dieser Seite können Sie die Funktionen ganz einfach schrittweise erkunden und mit ihnen experimentieren.

Screenshot: Playground von Azure OpenAI Studio mit verschiedenen Abschnitten

Der Playground bietet Ihnen Optionen, um Ihre Chaterfahrung anzupassen. Auf der rechten Seite können Sie die Bereitstellung auswählen , um zu bestimmen, welches Modell mithilfe der Suchergebnisse aus Ihrem Index eine Antwort generiert. Sie wählen die Anzahl der vergangenen Nachrichten aus, die als Unterhaltungsverlauf für zukünftige generierte Antworten eingeschlossen werden sollen. Der Unterhaltungsverlauf gibt Kontext zum Generieren verwandter Antworten, nutzt aber auch die Tokenverwendung. Die Statusanzeige des Eingabetokens verfolgt die Tokenanzahl der von Ihnen übermittelten Frage.

Die erweiterten Einstellungen auf der linken Seite sind Laufzeitparameter, die Ihnen die Kontrolle über das Abrufen und Durchsuchen relevanter Informationen aus Ihren Daten ermöglichen. Ein guter Anwendungsfall ist, wenn Sie sicherstellen möchten, dass Antworten nur basierend auf Ihren Daten generiert werden, oder Sie finden, dass das Modell keine Antwort basierend auf vorhandenen Informationen zu Ihren Daten generieren kann.

  • Die Strenge bestimmt die Aggressivität des Systems beim Filtern von Suchdokumenten auf der Grundlage ihrer Ähnlichkeitswerte. Wenn Sie die Strenge auf 5 setzen, filtert das System die Dokumente aggressiv heraus und wendet eine sehr hohe Ähnlichkeitsschwelle an. Die semantische Suche kann in diesem Szenario hilfreich sein, da die Ranking-Modelle besser in der Lage sind, die Absicht der Suchanfrage zu erkennen. Eine geringere Strenge liefert ausführlichere Antworten, kann aber auch Informationen enthalten, die sich nicht in Ihrem Index befinden. Dieser Wert ist standardmäßig auf 3 eingestellt.

  • Abgerufene Dokumente ist eine ganze Zahl, die auf 3, 5, 10 oder 20 gesetzt werden kann und die Anzahl der Dokumentenstücke steuert, die dem großen Sprachmodell zur Formulierung der endgültigen Antwort zur Verfügung gestellt werden. Standardmäßig ist dieser Wert auf 5 festgelegt.

  • Wenn Antworten auf Ihre Daten einschränken aktiviert ist, versucht das Modell, sich nur auf Ihre Dokumente für Antworten zu verlassen. Dies ist standardmäßig auf true gesetzt.

Screenshot: „Erweiterte Einstellungen“

Senden Sie Ihre erste Abfrage. Die Chatmodelle funktionieren am besten mit Fragen und Antworten wie Beispiel: Was sind meine verfügbaren Gesundheitspläne? oder Was ist die Option Gesundheit plus?.

Abfragen, die eine Datenanalyse erfordern, würden wahrscheinlich fehlschlagen, z. B. Welcher Integritätsplan ist am beliebtesten?. Abfragen, die Informationen zu allen Daten erfordern, schlagen wahrscheinlich auch fehl, z. B. Wie viele Dokumente habe ich hochgeladen?. Denken Sie daran, dass die Suchmaschine nach Blöcken sucht, die exakte oder ähnliche Begriffe, Phrasen oder Konstruktionen wie die Suchanfrage enthalten. Das Modell mag zwar die Frage verstehen, aber wenn es sich bei den Suchergebnissen um Teile des Datensatzes handelt, sind das nicht die richtigen Informationen, um diese Art von Frage zu beantworten.

Außerdem werden Chats durch die Anzahl von Dokumenten (Blöcke) eingeschränkt, die in der Antwort zurückgegeben werden (beschränkt auf drei bis 20 im Playground von Azure OpenAI Studio). Wie Sie sich vorstellen können, erfordert das Stellen einer Frage zu „alle Titel“ einen vollständigen Scan des gesamten Vektorspeichers.

Bereitstellen Ihres Modells

Sobald Sie mit der Erfahrung im Azure OpenAI-Studio zufrieden sind, können Sie eine Web-App direkt aus dem Studio bereitstellen, indem Sie die Schaltfläche Bereitstellen in auswählen.

Screenshot: Schaltfläche für die Modellimplementierung in Azure OpenAI Studio

Dadurch können Sie entweder eine eigenständige Webanwendung oder einen Copilot in Copilot Studio (Vorschau) bereitstellen, wenn Sie ihre eigenen Daten im Modell verwenden.

Beispiel: Wenn Sie sich für die Bereitstellung einer Webanwendung entscheiden:

Wenn Sie zum ersten Mal eine Web-App bereitstellen, sollten Sie Neue Web-App erstellen auswählen. Geben Sie der App einen Namen, der Teil der App-URL wird. Beispiel: https://<appname>.azurewebsites.net.

Wählen Sie Ihr Abonnement, Ihre Ressourcengruppe, Ihren Standort und Ihren Preisplan für die veröffentlichte App aus. Um eine bestehende App zu aktualisieren, wählen Sie In einer vorhandenen Web-App veröffentlichen aus, und wählen Sie den Namen Ihrer vorherigen App aus dem Dropdownmenü.

Wenn Sie sich für die Bereitstellung einer Webanwendung entscheiden, lesen Sie diese wichtigen Überlegungen zur Verwendung.

Abrufen erforderlicher Variablen

Um erfolgreich einen Aufruf für Azure OpenAI auszuführen, benötigen Sie folgende Variablen. In diesem Schnellstart wird davon ausgegangen, dass Sie Ihre Daten in ein Azure Blob Storage-Konto hochgeladen und einen Azure KI Search-Index erstellt haben. Siehe Hinzufügen Ihrer Daten mithilfe von Azure KI Studio.

Variablenname Wert
AZURE_OPENAI_ENDPOINT Diesen Wert finden Sie im Abschnitt Schlüssel und Endpunkt, wenn Sie die Azure OpenAI-Ressource über das Azure-Portal untersuchen. Alternativ dazu finden Sie den Wert auch unter Azure KI Studio>Chatplayground>Codeansicht. Ein Beispielendpunkt ist https://my-resoruce.openai.azure.com.
AZURE_OPENAI_API_KEY Diesen Wert finden Sie im Abschnitt Ressourcenverwaltung>Schlüssel und Endpunkt, wenn Sie die Azure OpenAI-Ressource über das Azure-Portal untersuchen. Sie können KEY1 oder KEY2 verwenden. Wenn Sie jederzeit zwei Schlüssel zur Verfügung haben, können Sie die Schlüssel auf sichere Weise rotieren und neu generieren, ohne Dienstunterbrechungen zu verursachen.
AZURE_OPENAI_DEPLOYMENT_ID Dieser Wert entspricht dem benutzerdefinierten Namen, den Sie während der Bereitstellung eines Modells für die Bereitstellung ausgewählt haben. Sie finden diesen Wert im Azure-Portal unter Ressourcenverwaltung>Bereitstellungen oder in Azure KI Studio unter Verwaltung>Bereitstellungen.
AZURE_AI_SEARCH_ENDPOINT Diesen Wert finden Sie im Abschnitt Übersicht, wenn Sie die Azure KI Search-Ressource über das Azure-Portal untersuchen.
AZURE_AI_SEARCH_API_KEY Diesen Wert finden Sie im Abschnitt Einstellungen>Schlüssel, wenn Sie die Azure KI Search-Ressource über das Azure-Portal untersuchen. Sie können entweder den primären oder den sekundären Administratorschlüssel verwenden. Wenn Sie jederzeit zwei Schlüssel zur Verfügung haben, können Sie die Schlüssel auf sichere Weise rotieren und neu generieren, ohne Dienstunterbrechungen zu verursachen.
AZURE_AI_SEARCH_INDEX Dieser Wert entspricht dem Namen des Indexes, den Sie zum Speichern Ihrer Daten erstellt haben. Sie finden ihn im Abschnitt Übersicht, wenn Sie die Azure KI Search-Ressource aus dem Azure-Portal untersuchen.

Umgebungsvariablen

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

Erstellen einer neuen .NET Core-Anwendung

Verwenden Sie in einem Konsolenfenster (z. B. cmd, PowerShell oder Bash) den Befehl dotnet new zum Erstellen einer neuen Konsolen-App mit dem Namen azure-openai-quickstart. Dieser Befehl erstellt ein einfaches „Hallo Welt“-Projekt mit einer einzigen C#-Quelldatei: Program.cs.

dotnet new console -n azure-openai-quickstart

Wechseln Sie zum Ordner der neu erstellten App. Sie können die Anwendung mit folgendem Befehl erstellen:

dotnet build

Die Buildausgabe sollte keine Warnungen oder Fehler enthalten.

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

Installieren Sie die OpenAI .NET-Clientbibliothek mit:

dotnet add package Azure.AI.OpenAI --prerelease

Öffnen Sie im Projektverzeichnis die Datei Program.cs, und ersetzen Sie den Inhalt durch den folgenden Code:

Ohne Antwortstreaming

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

Wichtig

Verwenden Sie für die Produktion eine sichere Art der Speicherung und des Zugriffs auf Ihre Anmeldeinformationen wie Azure Key Vault. Weitere Informationen zur Sicherheit von Anmeldeinformationen finden Sie im Azure KI Services-Artikel Sicherheit.

dotnet run program.cs

Ausgabe

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

Dadurch wird gewartet, bis das Modell seine gesamte Antwort generiert hat, bevor die Ergebnisse gedruckt werden. Wenn Sie die Antwort asynchron streamen und die Ergebnisse drucken möchten, können Sie alternativ den Inhalt von Program.cs durch den Code im nächsten Beispiel ersetzen.

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

Abrufen erforderlicher Variablen

Um erfolgreich einen Aufruf für Azure OpenAI auszuführen, benötigen Sie folgende Variablen. In diesem Schnellstart wird davon ausgegangen, dass Sie Ihre Daten in ein Azure Blob Storage-Konto hochgeladen und einen Azure KI Search-Index erstellt haben. Weitere Informationen finden Sie unter Hinzufügen Ihrer Daten mit Azure KI Studio.

Variablenname Wert
AZURE_OPENAI_ENDPOINT Diesen Wert finden Sie im Abschnitt Schlüssel und Endpunkt, wenn Sie die Azure OpenAI-Ressource über das Azure-Portal untersuchen. Alternativ dazu finden Sie den Wert auch unter Azure KI Studio>Chatplayground>Codeansicht. Ein Beispielendpunkt ist https://my-resource.openai.azure.com.
AZURE_OPENAI_API_KEY Diesen Wert finden Sie im Abschnitt Ressourcenverwaltung>Schlüssel und Endpunkt, wenn Sie die Azure OpenAI-Ressource über das Azure-Portal untersuchen. Sie können KEY1 oder KEY2 verwenden. Wenn Sie jederzeit zwei Schlüssel zur Verfügung haben, können Sie die Schlüssel auf sichere Weise rotieren und neu generieren, ohne Dienstunterbrechungen zu verursachen.
AZURE_OPEN_AI_DEPLOYMENT_ID Dieser Wert entspricht dem benutzerdefinierten Namen, den Sie während der Bereitstellung eines Modells für die Bereitstellung ausgewählt haben. Diesen Wert finden Sie im Azure-Portal unter Ressourcenverwaltung>Bereitstellungen oder in Azure KI Studio unter Verwaltung>Bereitstellungen.
AZURE_AI_SEARCH_ENDPOINT Diesen Wert finden Sie im Abschnitt Übersicht, wenn Sie die Azure KI Search-Ressource aus dem Azure-Portal untersuchen.
AZURE_AI_SEARCH_API_KEY Diesen Wert finden Sie im Abschnitt Einstellungen>Schlüssel, wenn Sie die Azure KI Search-Ressource über das Azure-Portal untersuchen. Sie können entweder den primären oder den sekundären Administratorschlüssel verwenden. Wenn Sie jederzeit zwei Schlüssel zur Verfügung haben, können Sie die Schlüssel auf sichere Weise rotieren und neu generieren, ohne Dienstunterbrechungen zu verursachen.
AZURE_AI_SEARCH_INDEX Dieser Wert entspricht dem Namen des Indexes, den Sie zum Speichern Ihrer Daten erstellt haben. Sie finden ihn im Abschnitt Übersicht, wenn Sie die Azure KI Search-Ressource aus dem Azure-Portal untersuchen.

Umgebungsvariablen

Hinweis

Spring KI setzt den Modellnamen standardmäßig auf gpt-35-turbo. Es ist nur erforderlich, den SPRING_AI_AZURE_OPENAI_MODEL Wert bereitzustellen, wenn Sie ein Modell mit einem anderen Namen bereitgestellt haben.

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

Erstellen einer neuen Spring-Anwendung

Spring KI unterstützt derzeit nicht die Optionen, mit AzureCognitiveSearchChatExtensionConfiguration denen eine Azure KI-Abfrage die Methode Retrieval Augmented Generation (RAG) kapselt und die Details vom Benutzer ausblenden kann. Alternativ können Sie die RAG-Methode weiterhin direkt in Ihrer Anwendung aufrufen, um Daten in Ihrem Azure KI-Such-Index abzufragen und abgerufene Dokumente zur Erweiterung Ihrer Abfrage zu verwenden.

Spring AI unterstützt eine VectorStore-Abstraktion, und Sie können Azure AI Search in eine Spring AI VectorStore-Implementierung verpacken, um Ihre benutzerdefinierten Daten abzufragen. Das folgende Projekt implementiert einen benutzerdefinierten VectorStore, der von Azure AI Search unterstützt wird, und führt direkt RAG-Operationen aus.

Erstellen Sie in einem Bash-Fenster ein neues Verzeichnis für Ihre App und navigieren Sie dorthin.

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

Führen Sie den Befehl spring init in Ihrem Arbeitsverzeichnis aus. Dieser Befehl erstellt eine Standardverzeichnisstruktur für Ihr Spring-Projekt, einschließlich der Hauptquelldatei der Java-Klassen und der Datei pom.xml, die für die Verwaltung von Maven-basierten Projekten verwendet wird.

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

Die generierten Dateien und Ordner ähneln der folgenden 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

Spring-Anwendung bearbeiten

  1. Bearbeiten Sie die pom.xml-Datei.

    Öffnen Sie im Stammverzeichnis des Projektverzeichnisses die Datei pom.xml in Ihrem bevorzugten Editor oder ihrer IDE, und überschreiben Sie die Datei mit folgendem Inhalt:

    <?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. Öffnen Sie im Ordner src/main/java/com/example/aicustomdatademoAiCustomDataApplication.java in Ihrem bevorzugten Editor oder ihrer IDE, und fügen Sie den folgenden Code ein:

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

    Wichtig

    Verwenden Sie für die Produktion eine sichere Art der Speicherung und des Zugriffs auf Ihre Anmeldeinformationen wie Azure Key Vault. Weitere Informationen zur Sicherheit von Anmeldeinformationen finden Sie im Azure KI Services-Artikel Sicherheit.

  3. Navigieren Sie zurück zum Projektstammordner, und führen Sie die App mithilfe des folgenden Befehls aus:

    ./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.

Abrufen erforderlicher Variablen

Um erfolgreich einen Aufruf für Azure OpenAI auszuführen, benötigen Sie folgende Variablen. In diesem Schnellstart wird davon ausgegangen, dass Sie Ihre Daten in ein Azure Blob Storage-Konto hochgeladen und einen Azure KI Search-Index erstellt haben. Siehe Hinzufügen Ihrer Daten mithilfe von Azure KI Studio.

Variablenname Wert
AZURE_OPENAI_ENDPOINT Diesen Wert finden Sie im Abschnitt Schlüssel und Endpunkt, wenn Sie die Azure OpenAI-Ressource über das Azure-Portal untersuchen. Alternativ dazu finden Sie den Wert auch unter Azure KI Studio>Chatplayground>Codeansicht. Ein Beispielendpunkt ist https://my-resoruce.openai.azure.com.
AZURE_OPENAI_API_KEY Diesen Wert finden Sie im Abschnitt Ressourcenverwaltung>Schlüssel und Endpunkt, wenn Sie die Azure OpenAI-Ressource über das Azure-Portal untersuchen. Sie können KEY1 oder KEY2 verwenden. Wenn Sie jederzeit zwei Schlüssel zur Verfügung haben, können Sie die Schlüssel auf sichere Weise rotieren und neu generieren, ohne Dienstunterbrechungen zu verursachen.
AZURE_OPENAI_DEPLOYMENT_ID Dieser Wert entspricht dem benutzerdefinierten Namen, den Sie während der Bereitstellung eines Modells für die Bereitstellung ausgewählt haben. Sie finden diesen Wert im Azure-Portal unter Ressourcenverwaltung>Bereitstellungen oder in Azure KI Studio unter Verwaltung>Bereitstellungen.
AZURE_AI_SEARCH_ENDPOINT Diesen Wert finden Sie im Abschnitt Übersicht, wenn Sie die Azure KI Search-Ressource über das Azure-Portal untersuchen.
AZURE_AI_SEARCH_API_KEY Diesen Wert finden Sie im Abschnitt Einstellungen>Schlüssel, wenn Sie die Azure KI Search-Ressource über das Azure-Portal untersuchen. Sie können entweder den primären oder den sekundären Administratorschlüssel verwenden. Wenn Sie jederzeit zwei Schlüssel zur Verfügung haben, können Sie die Schlüssel auf sichere Weise rotieren und neu generieren, ohne Dienstunterbrechungen zu verursachen.
AZURE_AI_SEARCH_INDEX Dieser Wert entspricht dem Namen des Indexes, den Sie zum Speichern Ihrer Daten erstellt haben. Sie finden ihn im Abschnitt Übersicht, wenn Sie die Azure KI Search-Ressource aus dem Azure-Portal untersuchen.

Umgebungsvariablen

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

Erstellen einer Node.-Anwendung

Erstellen Sie in einem Konsolenfenster (etwa cmd, PowerShell oder Bash) ein neues Verzeichnis für Ihre App, und rufen Sie es auf. Führen Sie dann den Befehl npm init aus, um eine Knotenanwendung mit einer Datei des Typs package.json zu erstellen.

npm init

Installieren der Clientbibliothek

Installieren Sie den Azure OpenAI-Client und die Azure Identity-Bibliotheken für JavaScript mit npm:

npm install @azure/openai @azure/identity

Die Datei package.json Ihrer App wird mit den Abhängigkeiten aktualisiert.

Erstellen einer Beispielanwendung

Öffnen Sie am gewünschten Speicherort für das neue Projekt eine Eingabeaufforderung, und erstellen Sie eine neue Datei mit dem Namen „ChatWithOwnData.js“. Kopieren Sie den folgenden Code in die Datei „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 };

Wichtig

Verwenden Sie für die Produktion eine sichere Art der Speicherung und des Zugriffs auf Ihre Anmeldeinformationen wie Azure Key Vault. Weitere Informationen zur Sicherheit von Anmeldeinformationen finden Sie im Azure KI Services-Artikel Sicherheit.

node.exe ChatWithOwnData.js

Ausgabe

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.

Abrufen erforderlicher Variablen

Um erfolgreich einen Aufruf für Azure OpenAI auszuführen, benötigen Sie folgende Variablen. In diesem Schnellstart wird davon ausgegangen, dass Sie Ihre Daten in ein Azure Blob Storage-Konto hochgeladen und einen Azure KI Search-Index erstellt haben. Siehe Hinzufügen Ihrer Daten mithilfe von Azure KI Studio.

Variablenname Wert
AZURE_OPENAI_ENDPOINT Diesen Wert finden Sie im Abschnitt Schlüssel und Endpunkt, wenn Sie die Azure OpenAI-Ressource über das Azure-Portal untersuchen. Alternativ dazu finden Sie den Wert auch unter Azure KI Studio>Chatplayground>Codeansicht. Ein Beispielendpunkt ist https://my-resoruce.openai.azure.com.
AZURE_OPENAI_API_KEY Diesen Wert finden Sie im Abschnitt Ressourcenverwaltung>Schlüssel und Endpunkt, wenn Sie die Azure OpenAI-Ressource über das Azure-Portal untersuchen. Sie können KEY1 oder KEY2 verwenden. Wenn Sie jederzeit zwei Schlüssel zur Verfügung haben, können Sie die Schlüssel auf sichere Weise rotieren und neu generieren, ohne Dienstunterbrechungen zu verursachen.
AZURE_OPENAI_DEPLOYMENT_ID Dieser Wert entspricht dem benutzerdefinierten Namen, den Sie während der Bereitstellung eines Modells für die Bereitstellung ausgewählt haben. Sie finden diesen Wert im Azure-Portal unter Ressourcenverwaltung>Bereitstellungen oder in Azure KI Studio unter Verwaltung>Bereitstellungen.
AZURE_AI_SEARCH_ENDPOINT Diesen Wert finden Sie im Abschnitt Übersicht, wenn Sie die Azure KI Search-Ressource über das Azure-Portal untersuchen.
AZURE_AI_SEARCH_API_KEY Diesen Wert finden Sie im Abschnitt Einstellungen>Schlüssel, wenn Sie die Azure KI Search-Ressource über das Azure-Portal untersuchen. Sie können entweder den primären oder den sekundären Administratorschlüssel verwenden. Wenn Sie jederzeit zwei Schlüssel zur Verfügung haben, können Sie die Schlüssel auf sichere Weise rotieren und neu generieren, ohne Dienstunterbrechungen zu verursachen.
AZURE_AI_SEARCH_INDEX Dieser Wert entspricht dem Namen des Indexes, den Sie zum Speichern Ihrer Daten erstellt haben. Sie finden ihn im Abschnitt Übersicht, wenn Sie die Azure KI Search-Ressource aus dem Azure-Portal untersuchen.

Umgebungsvariablen

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

Erstellen einer Python-Umgebung

  1. Erstellen Sie einen neuen Ordner namens openai-python für Ihr Projekt und eine neue Python-Codedatei mit dem Namen main.py. In dieses Verzeichnis wechseln:
mkdir openai-python
cd openai-python
  1. Installieren Sie die folgenden Python-Bibliotheken:
pip install openai
pip install python-dotenv

Erstellen der Python-App

  1. Öffnen Sie über das Projektverzeichnis die Datei main.py, und fügen Sie Folgendes hinzu:
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))

Wichtig

Verwenden Sie für die Produktion eine sichere Art der Speicherung und des Zugriffs auf Ihre Anmeldeinformationen wie Azure Key Vault. Weitere Informationen zur Sicherheit von Anmeldeinformationen finden Sie im Azure KI Services-Artikel Sicherheit.

  1. Führen Sie den folgenden Befehl aus:
python main.py

Die Anwendung druckt die Antwort in einem JSON-Format, das für die Verwendung in vielen Szenarien geeignet ist. Sie enthält sowohl Antworten auf Ihre Abfrage als auch Zitate aus Ihren hochgeladenen Dateien.

Abrufen erforderlicher Variablen

Um erfolgreich einen Aufruf für Azure OpenAI auszuführen, benötigen Sie folgende Variablen. In diesem Schnellstart wird davon ausgegangen, dass Sie Ihre Daten in ein Azure Blob Storage-Konto hochgeladen und einen Azure KI Search-Index erstellt haben. Siehe Hinzufügen Ihrer Daten mithilfe von Azure KI Studio.

Variablenname Wert
AZURE_OPENAI_ENDPOINT Diesen Wert finden Sie im Abschnitt Schlüssel und Endpunkt, wenn Sie die Azure OpenAI-Ressource über das Azure-Portal untersuchen. Alternativ dazu finden Sie den Wert auch unter Azure KI Studio>Chatplayground>Codeansicht. Ein Beispielendpunkt ist https://my-resoruce.openai.azure.com.
AZURE_OPENAI_API_KEY Diesen Wert finden Sie im Abschnitt Ressourcenverwaltung>Schlüssel und Endpunkt, wenn Sie die Azure OpenAI-Ressource über das Azure-Portal untersuchen. Sie können KEY1 oder KEY2 verwenden. Wenn Sie jederzeit zwei Schlüssel zur Verfügung haben, können Sie die Schlüssel auf sichere Weise rotieren und neu generieren, ohne Dienstunterbrechungen zu verursachen.
AZURE_OPENAI_DEPLOYMENT_ID Dieser Wert entspricht dem benutzerdefinierten Namen, den Sie während der Bereitstellung eines Modells für die Bereitstellung ausgewählt haben. Sie finden diesen Wert im Azure-Portal unter Ressourcenverwaltung>Bereitstellungen oder in Azure KI Studio unter Verwaltung>Bereitstellungen.
AZURE_AI_SEARCH_ENDPOINT Diesen Wert finden Sie im Abschnitt Übersicht, wenn Sie die Azure KI Search-Ressource über das Azure-Portal untersuchen.
AZURE_AI_SEARCH_API_KEY Diesen Wert finden Sie im Abschnitt Einstellungen>Schlüssel, wenn Sie die Azure KI Search-Ressource über das Azure-Portal untersuchen. Sie können entweder den primären oder den sekundären Administratorschlüssel verwenden. Wenn Sie jederzeit zwei Schlüssel zur Verfügung haben, können Sie die Schlüssel auf sichere Weise rotieren und neu generieren, ohne Dienstunterbrechungen zu verursachen.
AZURE_AI_SEARCH_INDEX Dieser Wert entspricht dem Namen des Indexes, den Sie zum Speichern Ihrer Daten erstellt haben. Sie finden ihn im Abschnitt Übersicht, wenn Sie die Azure KI Search-Ressource aus dem Azure-Portal untersuchen.

Umgebungsvariablen

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

PowerShell-Beispielbefehle

Die Azure OpenAI Optimieren-Chatmodelle sind für die Verwendung von Eingaben optimiert, die als Unterhaltung formatiert sind. Die Variable messages übergibt ein Array von Wörterbüchern mit verschiedenen Rollen in der Unterhaltung, die nach System, Benutzer, Tool und Assistent abgegrenzt sind. Die dataSources Variable stellt eine Verbindung mit Ihrem Azure Cognitive Search-Index her und ermöglicht es Azure OpenAI-Modellen, mithilfe Ihrer Daten zu reagieren.

Um eine Antwort des Modells auszulösen, sollte Sie mit einer Benutzernachricht enden, die angibt, dass nun der Assistent reagieren muss.

Tipp

Es gibt mehrere Parameter, mit denen Sie die Antwort des Modells ändern können, z. B. temperature oder top_p. Weitere Informationen finden Sie in der Referenzdokumentation.

# 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

Beispielausgabe

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

Wichtig

Verwenden Sie für die Produktion eine sichere Art der Speicherung und des Zugriffs auf Ihre Anmeldeinformationen wie die PowerShell-Geheimnisverwaltung mit Azure Key Vault. Weitere Informationen zur Sicherheit von Anmeldeinformationen finden Sie im Azure KI Services-Artikel Sicherheit.

Chatten mit Ihrem Modell mithilfe einer Web-App

Um mit dem Azure OpenAI-Modell zu chatten, das Ihre Daten verwendet, können Sie eine Web-App mithilfe von Azure OpenAI Studio oder mithilfe von Beispielcode bereitstellen, den wir auf GitHub bereitstellen. Diese App wird mithilfe von Azure App Service bereitgestellt und bietet eine Benutzeroberfläche zum Senden von Abfragen. Diese App kann mit Azure OpenAI-Modellen verwendet werden, die Ihre Daten verwenden, oder Modellen, die Ihre Daten nicht verwenden. Anweisungen zu Anforderungen, zum Setup und zur Bereitstellung finden Sie in der Infodatei im Repository. Optional können Sie die Front-End- und Back-End-Logik der Web-App anpassen, indem Sie Änderungen am Quellcode vornehmen.

Abrufen erforderlicher Variablen

Um erfolgreich einen Aufruf für Azure OpenAI auszuführen, benötigen Sie folgende Variablen. In diesem Schnellstart wird davon ausgegangen, dass Sie Ihre Daten in ein Azure Blob Storage-Konto hochgeladen und einen Azure KI Search-Index erstellt haben. Siehe Hinzufügen Ihrer Daten mithilfe von Azure KI Studio.

Variablenname Wert
AZURE_OPENAI_ENDPOINT Diesen Wert finden Sie im Abschnitt Schlüssel und Endpunkt, wenn Sie die Azure OpenAI-Ressource über das Azure-Portal untersuchen. Alternativ dazu finden Sie den Wert auch unter Azure KI Studio>Chatplayground>Codeansicht. Ein Beispielendpunkt ist https://my-resoruce.openai.azure.com.
AZURE_OPENAI_API_KEY Diesen Wert finden Sie im Abschnitt Ressourcenverwaltung>Schlüssel und Endpunkt, wenn Sie die Azure OpenAI-Ressource über das Azure-Portal untersuchen. Sie können KEY1 oder KEY2 verwenden. Wenn Sie jederzeit zwei Schlüssel zur Verfügung haben, können Sie die Schlüssel auf sichere Weise rotieren und neu generieren, ohne Dienstunterbrechungen zu verursachen.
AZURE_OPENAI_DEPLOYMENT_ID Dieser Wert entspricht dem benutzerdefinierten Namen, den Sie während der Bereitstellung eines Modells für die Bereitstellung ausgewählt haben. Sie finden diesen Wert im Azure-Portal unter Ressourcenverwaltung>Bereitstellungen oder in Azure KI Studio unter Verwaltung>Bereitstellungen.
AZURE_AI_SEARCH_ENDPOINT Diesen Wert finden Sie im Abschnitt Übersicht, wenn Sie die Azure KI Search-Ressource über das Azure-Portal untersuchen.
AZURE_AI_SEARCH_API_KEY Diesen Wert finden Sie im Abschnitt Einstellungen>Schlüssel, wenn Sie die Azure KI Search-Ressource über das Azure-Portal untersuchen. Sie können entweder den primären oder den sekundären Administratorschlüssel verwenden. Wenn Sie jederzeit zwei Schlüssel zur Verfügung haben, können Sie die Schlüssel auf sichere Weise rotieren und neu generieren, ohne Dienstunterbrechungen zu verursachen.
AZURE_AI_SEARCH_INDEX Dieser Wert entspricht dem Namen des Indexes, den Sie zum Speichern Ihrer Daten erstellt haben. Sie finden ihn im Abschnitt Übersicht, wenn Sie die Azure KI Search-Ressource aus dem Azure-Portal untersuchen.

Umgebungsvariablen

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

Erstellen einer Go-Umgebung

  1. Erstellen Sie einen neuen Ordner namens openai-go für Ihr Projekt und eine neue Go-Codedatei mit dem Namen sample.go. In dieses Verzeichnis wechseln:

    mkdir openai-go
    cd openai-go
    
  2. Installieren Sie die folgenden Go-Pakete:

    go get github.com/Azure/azure-sdk-for-go/sdk/ai/azopenai
    
  3. Aktivieren Sie die Abhängigkeitsnachverfolgung für Ihren Code.

    go mod init example/azure-openai
    

Erstellen der Go-App

  1. Öffnen Sie im Projektverzeichnis die Datei sample.go, und fügen Sie den folgenden Code hinzu:

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

    Wichtig

    Verwenden Sie für die Produktion eine sichere Art der Speicherung und des Zugriffs auf Ihre Anmeldeinformationen wie Azure Key Vault. Weitere Informationen zur Sicherheit von Anmeldeinformationen finden Sie im Azure KI Services-Artikel Sicherheit.

  2. Führen Sie den folgenden Befehl aus:

    go run sample.go
    

    Die Anwendung druckt die Antwort, einschließlich der Antworten auf Ihre Abfrage und Zitate aus Ihren hochgeladenen Dateien.

Abrufen erforderlicher Variablen

Um erfolgreich einen Aufruf für Azure OpenAI auszuführen, benötigen Sie folgende Variablen. In diesem Schnellstart wird davon ausgegangen, dass Sie Ihre Daten in ein Azure Blob Storage-Konto hochgeladen und einen Azure KI Search-Index erstellt haben. Siehe Hinzufügen Ihrer Daten mithilfe von Azure KI Studio.

Variablenname Wert
AZURE_OPENAI_ENDPOINT Diesen Wert finden Sie im Abschnitt Schlüssel und Endpunkt, wenn Sie die Azure OpenAI-Ressource über das Azure-Portal untersuchen. Alternativ dazu finden Sie den Wert auch unter Azure KI Studio>Chatplayground>Codeansicht. Ein Beispielendpunkt ist https://my-resoruce.openai.azure.com.
AZURE_OPENAI_API_KEY Diesen Wert finden Sie im Abschnitt Ressourcenverwaltung>Schlüssel und Endpunkt, wenn Sie die Azure OpenAI-Ressource über das Azure-Portal untersuchen. Sie können KEY1 oder KEY2 verwenden. Wenn Sie jederzeit zwei Schlüssel zur Verfügung haben, können Sie die Schlüssel auf sichere Weise rotieren und neu generieren, ohne Dienstunterbrechungen zu verursachen.
AZURE_OPENAI_DEPLOYMENT_ID Dieser Wert entspricht dem benutzerdefinierten Namen, den Sie während der Bereitstellung eines Modells für die Bereitstellung ausgewählt haben. Sie finden diesen Wert im Azure-Portal unter Ressourcenverwaltung>Bereitstellungen oder in Azure KI Studio unter Verwaltung>Bereitstellungen.
AZURE_AI_SEARCH_ENDPOINT Diesen Wert finden Sie im Abschnitt Übersicht, wenn Sie die Azure KI Search-Ressource über das Azure-Portal untersuchen.
AZURE_AI_SEARCH_API_KEY Diesen Wert finden Sie im Abschnitt Einstellungen>Schlüssel, wenn Sie die Azure KI Search-Ressource über das Azure-Portal untersuchen. Sie können entweder den primären oder den sekundären Administratorschlüssel verwenden. Wenn Sie jederzeit zwei Schlüssel zur Verfügung haben, können Sie die Schlüssel auf sichere Weise rotieren und neu generieren, ohne Dienstunterbrechungen zu verursachen.
AZURE_AI_SEARCH_INDEX Dieser Wert entspricht dem Namen des Indexes, den Sie zum Speichern Ihrer Daten erstellt haben. Sie finden ihn im Abschnitt Übersicht, wenn Sie die Azure KI Search-Ressource aus dem Azure-Portal untersuchen.

Umgebungsvariablen

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

CURL-Beispielbefehl

Die Azure OpenAI Optimieren-Chatmodelle sind für die Verwendung von Eingaben optimiert, die als Unterhaltung formatiert sind. Die Variable messages übergibt ein Array von Wörterbüchern mit verschiedenen Rollen in der Unterhaltung, die nach System, Benutzer, Tool und Assistent abgegrenzt sind. Die Variable dataSources stellt eine Verbindung mit Ihrem Azure KI Search-Index her und ermöglicht es Azure OpenAI-Modellen, mithilfe Ihrer Daten zu reagieren.

Um eine Antwort des Modells auszulösen, sollte Sie mit einer Benutzernachricht enden, die angibt, dass nun der Assistent reagieren muss.

Tipp

Es gibt mehrere Parameter, mit denen Sie die Antwort des Modells ändern können, z. B. temperature oder top_p. Weitere Informationen finden Sie in der Referenzdokumentation.

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

Beispielausgabe

{
    "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 mit Ihrem Modell mithilfe einer Web-App

Um mit dem Azure OpenAI-Modell zu chatten, das Ihre Daten verwendet, können Sie eine Web-App mithilfe von Azure OpenAI Studio oder mithilfe von Beispielcode bereitstellen, den wir auf GitHub bereitstellen. Diese App wird mithilfe von Azure App Service bereitgestellt und bietet eine Benutzeroberfläche zum Senden von Abfragen. Diese App kann mit Azure OpenAI-Modellen verwendet werden, die Ihre Daten verwenden, oder Modellen, die Ihre Daten nicht verwenden. Anweisungen zu Anforderungen, zum Setup und zur Bereitstellung finden Sie in der Infodatei im Repository. Optional können Sie die Front-End- und Back-End-Logik der Web-App anpassen, indem Sie Änderungen am Quellcode vornehmen.

Bereinigen von Ressourcen

Wenn Sie eine Azure OpenAI- oder Azure KI-Suche-Ressource bereinigen und entfernen möchten, können Sie die Ressource selbst oder die Ressourcengruppe löschen. Wenn Sie die Ressourcengruppe löschen, werden auch alle anderen Ressourcen gelöscht, die ihr zugeordnet sind.

Nächste Schritte