Semantic Kernel로 AI 에이전트 구축하기
Semantic Kernel은 Microsoft가 개발한 오픈소스 SDK로, LLM을 기존 애플리케이션에 통합하는 것을 쉽게 만들어줍니다. 플러그인 기반 아키텍처로 AI 에이전트를 구성할 수 있습니다.
프로젝트 설정
// NuGet 패키지 설치
dotnet add package Microsoft.SemanticKernel
dotnet add package Microsoft.SemanticKernel.Plugins.Core
// Program.cs - Kernel 초기화
using Microsoft.SemanticKernel;
var builder = Kernel.CreateBuilder();
builder.AddAzureOpenAIChatCompletion(
deploymentName: "gpt-4",
endpoint: "https://my-resource.openai.azure.com/",
apiKey: Environment.GetEnvironmentVariable("AZURE_OPENAI_KEY")!
);
var kernel = builder.Build();
네이티브 플러그인 작성
using Microsoft.SemanticKernel;
using System.ComponentModel;
public class WeatherPlugin
{
[KernelFunction, Description("현재 날씨 정보를 가져옵니다")]
public async Task<string> GetWeather(
[Description("도시 이름")] string city)
{
var client = new HttpClient();
var response = await client.GetStringAsync(
$"https://api.weather.com/v1/current?city={city}");
return response;
}
[KernelFunction, Description("일기 예보를 가져옵니다")]
public async Task<string> GetForecast(
[Description("도시 이름")] string city,
[Description("예보 일수")] int days = 5)
{
return $"{city}의 {days}일 예보: 맑음 → 흐림 → 비";
}
}
프롬프트 플러그인
// Plugins/SummaryPlugin/Summarize/config.json
{
"schema": 1,
"description": "텍스트를 요약합니다",
"execution_settings": {
"default": {
"max_tokens": 500,
"temperature": 0.3
}
},
"input_variables": [
{
"name": "input",
"description": "요약할 텍스트",
"required": true
}
]
}
자동 함수 호출 (AI 에이전트)
using Microsoft.SemanticKernel.ChatCompletion;
using Microsoft.SemanticKernel.Connectors.OpenAI;
kernel.Plugins.AddFromType<WeatherPlugin>();
kernel.Plugins.AddFromType<CalendarPlugin>();
var settings = new OpenAIPromptExecutionSettings
{
ToolCallBehavior = ToolCallBehavior.AutoInvokeKernelFunctions
};
var chatService = kernel.GetRequiredService<IChatCompletionService>();
var history = new ChatHistory();
history.AddSystemMessage("당신은 일정과 날씨를 관리하는 비서입니다.");
while (true)
{
Console.Write("You: ");
var input = Console.ReadLine()!;
history.AddUserMessage(input);
var response = await chatService.GetChatMessageContentAsync(
history, settings, kernel);
Console.WriteLine($"AI: {response.Content}");
history.AddAssistantMessage(response.Content!);
}
메모리와 벡터 검색
using Microsoft.SemanticKernel.Memory;
var memoryBuilder = new MemoryBuilder();
memoryBuilder.WithAzureOpenAITextEmbeddingGeneration(
"text-embedding-ada-002", endpoint, apiKey);
memoryBuilder.WithQdrantMemoryStore("http://localhost:6333", 1536);
var memory = memoryBuilder.Build();
await memory.SaveInformationAsync("docs",
"Semantic Kernel은 AI 오케스트레이션 SDK입니다", "sk-intro");
var results = memory.SearchAsync("docs", "SK란 무엇인가?", limit: 3);
await foreach (var result in results)
{
Console.WriteLine($"관련도: {result.Relevance:P} - {result.Metadata.Text}");
}
Semantic Kernel vs LangChain
| 항목 | Semantic Kernel | LangChain |
|---|---|---|
| 언어 | C#, Python, Java | Python, JS |
| 아키텍처 | 플러그인 기반 | 체인 기반 |
| 기업 지원 | Microsoft (Azure 통합) | 커뮤니티 중심 |
| 타입 안전성 | 강력 (C#) | 보통 |
- 엔터프라이즈 .NET 환경에서는 Semantic Kernel이 자연스러운 선택
- 플러그인 아키텍처 덕분에 기존 비즈니스 로직 재활용 용이
- Azure 서비스와의 깊은 통합이 강점
- Planner를 통한 자동 작업 분해 및 실행 가능
댓글 0