.NET AI 채팅 앱 데이터에 대한 인사이트 가져오기
.NET 8 콘솔 앱을 사용하여 OpenAI gpt-3.5-turbo
모델에 연결해 AI 개발을 시작합니다. 의미 체계 커널을 사용하여 AI 모델에 연결하여 하이킹 데이터를 분석하고 인사이트를 제공합니다.
필수 조건
- .NET 8.0 SDK - .NET 8.0 SDK를 설치합니다.
- 이 샘플을 실행할 수 있는 OpenAI의 API 키입니다.
- Windows에서는 PowerShell
v7+
이 필요합니다. 버전의 유효성을 검사하려면 터미널에서pwsh
(을)를 실행합니다. 현재 버전을 반환해야 합니다. 오류가 반환되면 다음 명령을 실행합니다.dotnet tool update --global PowerShell
.
.NET 8 콘솔 앱을 사용하여 Azure에 배포된 OpenAI gpt-3.5-turbo
모델에 연결해 AI 개발을 시작합니다. 의미 체계 커널을 사용하여 AI 모델에 연결하여 하이킹 데이터를 분석하고 인사이트를 제공합니다.
필수 조건
- .NET 8 SDK - .NET 8 SDK를 설치합니다.
- Azure 구독 – 체험 구독을 만듭니다.
- Azure OpenAI 서비스에 액세스합니다.
- Azure 개발자 CLI(선택 사항) - Azure Developer CLI를 설치하거나 업데이트합니다.
샘플 프로젝트 가져오기
샘플 리포지토리 복제
앞의 섹션의 단계를 사용하여 고유한 앱을 만들거나 모든 빠른 시작에 대해 완료된 샘플 앱이 포함된 GitHub 리포지토리를 복제할 수 있습니다. Azure OpenAI를 사용하려는 경우 샘플 리포지토리는 Azure OpenAI 리소스를 프로비전할 수 있는 Azure 개발자 CLI 템플릿으로도 구성됩니다.
git clone https://github.com/dotnet/ai-samples.git
Azure OpenAI 서비스 만들기
- Azure Developer CLI
- Azure CLI
- Azure Portal
샘플 GitHub 리포지토리는 Azure OpenAI 서비스 및 모델을 프로비전하는 데 사용할 수 있는 azd
Azure 개발자 CLI(azd
) 템플릿으로 구성됩니다.
터미널 또는 명령 프롬프트에서 샘플 리포지토리의 디렉터리로 이동합니다
src\quickstarts\azure-openai
.명령을
azd up
실행하여 Azure OpenAI 리소스를 프로비전합니다. Azure OpenAI 서비스를 만들고 모델을 배포하는 데 몇 분 정도 걸릴 수 있습니다.azd up
azd
또한 Azure OpenAI 엔드포인트 및 모델 이름과 같은 샘플 앱에 필요한 사용자 비밀을 구성합니다.
하이킹 채팅 샘플 사용해 보기
터미널이나 명령 프롬프트에서
src\quickstarts\openai\semantic-kernel\03-ChattingAboutMyHikes
디렉터리로 이동합니다.다음 명령을 실행하여 OpenAI API 키를 샘플 앱의 암호로 구성합니다.
dotnet user-secrets init dotnet user-secrets set OpenAIKey <your-openai-key>
dotnet run
명령을 사용하여 앱을 실행합니다.dotnet run
터미널이나 명령 프롬프트에서
semantic-kernel\02-HikerAI
디렉터리로 이동합니다.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"];
OpenAIChatCompletionService
서비스는 요청과 응답을 편리하게 수행할 수 있습니다.
// Create the OpenAI Chat Completion Service
OpenAIChatCompletionService service = new(model, key);
OpenAIChatCompletionService
클라이언트가 만들어지면 앱이 파일 hikes.md
의 콘텐츠를 읽고 이를 사용하여 시스템 프롬프트를 추가해 모델에 더 많은 컨텍스트를 제공합니다. 이는 대화 중에 모델 동작 및 생성된 완료에 영향을 줍니다.
이 애플리케이션은 Microsoft.SemanticKernel
패키지를 사용하여 Azure에 배포된 Azure OpenAI 서비스에 요청을 보내고 받습니다.
전체 애플리케이션은 Program.cs 파일에 포함되어 있습니다. 코드의 처음 몇 줄은 애플리케이션 프로비전 중에 dotnet user-secrets
에 설정된 비밀 및 구성 값을 로드합니다.
// == Retrieve the local secrets saved during the Azure deployment ==========
var config = new ConfigurationBuilder().AddUserSecrets<Program>().Build();
string endpoint = config["AZURE_OPENAI_ENDPOINT"];
string deployment = config["AZURE_OPENAI_GPT_NAME"];
AzureOpenAIChatCompletionService
서비스는 요청과 응답을 편리하게 수행할 수 있습니다.
// == Create the Azure OpenAI Chat Completion Service ==========
AzureOpenAIChatCompletionService service = new(deployment, endpoint, new DefaultAzureCredential());
OpenAIChatCompletionService
클라이언트가 만들어지면 앱이 파일 hikes.md
의 콘텐츠를 읽고 이를 사용하여 시스템 프롬프트를 추가해 모델에 더 많은 컨텍스트를 제공합니다. 이는 대화 중에 모델 동작 및 생성된 완료에 영향을 줍니다.
// Provide context for the AI model
ChatHistory chatHistory = new($"""
You are upbeat and friendly. You introduce yourself when first saying hello.
Provide a short answer only based on the user hiking records below:
{File.ReadAllText("hikes.md")}
""");
Console.WriteLine($"{chatHistory.Last().Role} >>> {chatHistory.Last().Content}");
다음 코드는 AddUserMessage
함수를 사용하여 모델에 사용자 프롬프트를 추가합니다. GetChatMessageContentAsync
함수는 시스템 및 사용자 프롬프트를 기반으로 응답을 생성하도록 모델에 지시합니다.
// Start the conversation
chatHistory.AddUserMessage("Hi!");
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}");
앱은 모델의 응답을 chatHistory
에 추가하여 채팅 기록이나 컨텍스트를 유지합니다.
// Continue the conversation with a question.
chatHistory.AddUserMessage(
"I would like to know the ratio of the hikes I've done in Canada compared to other countries.");
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}");
시스템 또는 사용자 프롬프트를 사용자 지정하여 다양한 질문과 컨텍스트를 제공합니다.
- 비가 올 때 하이킹을 몇 번 했나요?
- 2021년에 하이킹을 몇 번 했나요?
모델은 입력을 기반으로 각 프롬프트에 대한 관련 응답을 생성합니다.
리소스 정리
샘플 애플리케이션이나 리소스가 더 이상 필요하지 않으면 해당 배포와 모든 리소스를 제거합니다.
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 앱에 사용자 암호가 구성되어 테스트할 수 있습니다.
다음 단계
.NET