프로그래밍/AI 기술

Azure OpenAI 의 Prompty 를 활용하여 .NET 앱에 AI를 쉽게 만들어봐요.

재우니 2024. 11. 5. 14:29

 

https://www.youtube.com/watch?v=HALMFU7o9Gc

 

 

.NET 개발에 AI 기능을 추가하는 것은 새롭고 신나는 경험입니다. 이 블로그 게시물에서는 Prompty를 살펴보고 이를 사용하여 GPT-4o와 같은 대규모 언어 모델을 개발 흐름과 .NET 애플리케이션에 통합하는 방법을 알아보겠습니다.

 

 

Prompty 소개

AI 애호가이자 .NET 개발자로서 우리는 끊임없이 워크플로를 간소화하고 생산성을 향상시키는 도구를 찾습니다. 그러한 강력한 도구 중 하나는 GPT-4o와 같은 대규모 언어 모델(LLM)을 애플리케이션에 통합하도록 설계된 Visual Studio Code 확장 프로그램인 Prompty입니다. Prompty는 개발 환경에서 직접 LLM과 상호 작용할 수 있는 직관적인 인터페이스를 제공하여 프로젝트에 AI 기능을 추가하는 것을 그 어느 때보다 쉽게 ​​만들어줍니다.

 

https://microsoft.github.io/promptflow/

 

Prompty는 Microsoft에서 개발했으며 Visual Studio Code 마켓플레이스에서 무료로 제공됩니다. 챗봇을 구축하든, 콘텐츠 생성기를 만들든, 다른 AI 기반 애플리케이션을 실험하든, Prompty는 개발 프로세스를 상당히 간소화할 수 있습니다.

 

 

Visual Studio Code에서 Prompty를 사용하는 개발자의 일반적인 흐름에 대한 설명

 

 

Prompty를 사용하는 방법에 대한 샘플 흐름을 살펴보겠습니다. 이 프로세스에는 일반적으로 몇 가지 핵심 단계가 포함됩니다.

  1. 설치 : Visual Studio Code Marketplace 에서 Prompty 확장 프로그램을 설치하여 시작합니다 .
  2. 설정 : 설치 후 API 키를 제공하고 GPT-4o와 같이 선택한 LLM에 연결하는 데 필요한 매개변수를 설정하여 확장 프로그램을 구성합니다.
  3. 통합 : Prompty는 개발 워크플로와 완벽하게 통합됩니다. LLM을 사용하려는 새 파일을 만들거나 기존 파일을 열어서 시작하세요. Prompty는 프롬프트를 쉽게 삽입하고 응답을 처리할 수 있는 명령과 스니펫을 제공합니다.
  4. 개발 : LLM과 상호 작용하기 위해 코드베이스에 직접 프롬프트를 작성합니다. Prompty는 다양한 프롬프트 형식을 지원하고 구문 강조 표시를 제공하여 프롬프트를 읽기 쉽고 유지 관리하기 쉽게 만듭니다.
  5. 확장 프로그램을 사용하여 코드 조각을 생성하거나, 문서를 만들거나, LLM 특정 질문을 하여 애플리케이션을 디버깅할 수도 있습니다. 프롬프트를 준비하면 확장 프로그램을 사용하여 코드 조각을 생성하거나, 문서를 만들거나, LLM 특정 질문을 하여 애플리케이션을 디버깅할 수도 있습니다.
  6. 테스트 : 프롬프트를 테스트하고 필요에 따라 조정하여 LLM에서 원하는 응답을 얻으세요. Prompty를 사용하면 빠르게 반복하고 프롬프트를 정제하여 AI 응답의 정확도와 관련성을 개선할 수 있습니다.

 

WebAPI 애플리케이션을 사용한 실제 샘플

.NET WebAPI 애플리케이션에서 Prompty를 사용하는 실제 예를 살펴보겠습니다.

1단계: WebAPI 프로젝트 설정

PromptyWebAPI먼저 .NET CLI를 사용하여 이름이 지정된 새 WebAPI 프로젝트를 만듭니다 .

 

dotnet new webapi -n PromptyWebAPI
cd PromptyWebAPI

 

 

다음 종속성을 추가합니다.

dotnet add package Microsoft.SemanticKernel --version 1.15.1
dotnet add package Microsoft.SemanticKernel.Prompty --version 1.15.1-alpha
dotnet add package Microsoft.Extensions.Configuration.UserSecrets --version 8.0.0

 

 

Visual Studio Code에서 직접 프로젝트를 실행하거나 다음 명령을 사용하여 프로젝트를 실행합니다.

 

 

dotnet run

 

 

표준 날씨 예보 API 엔드포인트를 살펴보겠습니다.

 

 

 

참고: WebAPI 프로젝트는 사용자 비밀을 사용하여 GPT-4o Azure OpenAI 모델에 액세스합니다. 다음 명령으로 user secrets  을 설정합니다.

dotnet user-secrets init
dotnet user-secrets set "AZURE_OPENAI_MODEL" "< model >"
dotnet user-secrets set "AZURE_OPENAI_ENDPOINT" "< endpoint >"
dotnet user-secrets set "AZURE_OPENAI_APIKEY" "< api key >"

 

 

2단계: 예측에 대한 보다 설명적인 요약을 위한 프롬프트를 만듭니다.

 

일기 예보는 날짜, 온도(C 및 F) 및 요약을 포함한 가상의 예보를 반환합니다. 우리의 목표는 더 자세한 요약을 생성할 수 있는 프롬프트를 만드는 것입니다. PromptyWebAPI 폴더의 루트에 새 빈 파일을 추가해 보겠습니다. 마우스 오른쪽 버튼을 클릭하고 새 빈을 선택하기만 하면 됩니다. 생성된 파일의 이름을 weatherforecastdesc.prompty로 변경합니다. 솔루션은 다음과 같이 표시됩니다:

 

 

 

 

 

이제 빈 파일의 섹션을 완성할 차례입니다. 각 섹션에는 LLM 사용과 관련된 구체적인 정보가 있습니다. 예를 들어, model section 에서는 사용할 모델을 정의하고, sample section 에서는 예상 출력에 대한 샘플을 제공하며, 마지막으로 프롬프트가 사용됩니다.

 

다음 샘플에서는 프롬프트가 System message 를 정의하고 Context 에서 날씨에 대한 매개 변수를 제공합니다. 빈 파일의 내용을 다음 내용으로 바꿉니다.

 

---
name: generate_weather_detailed_description
description: A prompt that generated a detaled description for a weather forecast
authors:
  - Bruno Capuano
model:
  api: chat
  configuration:
    type: azure_openai
    azure_endpoint: ${env:AZURE_OPENAI_ENDPOINT}
    azure_deployment: ${env:AZURE_OPENAI_MODEL}
  parameters:
    max_tokens: 3000
sample:
  today: > 
    2024-07-16

  date: > 
    2024-07-17

  forecastTemperatureC: >
    25°C
---

# System:
You are an AI assistant who generated detailed weather forecast descriptions. The detailed description is a paragraph long.
You use the full description of the date, including the weekday.
You also give a reference to the forecast compared to the current date today.
As the assistant, you generate descriptions using a funny style and even add some personal flair with appropriate emojis.

# Context
Use the following context to generated a detailed weather forecast descriptions 
- Today: {{today}}
- Date: {{date}}
- TemperatureC: {{forecastTemperatureC}}

 

 

빈칸이 준비되면 F5를 눌러 프롬프트를 테스트할 수 있습니다. 프롬프트를 실행하면 출력 창에서 결과를 확인할 수 있습니다:

 

 

 

 

프롬프트를 다듬기 시작할 때입니다! 

 

보너스: 빈 파일을 마우스 오른쪽 버튼으로 클릭하고 시맨틱 커널을 사용하여 C# 코드를 생성하여 현재 파일을 사용하도록 허용하세요.

 

 

 

 

 

참고: 그 전에 비어 있는 LLM이 사용할 수 있도록 필요한 정보를 제공해야 합니다. 확장자 설정에 따라 이 작업을 수행하세요. 가장 쉬운 방법은 LLM 정보가 포함된 .env 파일을 만드는 것입니다.

 

 

3단계: 예측 요약을 위해 prompty를 사용하여 엔드포인트 업데이트

 

이제 우리는 Semantic Kernel을 프로젝트에서 직접 사용하여 이 프롬프트를 사용할 수 있습니다. 파일을 편집 program.cs하고 다음 변경 사항을 적용해 보겠습니다.

  • 필요한 using을 파일 맨 위에 추가합니다.
  • 예측 요약을 생성하기 위해 의미적 커널을 만듭니다.
  • 예측 결과에 새로운 예측 요약을 추가합니다.
  • 자세한 요약을 생성하기 위해 Semantic Kernel은 프롬프트 파일과 날씨 정보를 사용합니다.

 

using Microsoft.SemanticKernel;

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();

// Azure OpenAI keys
var config = new ConfigurationBuilder().AddUserSecrets<Program>().Build();
var deploymentName = config["AZURE_OPENAI_MODEL"];
var endpoint = config["AZURE_OPENAI_ENDPOINT"];
var apiKey = config["AZURE_OPENAI_APIKEY"];

// Create a chat completion service
builder.Services.AddKernel();
builder.Services.AddAzureOpenAIChatCompletion(deploymentName, endpoint, apiKey);

var app = builder.Build();

// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}

app.UseHttpsRedirection();

app.MapGet("/weatherforecast", async (HttpContext context, Kernel kernel) =>
{
    var forecast = new List<WeatherForecast>();
    for (int i = 0; i < 3; i++)
    {
        var forecastDate = DateOnly.FromDateTime(DateTime.Now.AddDays(i));
        var forecastTemperature = Random.Shared.Next(-20, 55);

        var weatherFunc = kernel.CreateFunctionFromPromptyFile("weatherforecastdesc.prompty");
        var forecastSummary = await weatherFunc.InvokeAsync<string>(kernel, new()
        {
            { "today", $"{DateOnly.FromDateTime(DateTime.Now)}" },
            { "date", $"{forecastDate}" },
            { "forecastTemperatureC", $"{forecastTemperature}" }
        });

        forecast.Add(new WeatherForecast(forecastDate, forecastTemperature, forecastSummary));
    }
    return forecast;
})
.WithName("GetWeatherForecast")
.WithOpenApi();

app.Run();

record WeatherForecast(DateOnly Date, int TemperatureC, string? Summary)
{
    public int TemperatureF => 32 + (int)(TemperatureC / 0.5556);
}

 

 

우리가 엔드포인트를 다시 테스트할 때 /weatherforecast, 출력에는 더 자세한 요약이 포함되어야 합니다. 다음 예에는 현재 날짜(Jul-16)와 2일이 더 포함됩니다.

 

참고: 이는 무작위로 생성된 온도입니다. 하루 만에 -4C/25F에서 45C/112F로 온도가 변한 것은 확실하지 않습니다.

[
  {
    "date": "2024-07-16",
    "temperatureC": -4,
    "summary": "🌬️❄️ Happy Tuesday, July 16th, 2024, folks! Guess what? Today’s weather forecast is brought to you by the Frozen Frappuccino Club, because it’s a chilly one! With a temperature of -4°C, it’s colder than a snowman’s nose out there! 🥶 So, get ready to channel your inner penguin and waddle through the frosty air. Remember to layer up with your snuggiest sweaters and warmest scarves, or you might just turn into an icicle! Compared to good old yesterday, well... there’s not much change, because yesterday was just as brrrrr-tastic. Stay warm, my friends, and maybe keep a hot chocolate handy for emergencies! ☕⛄",
    "temperatureF": 25
  },
  {
    "date": "2024-07-17",
    "temperatureC": 45,
    "summary": "🌞🔥 Well, buckle up, buttercup, because *Wednesday, July 17, 2024*, is coming in hot! If you thought today was toasty, wait until you get a load of tomorrow. With a sizzling temperature of 45°C, it's like Mother Nature cranked the thermostat up to \"sauna mode.\" 🌡️ Don't even think about wearing dark colors or stepping outside without some serious SPF and hydration on standby! Maybe it's a good day to try frying an egg on the sidewalk for breakfast—just kidding, or am I? 🥵 Anyway, stay cool, find a shady spot, and keep your ice cream close; you're gonna need it! 🍦",
    "temperatureF": 112
  },
  {
    "date": "2024-07-18",
    "temperatureC": 35,
    "summary": "Ladies and gentlemen, fasten your seatbelts and hold onto your hats—it’s going to be a sizzling ride! 🕶️🌞 On Thursday, July 18, 2024, just two days from today, Mother Nature cranks up the heat like she’s trying to turn the entire planet into a giant summer barbecue. 🌡️🔥 With the temperature shooting up to a toasty 35°C, it’s the perfect day to channel your inner popsicle in front of the A/C. Water fights, ice cream sundaes, and epic pool floats are all highly recommended survival strategies. And remember, folks, sunscreen is your best friend—don't be caught out there lookin’ like a lobster in a sauna! 🦞☀️ So get ready to sweat but with style, as we dive headfirst into the fantastic scorching adventure that Thursday promises to be! 😎🍧🌴",
    "temperatureF": 94
  }
]

 

 

 

요약

 

Prompty는 .NET 개발자에게 AI 기능을 애플리케이션에 통합하는 효율적인 방법을 제공합니다. 이 Visual Studio Code 확장 프로그램을 사용하면 개발자는 GPT-4o 및 기타 대규모 언어 모델을 워크플로에 손쉽게 통합할 수 있습니다.

Prompty and Semantic Kernel은 AI 기반을 중심으로 코드 조각 생성, 문서 작성 및 애플리케이션 디버깅 프로세스를 간소화합니다.

 

 

Prompty에 대해 자세히 알아보고 기능을 살펴보려면 Prompty 메인 페이지를 방문하고 Prompty Visual Studio Code 확장 프로그램을 확인하고 GitHub에서 Prompty 소스 코드를 살펴 보거나 Prompty와 AI Studio를 활용한 실용적인 End-to-End AI 개발 유투브를 시청하세요.

 

 



https://github.com/elbruno/PromptySample

 

GitHub - elbruno/PromptySample: Prompty sample to support .NET Blog post

Prompty sample to support .NET Blog post. Contribute to elbruno/PromptySample development by creating an account on GitHub.

github.com

 

https://devblogs.microsoft.com/dotnet/add-ai-to-your-dotnet-apps-easily-with-prompty/

 

Add AI to Your .NET Apps Easily with Prompty - .NET Blog

Learn how to integrate AI into your .NET applications with Prompty, a powerful Visual Studio Code extension.

devblogs.microsoft.com

 

https://www.youtube.com/watch?v=HALMFU7o9Gc