.NET에서 Azure AI를 사용하여 이미지 생성
간단한 .NET 8 콘솔 채팅 애플리케이션을 만들어 의미 체계 커널을 시작합니다. 애플리케이션은 로컬로 실행되고 OpenAI dell-e-3
모델을 사용하여 우편 카드를 생성하고 친구를 하이킹에 초대합니다! 다음 단계에 따라 Azure OpenAI를 프로비전하고 의미 체계 커널을 사용하는 방법을 알아봅니다.
간단한 .NET 8 콘솔 채팅 애플리케이션을 만들어 .NET Azure OpenAI SDK를 시작합니다. 애플리케이션은 로컬로 실행되고 OpenAI dell-e-3
모델을 사용하여 우편 카드를 생성하고 친구를 하이킹에 초대합니다! 다음 단계에 따라 Azure OpenAI를 프로비전하고 .NET Azure OpenAI SDK를 사용하는 방법을 알아봅니다.
필수 조건
- .NET 8.0 SDK - .NET 8.0 SDK 설치
- Azure 구독 - 체험 구독 만들기
- Azure Developer CLI - Azure Developer CLI 설치 또는 업데이트
- Azure OpenAI 서비스에 액세스합니다.
- Windows에서는 PowerShell
v7+
이 필요합니다. 버전의 유효성을 검사하려면 터미널에서pwsh
(을)를 실행합니다. 현재 버전을 반환해야 합니다. 오류가 반환되면 다음 명령을 실행합니다.dotnet tool update --global PowerShell
.
Azure 리소스 배포
Azure OpenAI Service와 Azure Developer CLI에 액세스하려면 필수 조건을 따르고 다음 가이드에 따라 샘플 애플리케이션을 시작하도록 설정합니다.
리포지토리 복제: dotnet/ai-samples
터미널이나 명령 프롬프트에서 quickstarts 디렉터리로 이동합니다.
그러면 Azure OpenAI 리소스가 프로비전됩니다. Azure OpenAI 서비스를 만들고 모델을 배포하는 데 몇 분 정도 걸릴 수 있습니다.
azd up
참고 항목
사용 가능한 Azure OpenAI 서비스가 이미 있는 경우 배포를 건너뛰고 Program.cs(IConfiguration
권장)에서 해당 값을 사용할 수 있습니다.
문제 해결
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 앱에 사용자 비밀이 구성되어 테스트할 수 있습니다.
하이킹 이미지 생성 샘플 시도
- 터미널이나 명령 프롬프트에서
semantic-kernel\05-HikeImages
디렉터리로 이동합니다.
- 터미널이나 명령 프롬프트에서
azure-openai-sdk\05-HikeImages
디렉터리로 이동합니다.
이제 콘솔 애플리케이션을 사용해 볼 차례입니다. 앱을 실행하려면 다음을 입력합니다.
dotnet run
오류 메시지가 표시되면 Azure OpenAI 리소스 배포가 완료되지 않았을 수 있습니다. 몇 분 정도 기다렸다가 다시 시도해 보세요.
코드 이해
애플리케이션은 NuGet에서 사용할 수 있는 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();
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"];
AzureOpenAITextToImageService
서비스는 요청과 응답을 편리하게 수행할 수 있습니다.
AzureOpenAITextToImageService textToImageService = new(deployment, endpoint, key, null);
textToImageService
서비스가 만들어지면 시스템 프롬프트를 추가하여 모델에 더 많은 컨텍스트를 제공합니다. 이미지를 생성하려면 이미지에 무엇이 있는지, 사용할 특정 색, 스타일(그리기, 그리기, 그리기, 사실적 또는 만화)에 대한 명확한 설명이 필요합니다. 모델은 이 프롬프트를 사용하여 이미지를 생성합니다. 모델이 사용자 요청을 기반으로 응답을 생성하도록 하려면 GenerateImageAsync
함수를 사용하고 크기와 품질을 지정합니다.
// Generate the image
string imageUrl = await textToImageService.GenerateImageAsync("""
A postal card with an happy hiker waving and a beautiful mountain in the background.
There is a trail visible in the foreground.
The postal card has text in red saying: 'You are invited for a hike!'
""", 1024, 1024);
Console.WriteLine($"The generated image is ready at:\n{imageUrl}");
모델에서 생성된 이미지를 개인 설정하도록 프롬프트를 사용자 지정합니다.
코드 이해
애플리케이션은 NuGet에서 사용할 수 있는 Azure.AI.OpenAI
클라이언트 SDK를 사용하여 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 openAIEndpoint = config["AZURE_OPENAI_ENDPOINT"];
string openAIDeploymentName = config["AZURE_OPENAI_GPT_NAME"];
string openAiKey = config["AZURE_OPENAI_KEY"];
// == Creating the AIClient ==========
var endpoint = new Uri(openAIEndpoint);
var credentials = new AzureKeyCredential(openAiKey);
OpenAIClient
클래스는 요청과 응답을 편리하게 수행할 수 있습니다. ChatCompletionOptions
(은)는 모델이 응답하는 방식에 대한 매개 변수를 지정합니다.
var openAIClient = new OpenAIClient(endpoint, credentials);
var completionOptions = new ChatCompletionsOptions
{
MaxTokens = 400,
Temperature = 1f,
FrequencyPenalty = 0.0f,
PresencePenalty = 0.0f,
NucleusSamplingFactor = 0.95f, // Top P
DeploymentName = openAIDeploymentName
};
OpenAIClient
클라이언트가 만들어지면 시스템 프롬프트를 추가하여 모델에 더 많은 컨텍스트를 제공합니다. 이미지를 생성하려면 이미지에 무엇이 있는지, 사용할 특정 색, 스타일(그리기, 그리기, 그리기, 사실적 또는 만화)에 대한 명확한 설명이 필요합니다. 모델은 이 프롬프트를 사용하여 이미지를 생성합니다.
string imagePrompt = """
A postal card with an happy hiker waving, there a beautiful mountain in the background.
There is a trail visible in the foreground.
The postal card has text in red saying: 'You are invited for a hike!'
""";
모델이 사용자 요청을 기반으로 응답을 생성하도록 하려면 GetImageGenerationsAsync
함수를 사용하고 크기와 품질을 지정합니다.
Response<ImageGenerations> response = await openAIClient.GetImageGenerationsAsync(
new ImageGenerationOptions()
{
DeploymentName = openAIDalleName,
Prompt = imagePrompt,
Size = ImageSize.Size1024x1024,
Quality = ImageGenerationQuality.Standard
});
ImageGenerationData generatedImage = response.Value.Data[0];
if (!string.IsNullOrEmpty(generatedImage.RevisedPrompt))
{
Console.WriteLine($"\n\nInput prompt automatically revised to:\n {generatedImage.RevisedPrompt}");
}
Console.WriteLine($"\n\nThe generated image is ready at:\n {generatedImage.Url.AbsoluteUri}");
모델에서 생성된 이미지를 개인 설정하도록 프롬프트를 사용자 지정합니다.
리소스 정리
샘플 애플리케이션이나 리소스가 더 이상 필요하지 않으면 해당 배포와 모든 리소스를 제거합니다.
azd down
다음 단계
.NET
피드백
https://aka.ms/ContentUserFeedback
출시 예정: 2024년 내내 콘텐츠에 대한 피드백 메커니즘으로 GitHub 문제를 단계적으로 폐지하고 이를 새로운 피드백 시스템으로 바꿀 예정입니다. 자세한 내용은 다음을 참조하세요.다음에 대한 사용자 의견 제출 및 보기