다음을 통해 공유


도구를 사용하여 OpenAI 확장 및 .NET을 사용하여 로컬 함수 실행

간단한 .NET 8 콘솔 채팅 애플리케이션을 만들어 AI를 시작합니다. 이 애플리케이션은 로컬에서 실행되고 OpenAI gpt-3.5-turbo 모델을 사용하며, 도구를 사용하여 로컬 .NET 메서드를 호출해 모델의 기능을 확장하는 합니다. 다음 단계에 따라 OpenAI에 액세스하고 의미 체계 커널을 사용하는 방법을 알아봅니다.

필수 조건

  • .NET 8.0 SDK - .NET 8.0 SDK를 설치합니다.
  • 이 샘플을 실행할 수 있는 OpenAI의 API 키입니다.
  • Windows에서는 PowerShell v7+이 필요합니다. 버전의 유효성을 검사하려면 터미널에서 pwsh(을)를 실행합니다. 현재 버전을 반환해야 합니다. 오류가 반환되면 다음 명령을 실행합니다. dotnet tool update --global PowerShell.

간단한 .NET 8 콘솔 채팅 애플리케이션을 만들어 AI를 시작합니다. 애플리케이션은 로컬로 실행되며 Azure OpenAI 계정에 배포된 OpenAI gpt-35-turbo 모델을 사용합니다. 이 애플리케이션은 도구를 사용하여 로컬 .NET 메서드를 호출해 모델의 기능을 확장합니다. 다음 단계에 따라 Azure OpenAI를 프로비전하고 의미 체계 커널을 사용하는 방법을 알아봅니다.

필수 조건

샘플 프로젝트 가져오기

모든 빠른 시작에 대한 샘플 앱이 포함된 GitHub 리포지토리를 복제합니다.

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

Azure OpenAI 서비스 만들기

샘플 GitHub 리포지토리는 Azure OpenAI 서비스 및 모델을 프로비전하는 데 사용할 수 있는 azd Azure 개발자 CLI(azd) 템플릿으로 구성됩니다.

  1. 터미널 또는 명령 프롬프트에서 샘플 리포지토리의 src\quickstarts\azure-openai 디렉터리로 이동합니다.

  2. 명령을 azd up 실행하여 Azure OpenAI 리소스를 프로비전합니다. Azure OpenAI 서비스를 만들고 모델을 배포하는 데 몇 분 정도 걸릴 수 있습니다.

    azd up
    

    azd 또한 OpenAI 액세스 키와 같은 샘플 앱에 필요한 사용자 비밀을 구성합니다.

    참고 항목

    azd up 배포 중에 오류가 발생하면 문제 해결 섹션을 방문하세요.

Hiker Pro 샘플 사용해 보기

  1. 터미널이나 명령 프롬프트에서 azure-openai\04-HikerAIPro 디렉터리로 이동합니다.

  2. 다음 명령을 실행하여 OpenAI API 키를 샘플 앱의 암호로 구성합니다.

    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 파일에 포함되어 있습니다. 처음 몇 줄의 코드는 구성 값을 설정하고 dotnet user-secrets 명령을 사용하여 이전에 설정한 OpenAI 키를 가져옵니다.

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

AddOpenAIChatCompletion 서비스의 도움으로 Kernel 클래스가 요청 및 응답을 편리하게 수행할 수 있습니다.

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

AzureOpenAIChatCompletion 서비스의 도움으로 Kernel 클래스가 요청 및 응답을 편리하게 수행할 수 있습니다.

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

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

ImportPluginFromFunctionsCreateFromMethod 함수는 모델에서 호출할 로컬 함수를 정의합니다.

// 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은 디지털 서명되지 않았습니다. 스크립트가 시스템에서 실행되지 않습니다.

애플리케이션에 사용되는 .NET 사용자 비밀을 설정하기 위해 postprovision.ps1 스크립트가 실행됩니다. 이 오류를 방지하려면 다음 PowerShell 명령을 실행합니다.

Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass

그런 다음 azd up 명령을 다시 실행합니다.

발생할 수 있는 다른 오류:

'pwsh'가 내부 또는 외부 명령, 실행 가능한 프로그램 또는 배치 파일로 인식되지 않습니다. 경고: 종료 코드: '1', 경로: '.\infra\post-script\postprovision.ps1'으로 인해 'postprovision' 후크가 실패했습니다. : 종료 코드: 1 ContinueOnError가 true로 설정되었으므로 실행이 계속됩니다.

애플리케이션에 사용되는 .NET 사용자 비밀을 설정하기 위해 postprovision.ps1 스크립트가 실행됩니다. 이 오류를 방지하려면 다음 PowerShell 명령을 사용하여 스크립트를 수동으로 실행합니다.

.\infra\post-script\postprovision.ps1

이제 .NET AI 앱에 사용자 암호가 구성되어 테스트할 수 있습니다.

다음 단계