Расширение OpenAI с помощью средств и выполнение локальной функции с помощью .NET

Приступая к работе с ИИ, создав простое консольное приложение чата .NET 8. Приложение будет работать локально и использовать модель OpenAI gpt-3.5-turbo , используя средства для расширения возможностей модели путем вызова локального метода .NET. Выполните следующие действия, чтобы получить доступ к OpenAI и узнать, как использовать семантические ядра.

Необходимые компоненты

  • Пакет SDK для .NET 8.0. Установите пакет SDK для .NET 8.0.
  • Ключ API из OpenAI, чтобы можно было запустить этот пример.
  • В Windows требуется PowerShell v7+ . Чтобы проверить версию, запустите pwsh в терминале. Он должен возвращать текущую версию. Если он возвращает ошибку, выполните следующую команду: dotnet tool update --global PowerShell

Приступая к работе с ИИ, создав простое консольное приложение чата .NET 8. Приложение будет выполняться локально и использовать модель OpenAI gpt-35-turbo , развернутую в учетной записи Azure OpenAI. В нем используются средства для расширения возможностей модели путем вызова локального метода .NET. Выполните следующие действия, чтобы подготовить Azure OpenAI и узнать, как использовать семантические ядра.

Необходимые компоненты

Скачивание примера проекта

Клонируйте репозиторий GitHub, содержащий примеры приложений для всех кратких руководств:

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

Создание службы Azure OpenAI

Пример репозитория GitHub структурирован как шаблон интерфейса командной строки разработчика Azure (azd), который azd можно использовать для подготовки службы и модели Azure OpenAI.

  1. В терминале или командной строке перейдите к каталогу src\quickstarts\azure-openai примера репозитория.

  2. azd up Выполните команду, чтобы подготовить ресурсы Azure OpenAI. Для создания службы Azure OpenAI и развертывания модели может потребоваться несколько минут.

    azd up
    

    azd также настраивает необходимые секреты пользователя для примера приложения, например ключа доступа OpenAI.

    Примечание.

    Если во время azd up развертывания возникла ошибка, посетите раздел устранения неполадок .

Попробуйте пример туриста pro

  1. В терминале или командной строке перейдите azure-openai\04-HikerAIPro в каталог.

  2. Выполните следующие команды, чтобы настроить ключ API OpenAI в качестве секрета для примера приложения:

    dotnet user-secrets init
    dotnet user-secrets set OpenAIKey <your-openai-key>
    
  3. dotnet run Используйте команду для запуска приложения:

    dotnet run
    
  1. В терминале или командной строке перейдите azure-openai\04-HikerAIPro в каталог.

  2. dotnet run Используйте команду для запуска приложения:

    dotnet run
    

    Совет

    Если появится сообщение об ошибке, ресурсы Azure OpenAI, возможно, не завершили развертывание. Подождите пару минут и повторите попытку.

Изучение кода

Приложение использует Microsoft.SemanticKernel пакет для отправки и получения запросов в службу OpenAI.

Все приложение содержится в файле Program.cs . Первые несколько строк конфигурации набора кода и получение ключа OpenAI, который ранее был задан с помощью dotnet user-secrets команды.

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

Класс Kernel упрощает запросы и ответы с помощью AddOpenAIChatCompletion службы.

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

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

Приложение использует Microsoft.SemanticKernel пакет для отправки и получения запросов в службу OpenAI.

Все приложение содержится в файле Program.cs . Первые несколько строк кода загружают секреты и значения конфигурации, заданные для dotnet user-secrets вас во время подготовки приложения.

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"];

Класс Kernel упрощает запросы и ответы с помощью AzureOpenAIChatCompletion службы.

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

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

Функции ImportPluginFromFunctions и CreateFromMethod определите локальную функцию, которая будет вызываться моделью.

// 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")
]);

kernel После создания клиента код использует системный запрос для предоставления контекста и влияния на тон завершения и содержимое. Обратите внимание, как погода подчеркивается в системном запросе.

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.
    """);

Приложение также добавляет в модель сообщение пользователя с помощью AddUserMessage функции. Функция GetChatMessageContentAsync отправляет журнал чата в модель, чтобы создать ответ на основе системных и пользовательских запросов.

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

Настройте системный запрос и сообщение пользователя, чтобы узнать, как модель реагирует, чтобы помочь вам найти нужный поход.

Очистка ресурсов

Если вам больше не нужен пример приложения или ресурсов, удалите соответствующее развертывание и все ресурсы.

azd down

Устранение неполадок

В Windows после выполнения azd upмогут появиться следующие сообщения об ошибках:

postprovision.ps1 не имеет цифровой подписи. Сценарий не будет выполняться в системе

Скрипт postprovision.ps1 выполняется для задания секретов пользователей .NET, используемых в приложении. Чтобы избежать этой ошибки, выполните следующую команду PowerShell:

Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass

Затем повторно запустите azd up команду.

Еще одна возможная ошибка:

Pwsh не распознается как внутренняя или внешняя команда, операблирование программы или пакетного файла. ПРЕДУПРЕЖДЕНИЕ: сбой перехватчика postprovision с кодом выхода: "1", путь: ".\infra\post-script\postprovision.ps1". : код выхода: 1 Выполнение будет продолжаться, так как Параметр ContinueOnError имеет значение true.

Скрипт postprovision.ps1 выполняется для задания секретов пользователей .NET, используемых в приложении. Чтобы избежать этой ошибки, вручную запустите скрипт с помощью следующей команды PowerShell:

.\infra\post-script\postprovision.ps1

Теперь приложения .NET AI настраивают секреты пользователей и их можно протестировать.

Следующие шаги