Udostępnij za pośrednictwem


Rozszerzanie interfejsu OpenAI przy użyciu narzędzi i wykonywanie funkcji lokalnej za pomocą platformy .NET

Rozpocznij pracę ze sztuczną inteligencją, tworząc prostą aplikację do czatu konsolowego platformy .NET 8. Aplikacja będzie uruchamiana lokalnie i używa modelu OpenAI gpt-3.5-turbo przy użyciu narzędzi w celu rozszerzenia możliwości modelu przez wywołanie lokalnej metody platformy .NET. Wykonaj następujące kroki, aby uzyskać dostęp do interfejsu OpenAI i dowiedzieć się, jak używać jądra semantycznego.

Wymagania wstępne

  • Zestaw .NET 8.0 SDK — zainstaluj zestaw .NET 8.0 SDK.
  • Klucz interfejsu API z interfejsu OpenAI , aby można było uruchomić ten przykład.
  • W systemie Windows wymagany jest program PowerShell v7+ . Aby zweryfikować wersję, uruchom polecenie pwsh w terminalu. Powinna zwrócić bieżącą wersję. Jeśli zwraca błąd, wykonaj następujące polecenie: dotnet tool update --global PowerShell.

Rozpocznij pracę ze sztuczną inteligencją, tworząc prostą aplikację do czatu konsolowego platformy .NET 8. Aplikacja zostanie uruchomiona lokalnie i będzie używać modelu OpenAI gpt-35-turbo wdrożonego na koncie usługi Azure OpenAI. Używa narzędzi do rozszerzania możliwości modelu przez wywołanie lokalnej metody .NET. Wykonaj następujące kroki, aby aprowizować usługę Azure OpenAI i dowiedzieć się, jak używać jądra semantycznego.

Wymagania wstępne

Pobieranie przykładowego projektu

Sklonuj repozytorium GitHub zawierające przykładowe aplikacje dla wszystkich przewodników Szybki start:

git clone https://github.com/dotnet/ai-samples.git

Tworzenie usługi Azure OpenAI

Przykładowe repozytorium GitHub jest ustrukturyzowane jako szablon interfejsu wiersza polecenia dla deweloperów platformy Azure (azd), którego azd można użyć do aprowizacji usługi Azure OpenAI i modelu.

  1. W terminalu lub wierszu polecenia przejdź do katalogu src\quickstarts\azure-openai przykładowego repozytorium.

  2. Uruchom polecenie , azd up aby aprowizować zasoby usługi Azure OpenAI. Utworzenie usługi Azure OpenAI i wdrożenie modelu może potrwać kilka minut.

    azd up
    

    azd Konfiguruje również wymagane wpisy tajne użytkownika dla przykładowej aplikacji, takie jak klucz dostępu OpenAI.

    Uwaga

    Jeśli podczas wdrażania wystąpi błąd azd up , odwiedź sekcję rozwiązywania problemów.

Wypróbuj przykład hiker pro

  1. W terminalu lub wierszu polecenia przejdź do azure-openai\04-HikerAIPro katalogu.

  2. Uruchom następujące polecenia, aby skonfigurować klucz interfejsu API OpenAI jako wpis tajny dla przykładowej aplikacji:

    dotnet user-secrets init
    dotnet user-secrets set OpenAIKey <your-openai-key>
    
  3. Użyj polecenia , dotnet run aby uruchomić aplikację:

    dotnet run
    
  1. W terminalu lub wierszu polecenia przejdź do azure-openai\04-HikerAIPro katalogu.

  2. Użyj polecenia , dotnet run aby uruchomić aplikację:

    dotnet run
    

    Napiwek

    Jeśli zostanie wyświetlony komunikat o błędzie, zasoby usługi Azure OpenAI mogą nie zakończyć wdrażania. Poczekaj kilka minut i spróbuj ponownie.

Zrozumienie kodu

Aplikacja używa Microsoft.SemanticKernel pakietu do wysyłania i odbierania żądań do usługi OpenAI.

Cała aplikacja znajduje się w pliku Program.cs . Pierwsze kilka wierszy kodu ustawia wartości konfiguracji i pobierz klucz OpenAI, który został wcześniej ustawiony przy użyciu dotnet user-secrets polecenia .

var config = new ConfigurationBuilder().AddUserSecrets<Program>().Build();
string model = "gpt-3.5-turbo";
string key = config["OpenAIKey"];

Klasa Kernel ułatwia żądania i odpowiedzi za pomocą AddOpenAIChatCompletion usługi.

// Create a Kernel containing the OpenAI Chat Completion Service
IKernelBuilder b = Kernel.CreateBuilder();

Kernel kernel = b
    .AddOpenAIChatCompletion(model, key)
    .Build();

Aplikacja używa Microsoft.SemanticKernel pakietu do wysyłania i odbierania żądań do usługi OpenAI.

Cała aplikacja znajduje się w pliku Program.cs . Pierwsze kilka wierszy kodu ładuje wpisy tajne i wartości konfiguracji, które zostały ustawione dla dotnet user-secrets Ciebie podczas aprowizacji aplikacji.

var config = new ConfigurationBuilder().AddUserSecrets<Program>().Build();
string endpoint = config["AZURE_OPENAI_ENDPOINT"];
string deployment = config["AZURE_OPENAI_GPT_NAME"];
string key = config["AZURE_OPENAI_KEY"];

Klasa Kernel ułatwia żądania i odpowiedzi za pomocą AzureOpenAIChatCompletion usługi.

// Create a Kernel containing the Azure OpenAI Chat Completion Service
IKernelBuilder b = Kernel.CreateBuilder();

Kernel kernel = b
    .AddAzureOpenAIChatCompletion(deployment, endpoint, key)
    .Build();

Funkcje ImportPluginFromFunctions i CreateFromMethod zdefiniuj funkcję lokalną, która będzie wywoływana przez model.

// Add a new plugin with a local .NET function that should be available to the AI model
// For convenience and clarity of into the code, this standalone local method handles tool call responses. It will fake a call to a weather API and return the current weather for the specified location.
kernel.ImportPluginFromFunctions("WeatherPlugin",
[
    KernelFunctionFactory.CreateFromMethod(
        ([Description("The city, e.g. Montreal, Sidney")] string location, string unit = null) =>
    {
        // Here you would call a weather API to get the weather for the location
        return "Periods of rain or drizzle, 15 C";
    }, "get_current_weather", "Get the current weather in a given location")
]);

Po utworzeniu kernel klienta kod używa monitu systemowego, aby podać kontekst i wpłynąć na ton ukończenia i zawartość. Zwróć uwagę na to, jak pogoda jest podkreślona w wierszu polecenia systemu.

ChatHistory chatHistory = new("""
    You are a hiking enthusiast who helps people discover fun hikes in their area.
    You are upbeat and friendly. Good weather is important for a good hike. 
    Only make recommendations if the weather is good or if people insist.
    You introduce yourself when first saying hello. When helping people out,
    you always ask them for this information to inform the hiking recommendation you provide:

    1. Where they are located
    2. What hiking intensity they are looking for

    You will then provide three suggestions for nearby hikes that vary in length
    after you get that information. You will also share an interesting fact about the local
    nature on the hikes when making a recommendation.
    """);

Aplikacja dodaje również komunikat użytkownika do modelu przy użyciu AddUserMessage funkcji . Funkcja GetChatMessageContentAsync wysyła historię czatów do modelu, aby wygenerować odpowiedź na podstawie monitów systemu i użytkownika.

chatHistory.AddUserMessage("""
    Is the weather is good today for a hike?
    If yes, I live in the greater Montreal area and would like an easy hike. 
    I don't mind driving a bit to get there. I don't want the hike to be over 10 miles round trip.
    I'd consider a point-to-point hike.
    I want the hike to be as isolated as possible. I don't want to see many people.
    I would like it to be as bug free as possible.
    """);

Console.WriteLine($"{chatHistory.Last().Role} >>> {chatHistory.Last().Content}");

chatHistory.Add(await service.GetChatMessageContentAsync(
    chatHistory, 
    new OpenAIPromptExecutionSettings()
    { 
        MaxTokens = 400 
    }));

Console.WriteLine($"{chatHistory.Last().Role} >>> {chatHistory.Last().Content}");

Dostosuj monit systemowy i komunikat użytkownika, aby zobaczyć, jak model reaguje, aby ułatwić znalezienie takiej podwyżki.

Czyszczenie zasobów

Jeśli nie potrzebujesz już przykładowej aplikacji lub zasobów, usuń odpowiednie wdrożenie i wszystkie zasoby.

azd down

Rozwiązywanie problemów

W systemie Windows po uruchomieniu azd upprogramu mogą zostać wyświetlone następujące komunikaty o błędach:

postprovision.ps1 nie jest podpisany cyfrowo. Skrypt nie zostanie wykonany w systemie

Skrypt postprovision.ps1 jest wykonywany w celu ustawienia wpisów tajnych użytkownika platformy .NET używanych w aplikacji. Aby uniknąć tego błędu, uruchom następujące polecenie programu PowerShell:

Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass

Następnie uruchom azd up ponownie polecenie.

Inny możliwy błąd:

Polecenie "pwsh" nie jest rozpoznawane jako wewnętrzne lub zewnętrzne polecenie, program operacyjny lub plik wsadowy. OSTRZEŻENIE: hak "postprovision" nie powiódł się z kodem zakończenia: "1", ścieżka: ".\infra\post-script\postprovision.ps1". : kod zakończenia: 1 Wykonanie będzie kontynuowane, ponieważ właściwość ContinueOnError została ustawiona na wartość true.

Skrypt postprovision.ps1 jest wykonywany w celu ustawienia wpisów tajnych użytkownika platformy .NET używanych w aplikacji. Aby uniknąć tego błędu, ręcznie uruchom skrypt przy użyciu następującego polecenia programu PowerShell:

.\infra\post-script\postprovision.ps1

Aplikacje sztucznej inteligencji platformy .NET mają teraz skonfigurowane wpisy tajne użytkownika i można je przetestować.

Następne kroki