본문 바로가기
AI2025년 12월 20일7분 읽기

Semantic Kernel — C#/.NET에서 AI 에이전트 구축

YS
김영삼
조회 291

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 KernelLangChain
언어C#, Python, JavaPython, JS
아키텍처플러그인 기반체인 기반
기업 지원Microsoft (Azure 통합)커뮤니티 중심
타입 안전성강력 (C#)보통
  • 엔터프라이즈 .NET 환경에서는 Semantic Kernel이 자연스러운 선택
  • 플러그인 아키텍처 덕분에 기존 비즈니스 로직 재활용 용이
  • Azure 서비스와의 깊은 통합이 강점
  • Planner를 통한 자동 작업 분해 및 실행 가능

댓글 0

아직 댓글이 없습니다.
Ctrl+Enter로 등록