AI 에이전트(AI Agent)의 개념과 구조
AI 에이전트는 대규모 언어 모델(LLM)을 기반으로 환경을 인지하고, 스스로 판단하여 작업을 수행하는 자율적 소프트웨어 시스템입니다. 단순한 질의응답을 넘어, 주어진 목표를 달성하기 위해 여러 단계를 계획하고 실행하는 것이 특징입니다.
주요 특징
- 자율성: 사용자의 미세한 지시 없이도 상위 목표를 달성하기 위해 자체적으로 워크플로를 구성합니다.
- 인지 및 판단: 외부 API, 데이터베이스, 센서 등을 통해 컨텍스트를 수집하고 최적의 행동 방향을 결정합니다.
- 실행 및 피드백: 결정된 작업을 수행하며, 결과에 따라 다음 단계를 동적으로 조정합니다.
에이전트의 아키텍처
- 인지 레이어: 사용자 입력 및 외부 환경 데이터를 수집하는 인터페이스.
- 추론 레이어: LLM을 활용해 수집된 정보를 분석하고 작업 계획(Plan)을 수립하는 두뇌.
- 실행 레이어: 계획된 작업을 실제로 수행하는 도구(Tools) 및 플러그인 모음.
- 메모리 레이어: 단기 대화 기록 및 장기 벡터 데이터를 관리하는 저장소.
Semantic Kernel(SK) 개요
Semantic Kernel은 OpenAI, Azure OpenAI 등의 LLM을 C#, Python, Java와 같은 기존 프로그래밍 언어와 원활하게 통합하기 위해 마이크로소프트에서 개발한 오픈소스 SDK입니다. SK의 핵심 강점은 '플러그인' 시스템을 통해 AI의 추론 능력과 기존 코드의 실행 능력을 결합할 수 있다는 점입니다.
주요 기능
- AI 서비스 추상화: 다양한 LLM 제공업체와 벡터 데이터베이스를 통일된 인터페이스로 관리.
- 플러그인 및 함수 오케스트레이션: 네이티브 코드와 프롬프트 함수를 결합하여 복잡한 워크플로 자동화.
- 자동 플래닝(Planning): 사용자의 목표를 분석하여 필요한 플러그인을 순차적으로 호출하는 실행 계획을 동적으로 생성.
- 템플릿 엔진: Handlebars, Liquid 등을 활용한 동적 프롬프트 렌더링 지원.
Semantic Kernel을 이용한 에이전트 구현 단계
1. 환경 설정 및 커널 초기화
NuGet을 통해 Microsoft.SemanticKernel 패키지를 설치하고, LLM 서비스를 커널에 등록합니다.
using Microsoft.SemanticKernel;
var builder = Kernel.CreateBuilder();
builder.AddOpenAIChatCompletion(
modelId: "gpt-4-turbo",
apiKey: Environment.GetEnvironmentVariable("OPENAI_API_KEY")!);
var aiCore = builder.Build();
2. 네이티브 및 시맨틱 플러그인 정의
에이전트가 사용할 수 있는 도구(Tools)를 정의합니다. 텍스트 처리를 위한 프롬프트 함수와 외부 시스템 연동을 위한 네이티브 함수를 생성할 수 있습니다.
// 프롬프트 기반 함수 생성
var summarizeFunction = aiCore.CreateFunctionFromPrompt(
"다음 텍스트의 핵심 내용을 3줄 이내로 요약하세요: {{$input}}",
functionName: "SummarizeText");
var translateFunction = aiCore.CreateFunctionFromPrompt(
"주어진 텍스트를 {{$targetLang}} 언어로 번역하세요: {{$input}}",
functionName: "TranslateText");
3. 메모리 컨텍스트 통합
사용자의 이전 상호작용이나 선호도를 기억하기 위해 벡터 스토리지와 메모리 플러그인을 연결합니다.
using Microsoft.SemanticKernel.Memory;
using Microsoft.SemanticKernel.Connectors.OpenAI;
var memoryBuilder = new MemoryBuilder();
memoryBuilder.WithOpenAITextEmbeddingGeneration("text-embedding-ada-002", Environment.GetEnvironmentVariable("OPENAI_API_KEY")!);
memoryBuilder.WithInMemoryStore();
var agentMemory = memoryBuilder.Build();
await agentMemory.SaveInformationAsync(
collection: "UserProfiles",
text: "사용자는 기술 문서 번역 시 전문 용어의 정확성을 선호함.",
id: "pref_001");
4. 워크플로 실행 및 오케스트레이션
정의된 함수들을 순차적으로 호출하거나, 플래너를 통해 동적으로 작업을 수행합니다.
종합 예제: 다국어 문서 처리 에이전트
다음은 입력된 장문의 기술 문서를 요약하고, 사용자의 선호 언어로 번역한 뒤 그 결과를 출력하는 완전한 C# 콘솔 애플리케이션 예제입니다.
using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.Connectors.OpenAI;
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
namespace AgentDemo
{
class Program
{
static async Task Main()
{
// 1. 커널 빌더 설정
var coreBuilder = Kernel.CreateBuilder();
coreBuilder.AddOpenAIChatCompletion("gpt-4o", Environment.GetEnvironmentVariable("OPENAI_API_KEY")!);
var core = coreBuilder.Build();
// 2. 시맨틱 함수(프롬프트) 정의
var promptConfig = new PromptExecutionSettings
{
ExtensionData = new Dictionary<string, object> { { "Temperature", 0.2 } }
};
var summaryFunc = core.CreateFunctionFromPrompt(
"Analyze and summarize the technical context: {{$doc}}",
executionSettings: promptConfig,
functionName: "AnalyzeDoc");
var localizationFunc = core.CreateFunctionFromPrompt(
"Translate the summary into {{$locale}}: {{$doc}}",
executionSettings: promptConfig,
functionName: "LocalizeDoc");
// 3. 입력 데이터 및 매개변수 준비
string rawDocument = "Semantic Kernel provides a flexible architecture for orchestrating AI plugins and native code seamlessly.";
string userLocale = "Korean";
var arguments = new KernelArguments
{
["doc"] = rawDocument,
["locale"] = userLocale
};
// 4. 파이프라인 실행 (요약 -> 번역)
var summaryResult = await core.InvokeAsync(summaryFunc, arguments);
arguments["doc"] = summaryResult.ToString();
var finalOutput = await core.InvokeAsync(localizationFunc, arguments);
// 5. 결과 출력
Console.WriteLine($"[Original Summary]: {summaryResult}");
Console.WriteLine($"[Localized Output]: {finalOutput}");
}
}
}
위 코드를 실행하면 에이전트가 원본 텍스트를 분석하여 요약본을 생성하고, 지정된 로케일(Korean)에 맞게 자동으로 번역 작업을 수행합니다. 필요에 따라 KernelArguments에 추가 컨텍스트를 주입하거나, 외부 API를 호출하는 네이티브 플러그인을 등록하여 에이전트의 기능을 무한히 확장할 수 있습니다.