Szybki start: czat z modelami usługi Azure OpenAI przy użyciu własnych danych

Odwołania do | pakietu kodu | źródłowego (npm)Samples |

Odwołania | do pakietu kodu | źródłowego (pypi)Samples |

Powyższe linki odwołują się do interfejsu API openAI dla języka Python. Nie ma zestawu SDK języka Python specyficznego dla platformy Azure dla platformy Azure. Dowiedz się, jak przełączać się między usługami OpenAI i usługami Azure OpenAI.

Odwołania | do pakietu kodu | źródłowego (Go)Samples |

W tym przewodniku Szybki start możesz używać własnych danych z modelami usługi Azure OpenAI. Korzystanie z modeli usługi Azure OpenAI na danych może zapewnić zaawansowaną platformę konwersacyjnej sztucznej inteligencji, która umożliwia szybszą i dokładniejszą komunikację.

Wymagania wstępne

Dodawanie danych przy użyciu programu Azure OpenAI Studio

Napiwek

Interfejs wiersza polecenia dla deweloperów platformy Azure umożliwia programowe tworzenie zasobów potrzebnych do korzystania z usługi Azure OpenAI On Your Data

Przejdź do usługi Azure OpenAI Studio i zaloguj się przy użyciu poświadczeń, które mają dostęp do zasobu usługi Azure OpenAI. Podczas lub po przepływie pracy logowania wybierz odpowiedni katalog, subskrypcję platformy Azure i zasób usługi Azure OpenAI.

  1. Wybierz kafelek Bring your own data (Korzystanie z własnych danych)

    Zrzut ekranu przedstawiający stronę docelową usługi Azure OpenAI Studio.

  2. W wyświetlonym okienku wybierz pozycję Przekaż pliki (wersja zapoznawcza) w obszarze Wybierz źródło danych. Usługa Azure OpenAI wymaga zarówno zasobu magazynu, jak i zasobu wyszukiwania w celu uzyskania dostępu do danych i indeksowania ich.

    Napiwek

    1. Aby usługa Azure OpenAI uzyskiwała dostęp do konta magazynu, należy włączyć współużytkowanie zasobów między źródłami (CORS). Jeśli mechanizm CORS nie jest jeszcze włączony dla zasobu usługi Azure Blob Storage, wybierz pozycję Włącz mechanizm CORS.

    2. Wybierz zasób usługi Azure AI Search i wybierz potwierdzenie, że połączenie spowoduje naliczenie użycia na twoim koncie. Następnie kliknij przycisk Dalej.

    Zrzut ekranu przedstawiający opcje wybierania źródła danych w programie Azure OpenAI Studio.

  3. W okienku Przekazywanie plików wybierz pozycję Przeglądaj dla pliku i wybierz pliki pobrane z sekcji wymagań wstępnych lub własne dane. Następnie wybierz pozycję Przekaż pliki. Następnie kliknij przycisk Dalej.

  4. W okienku Zarządzanie danymi możesz wybrać, czy włączyć wyszukiwanie semantyczne, czy wektorowe wyszukiwanie indeksu.

    Ważne

    • Wyszukiwanie semantyczne i wyszukiwanie wektorów podlegają dodatkowym cenom. Aby włączyć wyszukiwanie semantyczne lub wyszukiwanie wektorów, musisz wybrać jednostkę SKU Podstawowa lub nowsza jednostka SKU . Aby uzyskać więcej informacji, zobacz różnice w warstwie cenowej i limity usług.
    • Aby poprawić jakość pobierania informacji i odpowiedzi modelu, zalecamy włączenie semantycznego wyszukiwania następujących języków źródła danych: angielski, francuski, hiszpański, portugalski, włoski, niemiecki, chiński (Zh), japoński, koreański, rosyjski i arabski.
  5. Przejrzyj wprowadzone szczegóły, a następnie wybierz pozycję Zapisz i zamknij. Teraz możesz porozmawiać z modelem i będzie używać informacji z danych do konstruowania odpowiedzi.

Czat — plac zabaw

Zacznij eksplorować możliwości usługi Azure OpenAI przy użyciu podejścia bez kodu za pośrednictwem placu zabaw czatu. Jest to po prostu pole tekstowe, w którym można przesłać monit o wygenerowanie ukończenia. Na tej stronie można szybko iterować i eksperymentować z możliwościami.

Zrzut ekranu przedstawiający stronę placu zabaw programu Azure OpenAI Studio z wyróżnionymi sekcjami.

Plac zabaw oferuje opcje dostosowywania środowiska czatu. Po prawej stronie możesz wybrać pozycję Wdrożenie , aby określić, który model generuje odpowiedź przy użyciu wyników wyszukiwania z indeksu. Możesz wybrać liczbę wcześniejszych wiadomości, które mają być uwzględniane jako historia konwersacji dla przyszłych wygenerowanych odpowiedzi. Historia konwersacji udostępnia kontekst generowania powiązanych odpowiedzi, ale także używa użycia tokenu. Wskaźnik postępu tokenu wejściowego śledzi liczbę przesłanych tokenów.

Ustawienia zaawansowane po lewej stronie to parametry środowiska uruchomieniowego, które zapewniają kontrolę nad pobieraniem i wyszukiwaniem odpowiednich informacji z danych. Dobrym przypadkiem użycia jest to, że chcesz upewnić się, że odpowiedzi są generowane tylko na podstawie danych lub model nie może wygenerować odpowiedzi na podstawie istniejących informacji o danych.

  • Ścisłość określa agresywność systemu w filtrowaniu dokumentów wyszukiwania na podstawie ich wyników podobieństwa. Ustawienie ścisłej wartości 5 oznacza, że system będzie agresywnie filtrować dokumenty, stosując bardzo wysoki próg podobieństwa. Wyszukiwanie semantyczne może być przydatne w tym scenariuszu, ponieważ modele klasyfikacji wykonują lepszą pracę wywnioskowania intencji zapytania. Niższe poziomy ścisłości dają bardziej pełne odpowiedzi, ale mogą również zawierać informacje, które nie znajdują się w indeksie. Ta wartość jest domyślnie ustawiona na 3.

  • Pobrane dokumenty to liczba całkowita, która może być ustawiona na 3, 5, 10 lub 20 i kontroluje liczbę fragmentów dokumentu dostarczonych do dużego modelu językowego na potrzeby formułowania końcowej odpowiedzi. Domyślnie jest ustawiona wartość 5.

  • Po włączeniu opcji Ogranicz odpowiedzi na dane model próbuje polegać tylko na dokumentach na potrzeby odpowiedzi. Ta wartość jest domyślnie ustawiona na wartość true.

Zrzut ekranu przedstawiający ustawienia zaawansowane.

Wyślij pierwsze zapytanie. Modele czatów najlepiej działają w ćwiczeniach pytań i odpowiedzi. Na przykład "Co to są moje dostępne plany zdrowotne?", lub "Co to jest opcja kondycji plus?".

Zapytania wymagające analizy danych prawdopodobnie zakończyłyby się niepowodzeniem, na przykład "Który plan kondycji jest najbardziej popularny?". Zapytania, które wymagają informacji o wszystkich danych, również prawdopodobnie kończą się niepowodzeniem, na przykład "Ile dokumentów zostało przekazanych?". Pamiętaj, że wyszukiwarka szuka fragmentów z dokładnymi lub podobnymi terminami, frazami lub konstrukcją zapytania. I choć model może zrozumieć pytanie, jeśli wyniki wyszukiwania są fragmentami z zestawu danych, nie jest to właściwe informacje, aby odpowiedzieć na tego rodzaju pytanie.

Czaty są ograniczone przez liczbę dokumentów (fragmentów) zwracanych w odpowiedzi (ograniczonych do 3–20 w placu zabaw usługi Azure OpenAI Studio). Jak można sobie wyobrazić, pozowanie pytania o "wszystkie tytuły" wymaga pełnego skanowania całego magazynu wektorów.

Wdrażanie modelu

Gdy środowisko w usłudze Azure OpenAI Studio jest zadowalające, możesz wdrożyć aplikację internetową bezpośrednio z poziomu programu Studio, wybierając przycisk Wdróż do .

Zrzut ekranu przedstawiający przycisk wdrażania modelu w programie Azure OpenAI Studio.

Umożliwia to wdrożenie w autonomicznej aplikacji internetowej lub copilot w programie Copilot Studio (wersja zapoznawcza), jeśli używasz własnych danych w modelu.

Jeśli na przykład zdecydujesz się wdrożyć aplikację internetową:

Przy pierwszym wdrożeniu aplikacji internetowej należy wybrać pozycję Utwórz nową aplikację internetową. Wybierz nazwę aplikacji, która stanie się częścią adresu URL aplikacji. Na przykład https://<appname>.azurewebsites.net.

Wybierz subskrypcję, grupę zasobów, lokalizację i plan cenowy opublikowanej aplikacji. Aby zaktualizować istniejącą aplikację, wybierz pozycję Publikuj w istniejącej aplikacji internetowej i wybierz nazwę poprzedniej aplikacji z menu rozwijanego.

Jeśli zdecydujesz się wdrożyć aplikację internetową, zapoznaj się z ważnymi zagadnieniami dotyczącymi korzystania z niej.

Pobieranie wymaganych zmiennych

Aby pomyślnie wykonać wywołanie usługi Azure OpenAI, potrzebne są następujące zmienne. W tym przewodniku Szybki start założono, że dane zostały przekazane na konto usługi Azure Blob Storage i utworzono indeks usługi Azure AI Search. Zobacz Dodawanie danych przy użyciu narzędzia Azure AI Studio

Nazwa zmiennej Wartość
AZURE_OPENAI_ENDPOINT Tę wartość można znaleźć w sekcji Klucze i punkt końcowy podczas badania zasobu usługi Azure OpenAI w witrynie Azure Portal. Alternatywnie możesz znaleźć wartość w widoku Kodu w>programie Azure AI Studio>Chat. Przykładowy punkt końcowy to: https://my-resoruce.openai.azure.com.
AZURE_OPENAI_API_KEY Tę wartość można znaleźć w sekcji Klucze zarządzania>zasobami i punkt końcowy podczas badania zasobu usługi Azure OpenAI w witrynie Azure Portal. Możesz użyć wartości KEY1 lub KEY2. Zawsze posiadanie dwóch kluczy umożliwia bezpieczne obracanie i ponowne generowanie kluczy bez powodowania zakłóceń usługi.
AZURE_OPENAI_DEPLOYMENT_ID Ta wartość odpowiada nazwie niestandardowej wybranej dla wdrożenia podczas wdrażania modelu. Tę wartość można znaleźć w obszarze Wdrożenia zarządzania>zasobami w witrynie Azure Portal lub alternatywnie w obszarze Wdrożenia zarządzania>w usłudze Azure AI Studio.
AZURE_AI_SEARCH_ENDPOINT Tę wartość można znaleźć w sekcji Przegląd podczas badania zasobu usługi Azure AI Search w witrynie Azure Portal.
AZURE_AI_SEARCH_API_KEY Tę wartość można znaleźć w sekcji Ustawienia> Keys podczas badania zasobu usługi Azure AI Search w witrynie Azure Portal. Możesz użyć podstawowego klucza administratora lub pomocniczego klucza administratora. Zawsze posiadanie dwóch kluczy umożliwia bezpieczne obracanie i ponowne generowanie kluczy bez powodowania zakłóceń usługi.
AZURE_AI_SEARCH_INDEX Ta wartość odpowiada nazwie utworzonego indeksu do przechowywania danych. Tę pozycję można znaleźć w sekcji Przegląd podczas badania zasobu usługi Azure AI Search w witrynie Azure Portal.

Zmienne środowiskowe

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

Tworzenie nowej aplikacji .NET Core

W oknie konsoli (takim jak cmd, PowerShell lub Bash) użyj dotnet new polecenia , aby utworzyć nową aplikację konsolową o nazwie azure-openai-quickstart. To polecenie tworzy prosty projekt "Hello World" z pojedynczym plikiem źródłowym języka C#: Program.cs.

dotnet new console -n azure-openai-quickstart

Zmień katalog na nowo utworzony folder aplikacji. Aplikację można skompilować za pomocą następujących funkcji:

dotnet build

Dane wyjściowe kompilacji nie powinny zawierać żadnych ostrzeżeń ani błędów.

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

Zainstaluj bibliotekę klienta platformy .NET openAI za pomocą następujących funkcji:

dotnet add package Azure.AI.OpenAI --prerelease

W katalogu projektu otwórz plik Program.cs i zastąp jego zawartość następującym kodem:

Bez przesyłania strumieniowego odpowiedzi

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

Ważne

W przypadku środowiska produkcyjnego użyj bezpiecznego sposobu przechowywania i uzyskiwania dostępu do poświadczeń, takich jak usługa Azure Key Vault. Aby uzyskać więcej informacji na temat zabezpieczeń poświadczeń, zobacz artykuł Zabezpieczenia usług Azure AI.

dotnet run program.cs

Wyjście

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

Będzie to czekać, aż model wygenerował całą odpowiedź przed wydrukowanie wyników. Alternatywnie, jeśli chcesz asynchronicznie przesłać strumieniowo odpowiedź i wydrukować wyniki, możesz zastąpić zawartość Program.cs kodem w następnym przykładzie.

Async z przesyłaniem strumieniowym

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

Pobieranie wymaganych zmiennych

Aby pomyślnie wykonać wywołanie usługi Azure OpenAI, potrzebne są następujące zmienne. W tym przewodniku Szybki start założono, że dane zostały przekazane na konto usługi Azure Blob Storage i utworzono indeks usługi Azure AI Search. Aby uzyskać więcej informacji, zobacz Dodawanie danych przy użyciu programu Azure AI Studio.

Nazwa zmiennej Wartość
AZURE_OPENAI_ENDPOINT Tę wartość można znaleźć w sekcji Klucze i punkt końcowy podczas badania zasobu usługi Azure OpenAI w witrynie Azure Portal. Alternatywnie możesz znaleźć wartość w widoku Kodu w>programie Azure AI Studio>Chat. Przykładowy punkt końcowy to: https://my-resource.openai.azure.com.
AZURE_OPENAI_API_KEY Tę wartość można znaleźć w sekcji Klucze zarządzania>zasobami i punkt końcowy podczas badania zasobu usługi Azure OpenAI w witrynie Azure Portal. Możesz użyć wartości KEY1 lub KEY2. Zawsze posiadanie dwóch kluczy umożliwia bezpieczne obracanie i ponowne generowanie kluczy bez powodowania zakłóceń usługi.
AZURE_OPEN_AI_DEPLOYMENT_ID Ta wartość odpowiada nazwie niestandardowej wybranej dla wdrożenia podczas wdrażania modelu. Tę wartość można znaleźć w obszarze Wdrożenia zarządzania>zasobami w witrynie Azure Portal lub alternatywnie w obszarze Wdrożenia zarządzania>w usłudze Azure AI Studio.
AZURE_AI_SEARCH_ENDPOINT Tę wartość można znaleźć w sekcji Przegląd podczas badania zasobu usługi Azure AI Search w witrynie Azure Portal.
AZURE_AI_SEARCH_API_KEY Tę wartość można znaleźć w sekcji Ustawienia> Keys podczas badania zasobu usługi Azure AI Search w witrynie Azure Portal. Możesz użyć podstawowego klucza administratora lub pomocniczego klucza administratora. Zawsze posiadanie dwóch kluczy umożliwia bezpieczne obracanie i ponowne generowanie kluczy bez powodowania zakłóceń usługi.
AZURE_AI_SEARCH_INDEX Ta wartość odpowiada nazwie utworzonego indeksu do przechowywania danych. Tę pozycję można znaleźć w sekcji Przegląd podczas badania zasobu usługi Azure AI Search w witrynie Azure Portal.

Zmienne środowiskowe

Uwaga

Platforma Spring AI domyślnie określa nazwę modelu na gpt-35-turbo. Należy podać SPRING_AI_AZURE_OPENAI_MODEL wartość tylko wtedy, gdy wdrożono model o innej nazwie.

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

Tworzenie nowej aplikacji Spring

Platforma Spring AI obecnie nie obsługuje AzureCognitiveSearchChatExtensionConfiguration opcji, które umożliwiają hermetyzację metody retrieval Augmented Generation (RAG) zapytania usługi Azure AI i ukrywanie szczegółów użytkownika. Alternatywnie możesz wywołać metodę RAG bezpośrednio w aplikacji, aby wysyłać zapytania o dane w indeksie usługi Azure AI Search i używać pobranych dokumentów w celu rozszerzenia zapytania.

Platforma Spring AI obsługuje abstrakcję VectorStore i można opakować usługę Azure AI Search w implementacji Spring AI VectorStore na potrzeby wykonywania zapytań dotyczących danych niestandardowych. Poniższy projekt implementuje niestandardowy magazyn VectorStore wspierany przez usługę Azure AI Search i wykonuje bezpośrednio operacje RAG.

W oknie powłoki Bash utwórz nowy katalog dla aplikacji i przejdź do niego.

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

spring init Uruchom polecenie z katalogu roboczego. To polecenie tworzy standardową strukturę katalogów dla projektu Spring, w tym główny plik źródłowy klasy Java i plik pom.xml używany do zarządzania projektami opartymi na programie Maven.

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

Wygenerowane pliki i foldery przypominają następującą 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

Edytowanie aplikacji Spring

  1. Edytuj plik pom.xml.

    W katalogu głównym katalogu projektu otwórz plik pom.xml w preferowanym edytorze lub środowisku IDE i zastąp plik następującym zawartością:

    <?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. W folderze src/main/java/com/example/aicustomdatademo otwórz AiCustomDataApplication.java w preferowanym edytorze lub środowisku IDE i wklej następujący 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;
        }
    
    }
    

    Ważne

    W przypadku środowiska produkcyjnego użyj bezpiecznego sposobu przechowywania i uzyskiwania dostępu do poświadczeń, takich jak usługa Azure Key Vault. Aby uzyskać więcej informacji na temat zabezpieczeń poświadczeń, zobacz artykuł Zabezpieczenia usług Azure AI.

  3. Wróć do folderu głównego projektu i uruchom aplikację przy użyciu następującego polecenia:

    ./mvnw spring-boot:run
    

Wyjście

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

Pobieranie wymaganych zmiennych

Aby pomyślnie wykonać wywołanie usługi Azure OpenAI, potrzebne są następujące zmienne. W tym przewodniku Szybki start założono, że dane zostały przekazane na konto usługi Azure Blob Storage i utworzono indeks usługi Azure AI Search. Zobacz Dodawanie danych przy użyciu narzędzia Azure AI Studio

Nazwa zmiennej Wartość
AZURE_OPENAI_ENDPOINT Tę wartość można znaleźć w sekcji Klucze i punkt końcowy podczas badania zasobu usługi Azure OpenAI w witrynie Azure Portal. Alternatywnie możesz znaleźć wartość w widoku Kodu w>programie Azure AI Studio>Chat. Przykładowy punkt końcowy to: https://my-resoruce.openai.azure.com.
AZURE_OPENAI_API_KEY Tę wartość można znaleźć w sekcji Klucze zarządzania>zasobami i punkt końcowy podczas badania zasobu usługi Azure OpenAI w witrynie Azure Portal. Możesz użyć wartości KEY1 lub KEY2. Zawsze posiadanie dwóch kluczy umożliwia bezpieczne obracanie i ponowne generowanie kluczy bez powodowania zakłóceń usługi.
AZURE_OPENAI_DEPLOYMENT_ID Ta wartość odpowiada nazwie niestandardowej wybranej dla wdrożenia podczas wdrażania modelu. Tę wartość można znaleźć w obszarze Wdrożenia zarządzania>zasobami w witrynie Azure Portal lub alternatywnie w obszarze Wdrożenia zarządzania>w usłudze Azure AI Studio.
AZURE_AI_SEARCH_ENDPOINT Tę wartość można znaleźć w sekcji Przegląd podczas badania zasobu usługi Azure AI Search w witrynie Azure Portal.
AZURE_AI_SEARCH_API_KEY Tę wartość można znaleźć w sekcji Ustawienia> Keys podczas badania zasobu usługi Azure AI Search w witrynie Azure Portal. Możesz użyć podstawowego klucza administratora lub pomocniczego klucza administratora. Zawsze posiadanie dwóch kluczy umożliwia bezpieczne obracanie i ponowne generowanie kluczy bez powodowania zakłóceń usługi.
AZURE_AI_SEARCH_INDEX Ta wartość odpowiada nazwie utworzonego indeksu do przechowywania danych. Tę pozycję można znaleźć w sekcji Przegląd podczas badania zasobu usługi Azure AI Search w witrynie Azure Portal.

Zmienne środowiskowe

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

Tworzenie aplikacji Node

W oknie konsoli (na przykład cmd, PowerShell lub Bash) utwórz nowy katalog dla aplikacji i przejdź do niego. Następnie uruchom polecenie , npm init aby utworzyć aplikację węzła z plikiem package.json .

npm init

Instalowanie biblioteki klienta

Zainstaluj klienta usługi Azure OpenAI i biblioteki tożsamości platformy Azure dla języka JavaScript za pomocą narzędzia npm:

npm install @azure/openai @azure/identity

Plik package.json aplikacji zostanie zaktualizowany o zależności.

Tworzenie przykładowej aplikacji

Otwórz wiersz polecenia, w którym chcesz utworzyć nowy projekt, i utwórz nowy plik o nazwie ChatWithOwnData.js. Skopiuj następujący kod do pliku 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 };

Ważne

W przypadku środowiska produkcyjnego użyj bezpiecznego sposobu przechowywania i uzyskiwania dostępu do poświadczeń, takich jak usługa Azure Key Vault. Aby uzyskać więcej informacji na temat zabezpieczeń poświadczeń, zobacz artykuł Zabezpieczenia usług Azure AI.

node.exe ChatWithOwnData.js

Wyjście

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.

Pobieranie wymaganych zmiennych

Aby pomyślnie wykonać wywołanie usługi Azure OpenAI, potrzebne są następujące zmienne. W tym przewodniku Szybki start założono, że dane zostały przekazane na konto usługi Azure Blob Storage i utworzono indeks usługi Azure AI Search. Zobacz Dodawanie danych przy użyciu narzędzia Azure AI Studio

Nazwa zmiennej Wartość
AZURE_OPENAI_ENDPOINT Tę wartość można znaleźć w sekcji Klucze i punkt końcowy podczas badania zasobu usługi Azure OpenAI w witrynie Azure Portal. Alternatywnie możesz znaleźć wartość w widoku Kodu w>programie Azure AI Studio>Chat. Przykładowy punkt końcowy to: https://my-resoruce.openai.azure.com.
AZURE_OPENAI_API_KEY Tę wartość można znaleźć w sekcji Klucze zarządzania>zasobami i punkt końcowy podczas badania zasobu usługi Azure OpenAI w witrynie Azure Portal. Możesz użyć wartości KEY1 lub KEY2. Zawsze posiadanie dwóch kluczy umożliwia bezpieczne obracanie i ponowne generowanie kluczy bez powodowania zakłóceń usługi.
AZURE_OPENAI_DEPLOYMENT_ID Ta wartość odpowiada nazwie niestandardowej wybranej dla wdrożenia podczas wdrażania modelu. Tę wartość można znaleźć w obszarze Wdrożenia zarządzania>zasobami w witrynie Azure Portal lub alternatywnie w obszarze Wdrożenia zarządzania>w usłudze Azure AI Studio.
AZURE_AI_SEARCH_ENDPOINT Tę wartość można znaleźć w sekcji Przegląd podczas badania zasobu usługi Azure AI Search w witrynie Azure Portal.
AZURE_AI_SEARCH_API_KEY Tę wartość można znaleźć w sekcji Ustawienia> Keys podczas badania zasobu usługi Azure AI Search w witrynie Azure Portal. Możesz użyć podstawowego klucza administratora lub pomocniczego klucza administratora. Zawsze posiadanie dwóch kluczy umożliwia bezpieczne obracanie i ponowne generowanie kluczy bez powodowania zakłóceń usługi.
AZURE_AI_SEARCH_INDEX Ta wartość odpowiada nazwie utworzonego indeksu do przechowywania danych. Tę pozycję można znaleźć w sekcji Przegląd podczas badania zasobu usługi Azure AI Search w witrynie Azure Portal.

Zmienne środowiskowe

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

Tworzenie środowiska języka Python

  1. Utwórz nowy folder o nazwie openai-python dla projektu i nowy plik kodu w języku Python o nazwie main.py. Przejdź do tego katalogu:
mkdir openai-python
cd openai-python
  1. Zainstaluj następujące biblioteki języka Python:
pip install openai
pip install python-dotenv

Tworzenie aplikacji w języku Python

  1. W katalogu projektu otwórz plik main.py i dodaj następujący 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))

Ważne

W przypadku środowiska produkcyjnego użyj bezpiecznego sposobu przechowywania i uzyskiwania dostępu do poświadczeń, takich jak usługa Azure Key Vault. Aby uzyskać więcej informacji na temat zabezpieczeń poświadczeń, zobacz artykuł Zabezpieczenia usług Azure AI.

  1. Wykonaj następujące polecenie:
python main.py

Aplikacja wyświetla odpowiedź w formacie JSON odpowiednim do użycia w wielu scenariuszach. Zawiera ona zarówno odpowiedzi na zapytania, jak i cytaty z przekazanych plików.

Pobieranie wymaganych zmiennych

Aby pomyślnie wykonać wywołanie usługi Azure OpenAI, potrzebne są następujące zmienne. W tym przewodniku Szybki start założono, że dane zostały przekazane na konto usługi Azure Blob Storage i utworzono indeks usługi Azure AI Search. Zobacz Dodawanie danych przy użyciu narzędzia Azure AI Studio

Nazwa zmiennej Wartość
AZURE_OPENAI_ENDPOINT Tę wartość można znaleźć w sekcji Klucze i punkt końcowy podczas badania zasobu usługi Azure OpenAI w witrynie Azure Portal. Alternatywnie możesz znaleźć wartość w widoku Kodu w>programie Azure AI Studio>Chat. Przykładowy punkt końcowy to: https://my-resoruce.openai.azure.com.
AZURE_OPENAI_API_KEY Tę wartość można znaleźć w sekcji Klucze zarządzania>zasobami i punkt końcowy podczas badania zasobu usługi Azure OpenAI w witrynie Azure Portal. Możesz użyć wartości KEY1 lub KEY2. Zawsze posiadanie dwóch kluczy umożliwia bezpieczne obracanie i ponowne generowanie kluczy bez powodowania zakłóceń usługi.
AZURE_OPENAI_DEPLOYMENT_ID Ta wartość odpowiada nazwie niestandardowej wybranej dla wdrożenia podczas wdrażania modelu. Tę wartość można znaleźć w obszarze Wdrożenia zarządzania>zasobami w witrynie Azure Portal lub alternatywnie w obszarze Wdrożenia zarządzania>w usłudze Azure AI Studio.
AZURE_AI_SEARCH_ENDPOINT Tę wartość można znaleźć w sekcji Przegląd podczas badania zasobu usługi Azure AI Search w witrynie Azure Portal.
AZURE_AI_SEARCH_API_KEY Tę wartość można znaleźć w sekcji Ustawienia> Keys podczas badania zasobu usługi Azure AI Search w witrynie Azure Portal. Możesz użyć podstawowego klucza administratora lub pomocniczego klucza administratora. Zawsze posiadanie dwóch kluczy umożliwia bezpieczne obracanie i ponowne generowanie kluczy bez powodowania zakłóceń usługi.
AZURE_AI_SEARCH_INDEX Ta wartość odpowiada nazwie utworzonego indeksu do przechowywania danych. Tę pozycję można znaleźć w sekcji Przegląd podczas badania zasobu usługi Azure AI Search w witrynie Azure Portal.

Zmienne środowiskowe

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

Przykładowe polecenia programu PowerShell

Modele czatów usługi Azure OpenAI są zoptymalizowane pod kątem pracy z danymi wejściowymi sformatowanymi jako konwersacja. Zmienna messages przekazuje tablicę słowników z różnymi rolami w konwersacji oddzielonej przez system, użytkownika, narzędzie i asystenta. Zmienna dataSources łączy się z indeksem usługi Azure Cognitive Search i umożliwia modelom usługi Azure OpenAI reagowanie przy użyciu danych.

Aby wyzwolić odpowiedź z modelu, należy kończyć się komunikatem użytkownika wskazującym, że asystent reaguje.

Napiwek

Istnieje kilka parametrów, których można użyć do zmiany odpowiedzi modelu, na przykład temperature lub top_p. Aby uzyskać więcej informacji, zobacz dokumentację referencyjną.

# 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

Przykładowe dane wyjściowe

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

Ważne

W środowisku produkcyjnym użyj bezpiecznego sposobu przechowywania i uzyskiwania dostępu do poświadczeń, takich jak Zarządzanie wpisami tajnymi programu PowerShell za pomocą usługi Azure Key Vault. Aby uzyskać więcej informacji na temat zabezpieczeń poświadczeń, zobacz artykuł Zabezpieczenia usług Azure AI.

Rozmowa z modelem przy użyciu aplikacji internetowej

Aby rozpocząć rozmowę z modelem usługi Azure OpenAI, który używa Twoich danych, możesz wdrożyć aplikację internetową przy użyciu programu Azure OpenAI Studio lub przykładowego kodu udostępnianego w usłudze GitHub. Ta aplikacja jest wdrażana przy użyciu usługi Azure App Service i udostępnia interfejs użytkownika do wysyłania zapytań. Ta aplikacja może służyć do korzystania z modeli usługi Azure OpenAI korzystających z danych lub modeli, które nie korzystają z danych. Zapoznaj się z plikiem readme w repozytorium, aby uzyskać instrukcje dotyczące wymagań, konfiguracji i wdrażania. Opcjonalnie możesz dostosować logikę frontonu i zaplecza aplikacji internetowej, wprowadzając zmiany w kodzie źródłowym.

Pobieranie wymaganych zmiennych

Aby pomyślnie wykonać wywołanie usługi Azure OpenAI, potrzebne są następujące zmienne. W tym przewodniku Szybki start założono, że dane zostały przekazane na konto usługi Azure Blob Storage i utworzono indeks usługi Azure AI Search. Zobacz Dodawanie danych przy użyciu narzędzia Azure AI Studio

Nazwa zmiennej Wartość
AZURE_OPENAI_ENDPOINT Tę wartość można znaleźć w sekcji Klucze i punkt końcowy podczas badania zasobu usługi Azure OpenAI w witrynie Azure Portal. Alternatywnie możesz znaleźć wartość w widoku Kodu w>programie Azure AI Studio>Chat. Przykładowy punkt końcowy to: https://my-resoruce.openai.azure.com.
AZURE_OPENAI_API_KEY Tę wartość można znaleźć w sekcji Klucze zarządzania>zasobami i punkt końcowy podczas badania zasobu usługi Azure OpenAI w witrynie Azure Portal. Możesz użyć wartości KEY1 lub KEY2. Zawsze posiadanie dwóch kluczy umożliwia bezpieczne obracanie i ponowne generowanie kluczy bez powodowania zakłóceń usługi.
AZURE_OPENAI_DEPLOYMENT_ID Ta wartość odpowiada nazwie niestandardowej wybranej dla wdrożenia podczas wdrażania modelu. Tę wartość można znaleźć w obszarze Wdrożenia zarządzania>zasobami w witrynie Azure Portal lub alternatywnie w obszarze Wdrożenia zarządzania>w usłudze Azure AI Studio.
AZURE_AI_SEARCH_ENDPOINT Tę wartość można znaleźć w sekcji Przegląd podczas badania zasobu usługi Azure AI Search w witrynie Azure Portal.
AZURE_AI_SEARCH_API_KEY Tę wartość można znaleźć w sekcji Ustawienia> Keys podczas badania zasobu usługi Azure AI Search w witrynie Azure Portal. Możesz użyć podstawowego klucza administratora lub pomocniczego klucza administratora. Zawsze posiadanie dwóch kluczy umożliwia bezpieczne obracanie i ponowne generowanie kluczy bez powodowania zakłóceń usługi.
AZURE_AI_SEARCH_INDEX Ta wartość odpowiada nazwie utworzonego indeksu do przechowywania danych. Tę pozycję można znaleźć w sekcji Przegląd podczas badania zasobu usługi Azure AI Search w witrynie Azure Portal.

Zmienne środowiskowe

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

Tworzenie środowiska języka Go

  1. Utwórz nowy folder o nazwie openai-go dla projektu i nowy plik kodu Języka Go o nazwie sample.go. Przejdź do tego katalogu:

    mkdir openai-go
    cd openai-go
    
  2. Zainstaluj następujące pakiety języka Go:

    go get github.com/Azure/azure-sdk-for-go/sdk/ai/azopenai
    
  3. Włącz śledzenie zależności dla kodu.

    go mod init example/azure-openai
    

Tworzenie aplikacji Języka Go

  1. W katalogu projektu otwórz plik sample.go i dodaj następujący 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,
     )
    }
    

    Ważne

    W przypadku środowiska produkcyjnego użyj bezpiecznego sposobu przechowywania i uzyskiwania dostępu do poświadczeń, takich jak usługa Azure Key Vault. Aby uzyskać więcej informacji na temat zabezpieczeń poświadczeń, zobacz artykuł Zabezpieczenia usług Azure AI.

  2. Wykonaj następujące polecenie:

    go run sample.go
    

    Aplikacja wyświetla odpowiedź, w tym odpowiedzi na zapytania i cytaty z przekazanych plików.

Pobieranie wymaganych zmiennych

Aby pomyślnie wykonać wywołanie usługi Azure OpenAI, potrzebne są następujące zmienne. W tym przewodniku Szybki start założono, że dane zostały przekazane na konto usługi Azure Blob Storage i utworzono indeks usługi Azure AI Search. Zobacz Dodawanie danych przy użyciu narzędzia Azure AI Studio

Nazwa zmiennej Wartość
AZURE_OPENAI_ENDPOINT Tę wartość można znaleźć w sekcji Klucze i punkt końcowy podczas badania zasobu usługi Azure OpenAI w witrynie Azure Portal. Alternatywnie możesz znaleźć wartość w widoku Kodu w>programie Azure AI Studio>Chat. Przykładowy punkt końcowy to: https://my-resoruce.openai.azure.com.
AZURE_OPENAI_API_KEY Tę wartość można znaleźć w sekcji Klucze zarządzania>zasobami i punkt końcowy podczas badania zasobu usługi Azure OpenAI w witrynie Azure Portal. Możesz użyć wartości KEY1 lub KEY2. Zawsze posiadanie dwóch kluczy umożliwia bezpieczne obracanie i ponowne generowanie kluczy bez powodowania zakłóceń usługi.
AZURE_OPENAI_DEPLOYMENT_ID Ta wartość odpowiada nazwie niestandardowej wybranej dla wdrożenia podczas wdrażania modelu. Tę wartość można znaleźć w obszarze Wdrożenia zarządzania>zasobami w witrynie Azure Portal lub alternatywnie w obszarze Wdrożenia zarządzania>w usłudze Azure AI Studio.
AZURE_AI_SEARCH_ENDPOINT Tę wartość można znaleźć w sekcji Przegląd podczas badania zasobu usługi Azure AI Search w witrynie Azure Portal.
AZURE_AI_SEARCH_API_KEY Tę wartość można znaleźć w sekcji Ustawienia> Keys podczas badania zasobu usługi Azure AI Search w witrynie Azure Portal. Możesz użyć podstawowego klucza administratora lub pomocniczego klucza administratora. Zawsze posiadanie dwóch kluczy umożliwia bezpieczne obracanie i ponowne generowanie kluczy bez powodowania zakłóceń usługi.
AZURE_AI_SEARCH_INDEX Ta wartość odpowiada nazwie utworzonego indeksu do przechowywania danych. Tę pozycję można znaleźć w sekcji Przegląd podczas badania zasobu usługi Azure AI Search w witrynie Azure Portal.

Zmienne środowiskowe

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

Przykładowe polecenia cURL

Modele czatów usługi Azure OpenAI są zoptymalizowane pod kątem pracy z danymi wejściowymi sformatowanymi jako konwersacja. Zmienna messages przekazuje tablicę słowników z różnymi rolami w konwersacji oddzielonej przez system, użytkownika, narzędzie i asystenta. Zmienna dataSources łączy się z indeksem usługi Azure AI Search i umożliwia modelom usługi Azure OpenAI odpowiadanie przy użyciu danych.

Aby wyzwolić odpowiedź z modelu, należy kończyć się komunikatem użytkownika wskazującym, że asystent reaguje.

Napiwek

Istnieje kilka parametrów, których można użyć do zmiany odpowiedzi modelu, na przykład temperature lub top_p. Aby uzyskać więcej informacji, zobacz dokumentację referencyjną.

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

Przykładowe dane wyjściowe

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

Rozmowa z modelem przy użyciu aplikacji internetowej

Aby rozpocząć rozmowę z modelem usługi Azure OpenAI, który używa Twoich danych, możesz wdrożyć aplikację internetową przy użyciu programu Azure OpenAI Studio lub przykładowego kodu udostępnianego w usłudze GitHub. Ta aplikacja jest wdrażana przy użyciu usługi Azure App Service i udostępnia interfejs użytkownika do wysyłania zapytań. Ta aplikacja może służyć do korzystania z modeli usługi Azure OpenAI korzystających z danych lub modeli, które nie korzystają z danych. Zapoznaj się z plikiem readme w repozytorium, aby uzyskać instrukcje dotyczące wymagań, konfiguracji i wdrażania. Opcjonalnie możesz dostosować logikę frontonu i zaplecza aplikacji internetowej, wprowadzając zmiany w kodzie źródłowym.

Czyszczenie zasobów

Jeśli chcesz wyczyścić i usunąć zasób usługi Azure OpenAI lub Azure AI Search, możesz usunąć zasób lub grupę zasobów. Usunięcie grupy zasobów powoduje również usunięcie wszelkich innych skojarzonych z nią zasobów.

Następne kroki