시맨틱 커널 시작하기: C#의 AI 오케스트레이션
.NET 애플리케이션을 구축하고 AI 환경이 발전하는 것을 지켜봤다면 아마도 다음과 같이 궁금해했을 것입니다. 내 코드베이스를 스파게티로 바꾸지 않고 대규모 언어 모델을 내 C# 프로젝트에 통합하는 가장 좋은 방법은 무엇입니까? 이것이 바로 Microsoft의 Semantic Kernel이 해결하는 문제이며, 작년에 이를 사용하여 프로덕션 애플리케이션을 구축한 후에는 이것이 내 개발자 툴킷에서 가장 중요한 도구 중 하나가 되었다고 말할 수 있습니다.
이 게시물에서는 핵심 개념 이해부터 실제 AI 도우미 구축에 이르기까지 Semantic Kernel을 시작하는 데 필요한 모든 것을 안내해 드리겠습니다. AI 개발에 발을 담그고 있거나 기존 .NET 애플리케이션에서 LLM 호출을 조정하는 구조화된 방법을 찾고 있다면 이 가이드에서 다룹니다.
시맨틱 커널이란 무엇입니까?
SK(의미론적 커널)는 애플리케이션 코드와 GPT-4o, Azure OpenAI 또는 기타 AI 서비스와 같은 대규모 언어 모델 사이에서 오케스트레이션 레이어 역할을 하는 Microsoft의 오픈 소스 SDK입니다. 기존 C# 코드와 AI 기능을 깔끔하고 구성 가능한 방식으로 결합할 수 있는 경량 미들웨어라고 생각하세요.
하지만 OpenAI API를 직접 호출하면 어떨까요? 물론 가능합니다. 간단한 사용 사례에서는 괜찮습니다. 하지만 다음과 같은 조치가 필요한 순간:
- AI가 사용자 입력에 따라 호출할 함수를 결정하도록 함
- 파이프라인에서 여러 AI 호출을 기존 코드와 결합합니다.
- AI가 이전 상호 작용을 기억할 수 있도록 메모리 및 컨텍스트를 추가하세요.
- 복잡한 작업을 통해 추론하는 다단계 에이전트 구축
…당신은 바퀴를 재발명하는 자신을 발견하게 될 것입니다. Semantic Kernel은 최고 수준의 .NET 지원, 종속성 주입 통합, 모든 C# 개발자에게 자연스럽게 느껴지는 플러그인 아키텍처를 통해 이 모든 기능을 즉시 제공합니다.
이 프로젝트는 GitHub의 microsoft/semantic-kernel 저장소에 있으며 C#, Python 및 Java용 SDK가 있습니다. C# SDK는 가장 성숙한 버전이며 여기서 중점적으로 살펴보겠습니다.
핵심 개념
코드를 작성하기 전에 구성 요소를 이해해 봅시다.
커널
Kernel은 Semantic Kernel의 중심 개체입니다. AI 서비스, 플러그인 및 구성을 하나로 묶는 오케스트레이터입니다. 하나를 만들고 여기에 서비스와 플러그인을 등록한 다음 이를 사용하여 프롬프트를 실행하거나 기능을 호출합니다. ASP.NET Core의 종속성 주입에 익숙하다면 커널은 매우 친숙하게 느껴질 것입니다. 즉, 본질적으로 AI 초능력을 갖춘 서비스 컨테이너입니다.
플러그인 및 기능
플러그인은 커널이 호출할 수 있는 관련 함수의 모음입니다. 함수에는 두 가지 형태가 있습니다.
- 프롬프트 기능 — LLM으로 전송되는 자연어 템플릿으로 정의됩니다.
- 네이티브 함수 — 커널이 발견하고 호출할 수 있는 속성으로 장식된 일반 C# 메서드
예를 들어 기본 함수 GetCurrentWeather(string city)와 날씨 데이터를 친숙한 방식으로 요약하는 프롬프트 함수가 있는 WeatherPlugin가 있을 수 있습니다.### AI 커넥터
커넥터는 Semantic Kernel이 AI 서비스와 통신하는 방식입니다. 가장 일반적인 것들은 다음과 같습니다:
AzureOpenAIChatCompletion— Azure OpenAI 서비스용OpenAIChatCompletion— OpenAI API 직접용- 벡터 검색 및 메모리용 커넥터 내장
시작 시 커널에 이를 등록하면 다른 모든 것이 제대로 작동합니다.
프로젝트 설정
손을 더럽히자. 새 콘솔 애플리케이션을 만드는 것부터 시작하세요.
dotnet new console -n SemanticKernelDemo
cd SemanticKernelDemo
이제 Semantic Kernel NuGet 패키지를 추가합니다.
dotnet add package Microsoft.SemanticKernel
dotnet add package Microsoft.SemanticKernel.Connectors.AzureOpenAI
Azure OpenAI 대신 OpenAI를 직접 사용하는 경우:
dotnet add package Microsoft.SemanticKernel.Connectors.OpenAI
메모리 및 임베딩 지원의 경우(나중에 사용함):
dotnet add package Microsoft.SemanticKernel.Plugins.Memory
dotnet add package Microsoft.Extensions.VectorData.Abstractions
.csproj은 .NET 8 이상을 대상으로 해야 합니다. Semantic Kernel의 최신 버전은 최신 .NET 기능을 최대한 활용합니다.
첫 번째 커널
커널을 생성하고 이를 AI 서비스에 연결하고 질문하는 가장 간단한 예부터 시작해 보겠습니다.
using Microsoft.SemanticKernel;
// Build the kernel with Azure OpenAI
var builder = Kernel.CreateBuilder();
builder.AddAzureOpenAIChatCompletion(
deploymentName: "gpt-4o",
endpoint: "https://your-resource.openai.azure.com/",
apiKey: "your-api-key"
);
var kernel = builder.Build();
// Invoke a simple prompt
var result = await kernel.InvokePromptAsync(
"Explain dependency injection in C# in three sentences."
);
Console.WriteLine(result);
OpenAI를 직접 사용하는 경우 서비스 등록을 교체하세요.
builder.AddOpenAIChatCompletion(
modelId: "gpt-4o",
apiKey: "your-openai-api-key"
);
그게 다야. 이를 실행하면 종속성 주입에 대한 간결한 설명을 얻을 수 있습니다. 그러나 이것은 단지 표면적인 것에 불과합니다.
프롬프트 템플릿 사용
프롬프트 템플릿을 사용하면 핸들바 스타일 구문을 사용하여 변수로 프롬프트를 매개변수화할 수 있습니다.
var prompt = """
You are a technical writer. Write a brief summary of {{$topic}}
aimed at developers with {{$experienceLevel}} experience.
Keep it under 200 words.
""";
var function = kernel.CreateFunctionFromPrompt(prompt);
var arguments = new KernelArguments
{
["topic"] = "gRPC in .NET",
["experienceLevel"] = "intermediate"
};
var result = await kernel.InvokeAsync(function, arguments);
Console.WriteLine(result);
이것이 Semantic Kernel이 빛을 발하기 시작하는 곳입니다. 재사용 가능한 프롬프트 템플릿을 정의하고 버전을 지정하고 더 큰 워크플로로 구성할 수 있습니다.
플러그인 및 기본 기능
플러그인은 Semantic Kernel이 AI와 기존 C# 코드 사이의 격차를 해소하는 곳입니다. 네이티브 함수는 커널에 노출되는 일반적인 메서드입니다.
using Microsoft.SemanticKernel;
using System.ComponentModel;
public class TimePlugin
{
[KernelFunction("get_current_time")]
[Description("Gets the current date and time in UTC")]
public string GetCurrentTime()
{
return DateTime.UtcNow.ToString("yyyy-MM-dd HH:mm:ss UTC");
}
[KernelFunction("get_time_in_timezone")]
[Description("Gets the current time in a specific timezone")]
public string GetTimeInTimezone(
[Description("The IANA timezone identifier, e.g. 'America/New_York'")] string timezone)
{
var tz = TimeZoneInfo.FindSystemTimeZoneById(timezone);
var time = TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, tz);
return time.ToString("yyyy-MM-dd HH:mm:ss");
}
}
[KernelFunction] 및 [Description] 속성을 확인하세요. 이는 매우 중요합니다. 설명은 AI가 함수를 호출하는 시기와 방법을 이해하기 위해 읽는 내용입니다. 좋은 설명은 도구를 효과적으로 사용하는 AI와 혼란스러운 AI를 구분합니다.
커널에 플러그인을 등록합니다:
var builder = Kernel.CreateBuilder();
builder.AddAzureOpenAIChatCompletion(
deploymentName: "gpt-4o",
endpoint: "https://your-resource.openai.azure.com/",
apiKey: "your-api-key"
);
builder.Plugins.AddFromType<TimePlugin>();
var kernel = builder.Build();
서비스를 주입하는 더 복잡한 플러그인을 구축할 수도 있습니다. Semantic Kernel은 Microsoft.Extensions.DependencyInjection와 통합되므로 플러그인은 다른 서비스와 마찬가지로 생성자 종속성을 받을 수 있습니다.
public class OrderPlugin
{
private readonly IOrderRepository _repository;
public OrderPlugin(IOrderRepository repository)
{
_repository = repository;
}
[KernelFunction("get_order_status")]
[Description("Retrieves the status of an order by its ID")]
public async Task<string> GetOrderStatus(
[Description("The order ID to look up")] string orderId)
{
var order = await _repository.GetByIdAsync(orderId);
return order is null
? $"No order found with ID {orderId}"
: $"Order {orderId}: {order.Status}, placed on {order.CreatedAt:d}";
}
}
함수 호출 및 자동 호출
이것은 상황이 정말 흥미로워지는 곳입니다. 함수 호출(도구 호출이라고도 함)을 사용하면 AI 모델이 대화 컨텍스트에 따라 호출할 등록된 함수를 결정하도록 할 수 있습니다. 모델은 코드를 실행하지 않습니다. “이 인수를 사용하여 함수 X를 호출하고 싶습니다"라는 구조화된 요청을 반환하고 커널이 실제 호출을 처리합니다.
자동 함수 호출을 활성화하는 방법은 다음과 같습니다.
using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.Connectors.OpenAI;
var builder = Kernel.CreateBuilder();
builder.AddAzureOpenAIChatCompletion(
deploymentName: "gpt-4o",
endpoint: "https://your-resource.openai.azure.com/",
apiKey: "your-api-key"
);
builder.Plugins.AddFromType<TimePlugin>();
builder.Plugins.AddFromType<WeatherPlugin>();
var kernel = builder.Build();
// Enable automatic function calling
var settings = new OpenAIPromptExecutionSettings
{
FunctionChoiceBehavior = FunctionChoiceBehavior.Auto()
};
var result = await kernel.InvokePromptAsync(
"What time is it in Tokyo and what's the weather like there?",
new KernelArguments(settings)
);
Console.WriteLine(result);
FunctionChoiceBehavior.Auto()를 사용하면 커널은 다음을 수행합니다.
- 사용 가능한 모든 기능에 대한 설명과 함께 프롬프트를 AI에 보냅니다.
- AI는
get_time_in_timezone및get_weather를 호출해야 한다고 결정합니다. - 커널은 해당 기능을 자동으로 실행합니다.
- 결과는 AI로 다시 전송됩니다.
- AI는 함수 결과를 사용하여 자연어 응답을 구성합니다.이 루프는 단일 호출에서 여러 번 발생할 수 있습니다. AI는 필요한 모든 정보를 수집하기 위해 여러 함수를 순서대로 호출할 수 있습니다. 또한
FunctionChoiceBehavior.Required()를 사용하여 AI가 적어도 하나의 기능을 호출하도록 강제하거나 사용이 허용된 특정 기능 목록을 제공할 수도 있습니다.
기록으로 채팅 완료
대화형 애플리케이션의 경우 ChatCompletionService를 ChatHistory 객체와 함께 직접 사용하는 것이 좋습니다.
using Microsoft.SemanticKernel.ChatCompletion;
var chatService = kernel.GetRequiredService<IChatCompletionService>();
var history = new ChatHistory();
history.AddSystemMessage("""
You are a helpful developer assistant. You have access to tools
for checking the time and weather. Be concise and friendly.
""");
while (true)
{
Console.Write("You: ");
var input = Console.ReadLine();
if (string.IsNullOrWhiteSpace(input)) break;
history.AddUserMessage(input);
var response = await chatService.GetChatMessageContentAsync(
history,
executionSettings: settings,
kernel: kernel
);
history.AddAssistantMessage(response.Content ?? "");
Console.WriteLine($"Assistant: {response.Content}");
}
이는 대화 기록을 유지하고 필요에 따라 플러그인을 호출할 수 있는 완전한 대화형 챗봇을 제공합니다.
메모리 및 임베딩
AI 애플리케이션의 가장 강력한 패턴 중 하나는 **RAG(Retrieval-Augmented Generation)**입니다. 즉, AI가 사용자 데이터를 벡터 공간에 삽입하고 쿼리 시 관련 청크를 검색하여 해당 데이터에 액세스할 수 있도록 합니다.
시맨틱 커널은 벡터 저장소 및 임베딩 작업을 위한 추상화를 제공합니다. 개발을 위해 메모리 내 벡터 저장소를 설정하는 방법은 다음과 같습니다.
using Microsoft.Extensions.VectorData;
using Microsoft.SemanticKernel.Connectors.AzureOpenAI;
using Microsoft.SemanticKernel.Embeddings;
#pragma warning disable SKEXP0010
// Create an embedding generation service
var builder = Kernel.CreateBuilder();
builder.AddAzureOpenAITextEmbeddingGeneration(
deploymentName: "text-embedding-ada-002",
endpoint: "https://your-resource.openai.azure.com/",
apiKey: "your-api-key"
);
var kernel = builder.Build();
var embeddingService = kernel.GetRequiredService<ITextEmbeddingGenerationService>();
// Generate embeddings for your documents
var documents = new[]
{
"Semantic Kernel is an open-source SDK for AI orchestration.",
"Azure OpenAI provides enterprise-grade AI models.",
"Plugins in SK allow you to expose C# methods to AI models."
};
var embeddings = await embeddingService.GenerateEmbeddingsAsync(documents);
프로덕션 시나리오의 경우 이러한 임베딩을 Azure AI Search, Qdrant 또는 Pinecone과 같은 전용 벡터 데이터베이스에 저장합니다. 시맨틱 커널에는 Microsoft.Extensions.VectorData 추상화를 통해 이들 모두에 대한 커넥터가 있습니다.
일반적인 RAG 흐름은 다음과 같습니다.
- 수집: 문서를 청크하고, 임베딩을 생성하고, 벡터 데이터베이스에 저장합니다.
- 검색: 사용자가 질문하면 쿼리를 삽입하여 가장 유사한 문서를 찾습니다.
- 생성: 검색된 문서를 사용자의 질문과 함께 LLM에 컨텍스트로 전달합니다.
[KernelFunction("search_knowledge_base")]
[Description("Searches the internal knowledge base for relevant information")]
public async Task<string> SearchKnowledgeBase(
[Description("The search query")] string query)
{
var queryEmbedding = await _embeddingService.GenerateEmbeddingAsync(query);
var results = await _vectorStore.SearchAsync(queryEmbedding, limit: 3);
return string.Join("\n\n", results.Select(r => r.Text));
}
RAG 파이프라인을 커널 기능으로 노출함으로써 AI는 지식 기반을 검색해야 할 시기를 자동으로 결정하여 오케스트레이션을 깔끔하게 유지하고 모델이 가장 잘 수행할 수 있도록 합니다.
기획자 및 에이전트
AI 애플리케이션이 더욱 복잡해짐에 따라 다단계 작업을 계획하고 실행하려면 AI가 필요합니다. 이것이 Semantic Kernel의 에이전트 프레임워크가 들어오는 곳입니다.
기본 사항: 채팅 완료 에이전트
가장 간단한 에이전트 유형은 지침과 플러그인을 사용하여 채팅 완료 모델을 래핑합니다.
using Microsoft.SemanticKernel.Agents;
#pragma warning disable SKEXP0110
var agent = new ChatCompletionAgent
{
Name = "DevAssistant",
Instructions = """
You are a senior .NET developer assistant. Help users with code
reviews, architecture decisions, and debugging. Always provide
code examples when relevant. Use your available tools to look up
current information when needed.
""",
Kernel = kernel,
Arguments = new KernelArguments(settings)
};
var history = new ChatHistory();
history.AddUserMessage("How should I structure a clean architecture project in .NET 8?");
await foreach (var message in agent.InvokeAsync(history))
{
Console.WriteLine(message.Content);
history.Add(message);
}
다중 에이전트 협업
여러 상담원이 함께 작업할 때 정말 강력해집니다. Semantic Kernel은 다양한 전문 분야를 가진 에이전트가 협업하는 그룹 채팅 패턴을 지원합니다.
#pragma warning disable SKEXP0110
var codeReviewer = new ChatCompletionAgent
{
Name = "CodeReviewer",
Instructions = """
You review C# code for bugs, performance issues, and best practices.
Be specific about what you find and suggest concrete fixes.
""",
Kernel = kernel
};
var securityAuditor = new ChatCompletionAgent
{
Name = "SecurityAuditor",
Instructions = """
You focus exclusively on security vulnerabilities in code.
Look for injection attacks, authentication issues, data exposure,
and OWASP Top 10 violations.
""",
Kernel = kernel
};
var groupChat = new AgentGroupChat(codeReviewer, securityAuditor)
{
ExecutionSettings = new AgentGroupChatSettings
{
TerminationStrategy = new MaximumIterationTerminationStrategy(4)
}
};
groupChat.AddChatMessage(
new ChatMessageContent(AuthorRole.User, "Review this code: ...")
);
await foreach (var message in groupChat.InvokeAsync())
{
Console.WriteLine($"[{message.AuthorName}]: {message.Content}");
}
이 패턴은 다양한 관점이나 전문 분야를 고려해야 하는 복잡한 작업에 매우 유용합니다. 각 에이전트는 자체 시스템 프롬프트로 작동하며 자체 플러그인 세트를 가질 수 있습니다.
실제 사례: 프로젝트 문서화 도우미 구축
파일을 읽고 질문에 답변하여 개발자가 코드베이스를 이해하도록 돕는 AI 도우미인 실제 사례를 통해 모든 것을 하나로 묶어 보겠습니다.
using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.ChatCompletion;
using Microsoft.SemanticKernel.Connectors.OpenAI;
using System.ComponentModel;
// Define our plugins
public class FileSystemPlugin
{
private readonly string _rootPath;
public FileSystemPlugin(string rootPath)
{
_rootPath = rootPath;
}
[KernelFunction("read_file")]
[Description("Reads the contents of a file from the project directory")]
public async Task<string> ReadFile(
[Description("Relative path to the file")] string path)
{
var fullPath = Path.Combine(_rootPath, path);
if (!File.Exists(fullPath))
return $"File not found: {path}";
var content = await File.ReadAllTextAsync(fullPath);
// Truncate very large files
if (content.Length > 8000)
content = content[..8000] + "\n... [truncated]";
return content;
}
[KernelFunction("list_files")]
[Description("Lists files in a directory, optionally filtered by extension")]
public string ListFiles(
[Description("Relative directory path")] string directory,
[Description("File extension filter like '.cs' or '.json'")] string? extension = null)
{
var fullPath = Path.Combine(_rootPath, directory);
if (!Directory.Exists(fullPath))
return $"Directory not found: {directory}";
var files = Directory.GetFiles(fullPath, "*.*", SearchOption.AllDirectories)
.Select(f => Path.GetRelativePath(_rootPath, f))
.Where(f => extension is null || f.EndsWith(extension))
.Take(50);
return string.Join("\n", files);
}
}
public class DocumentationPlugin
{
[KernelFunction("generate_summary")]
[Description("Generates a structured markdown summary for documentation")]
public string GenerateSummaryTemplate(
[Description("Name of the component")] string componentName,
[Description("Brief description")] string description,
[Description("Key responsibilities as comma-separated values")] string responsibilities)
{
var items = responsibilities.Split(',', StringSplitOptions.TrimEntries);
var bullets = string.Join("\n", items.Select(r => $"- {r}"));
return $"""
## {componentName}
{description}
### Responsibilities
{bullets}
---
*Generated documentation — review and expand as needed.*
""";
}
}
// Wire it all up
var builder = Kernel.CreateBuilder();
builder.AddAzureOpenAIChatCompletion(
deploymentName: "gpt-4o",
endpoint: "https://your-resource.openai.azure.com/",
apiKey: "your-api-key"
);
builder.Plugins.AddFromObject(new FileSystemPlugin("./src"));
builder.Plugins.AddFromType<DocumentationPlugin>();
var kernel = builder.Build();
var chatService = kernel.GetRequiredService<IChatCompletionService>();
var history = new ChatHistory();
history.AddSystemMessage("""
You are a codebase documentation assistant. You help developers understand
projects by reading source files and explaining architecture, patterns,
and design decisions.
When asked about code, use your tools to read the actual files rather
than guessing. Be specific and reference actual code when possible.
Generate documentation artifacts when asked.
""");
var settings = new OpenAIPromptExecutionSettings
{
FunctionChoiceBehavior = FunctionChoiceBehavior.Auto()
};
Console.WriteLine("Documentation Assistant ready. Ask me about your codebase!");
Console.WriteLine("Type 'exit' to quit.\n");
while (true)
{
Console.Write("You: ");
var input = Console.ReadLine();
if (string.IsNullOrWhiteSpace(input) || input.Equals("exit", StringComparison.OrdinalIgnoreCase))
break;
history.AddUserMessage(input);
var response = await chatService.GetChatMessageContentAsync(
history,
executionSettings: settings,
kernel: kernel
);
Console.WriteLine($"\nAssistant: {response.Content}\n");
history.AddAssistantMessage(response.Content ?? "");
}
이 도우미는 다음을 수행할 수 있습니다.- 프로젝트 디렉터리의 파일 나열 및 읽기
- 실제 소스 파일을 읽어 코드베이스에 관한 질문에 답하세요.
- 마크다운 형식으로 문서 생성
- 대화 맥락을 유지하여 후속 질문이 자연스럽게 작동하도록 합니다.
AI는 사용자가 요청한 내용에 따라 read_file, list_files 또는 generate_summary를 언제 호출할지 자동으로 결정합니다. “OrderService는 무엇을 하나요?“라고 물어보세요. 파일을 읽고, 분석하고, 설명합니다. “인증 모듈에 대한 문서 생성"을 요청하면 파일을 탐색하고 구조를 이해하고 형식화된 요약을 생성합니다.
제작 팁
Semantic Kernel 애플리케이션을 출시하기 전에 제가 힘들게 배운 몇 가지 사항은 다음과 같습니다.
종속성 주입을 적절하게 사용하세요. ASP.NET Core 앱에서 커널과 서비스를 인라인으로 만드는 대신 DI 컨테이너에 등록하세요.
builder.Services.AddKernel()
.AddAzureOpenAIChatCompletion(
deploymentName: "gpt-4o",
endpoint: configuration["AzureOpenAI:Endpoint"]!,
apiKey: configuration["AzureOpenAI:ApiKey"]!
)
.Plugins.AddFromType<TimePlugin>()
.AddFromType<OrderPlugin>();
오류를 적절하게 처리합니다. LLM 호출은 실패하거나 시간 초과되거나 예상치 못한 결과를 반환할 수 있습니다. try-catch 블록으로 호출을 래핑하고 Polly 또는 내장된 복원력 기능을 사용하여 재시도 정책을 구현하세요.
토큰 사용량을 모니터링합니다. 모든 프롬프트, 모든 기능 설명, 모든 채팅 기록은 토큰을 소비합니다. 필터를 사용하여 사용량을 기록하고 추적하세요.
kernel.FunctionInvocationFilters.Add(new LoggingFilter());
함수 설명을 정확하게 유지하세요. 모호한 설명으로 인해 AI가 함수를 잘못 호출하게 됩니다. “설명만 읽어도 이 기능을 언제, 어떻게 사용하는지 정확히 알 수 있나요?“라고 질문하여 설명을 테스트해 보세요.
결론
Semantic Kernel은 애플리케이션 구축에 대한 생각을 근본적으로 바꾸는 라이브러리 중 하나입니다. 이는 단순한 API 래퍼가 아닙니다. 유지 관리 및 테스트가 가능하고 프로덕션에 즉시 사용할 수 있는 방식으로 기존 코드로 AI 기능을 구성할 수 있는 오케스트레이션 프레임워크입니다.
제가 가장 좋아하는 점은 .NET 생태계를 존중한다는 것입니다. 종속성 주입, 속성, 비동기/대기, 인터페이스 등 이미 알고 있는 패턴을 사용하여 AI 세계로 확장합니다. 완전히 새로운 패러다임을 배울 필요는 없습니다. 툴킷에 AI를 또 다른 기능으로 추가하기만 하면 됩니다.
.NET 애플리케이션을 구축 중이고 아직 Semantic Kernel을 탐색하지 않았다면 지금이 바로 적기입니다. SDK는 안정적이고 커뮤니티가 활발하며 간단한 프롬프트 오케스트레이션부터 다중 에이전트 협업에 이르기까지 SDK가 지원하는 패턴은 현대 개발자에게 필수적인 기술이 되고 있습니다.
작게 시작하십시오. 커널을 생성하고, 플러그인을 등록하고, AI가 코드를 호출하는 것을 지켜보세요. 일단 클릭하면 애플리케이션의 모든 곳에 인텔리전스를 추가할 수 있는 기회가 나타나기 시작합니다.
공식 문서 및 GitHub 저장소는 여정을 계속하는 데 훌륭한 리소스입니다. 행복한 건물!