AutoGen·Semantic Kernel과 Microsoft Agent Framework
Microsoft의 두 가지 접근법
섹션 제목: “Microsoft의 두 가지 접근법”AutoGen은 에이전트 간 대화, Semantic Kernel은 기존 함수와 모델의 통합을 중심으로 발전했습니다. 현재 공식 저장소는 Microsoft Agent Framework(MAF)를 두 프로젝트의 후속 프레임워크로 안내합니다.
| 프레임워크 | 철학 | 강점 |
|---|---|---|
| AutoGen | 에이전트 간 대화로 문제 해결 | 동적 멀티에이전트 협업 |
| Semantic Kernel | 플러그인 + 플래너로 작업 분해 | 엔터프라이즈 통합, .NET 지원 |
AutoGen
섹션 제목: “AutoGen”핵심 개념
섹션 제목: “핵심 개념”AutoGen은 여러 에이전트가 대화를 통해 협력하여 복잡한 문제를 해결하는 프레임워크입니다. 에이전트들은 서로 메시지를 주고받으며 작업을 완성합니다.
import autogen
# v0.2 계열의 구조 설명용 예제import osconfig_list = [{"model": os.environ["OPENAI_MODEL"], "api_key": os.environ["OPENAI_API_KEY"]}]llm_config = {"config_list": config_list}
# 에이전트 정의assistant = autogen.AssistantAgent( name="Assistant", llm_config=llm_config, system_message="당신은 시니어 Python 개발자입니다.",)
# 사용자 프록시 (코드 실행 가능)user_proxy = autogen.UserProxyAgent( name="UserProxy", human_input_mode="TERMINATE", # 완료 키워드 감지 시 종료 max_consecutive_auto_reply=10, code_execution_config={ "work_dir": "workspace", "use_docker": True, # Docker 샌드박스 사용 },)
# 대화 시작user_proxy.initiate_chat( assistant, message="피보나치 수열을 계산하는 함수를 작성하고 테스트해주세요",)에이전트 대화 흐름:
UserProxy: "피보나치 수열 함수 작성 요청"Assistant: "다음 코드를 실행해주세요: [코드 블록]"UserProxy: [코드 실행] → "실행 결과: [출력]"Assistant: "테스트 코드도 추가합니다: [테스트 코드]"UserProxy: [테스트 실행] → "모든 테스트 통과. TERMINATE"GroupChat — 멀티에이전트 협업
섹션 제목: “GroupChat — 멀티에이전트 협업”GroupChat은 여러 에이전트가 라운드 테이블 형식으로 대화에 참여하는 구조입니다.
# 전문가 에이전트들coder = autogen.AssistantAgent( name="Coder", llm_config=llm_config, system_message="코드 작성을 담당합니다.",)
reviewer = autogen.AssistantAgent( name="Reviewer", llm_config=llm_config, system_message="코드 리뷰와 보안 검토를 담당합니다.",)
tester = autogen.AssistantAgent( name="Tester", llm_config=llm_config, system_message="테스트 작성과 실행을 담당합니다.",)
user_proxy = autogen.UserProxyAgent( name="Manager", human_input_mode="NEVER", code_execution_config={"work_dir": "workspace"},)
# GroupChat 구성groupchat = autogen.GroupChat( agents=[user_proxy, coder, reviewer, tester], messages=[], max_round=20, speaker_selection_method="auto", # LLM이 다음 발언자 선택)
manager = autogen.GroupChatManager( groupchat=groupchat, llm_config=llm_config,)
user_proxy.initiate_chat(manager, message="인증 모듈을 구현해주세요")Semantic Kernel
섹션 제목: “Semantic Kernel”핵심 개념
섹션 제목: “핵심 개념”Semantic Kernel의 플러그인은 에이전트가 사용할 기존 함수를 묶습니다. 과거 별도 플래너에서 현재 function calling 중심 실행으로 발전했으므로, 이전 SequentialPlanner를 신규 API처럼 사용하지 않습니다. 기존 시스템의 플러그인 개념을 이해한 뒤 MAF의 도구로 옮길 수 있습니다.
from semantic_kernel import Kernelfrom semantic_kernel.connectors.ai.open_ai import OpenAIChatCompletionfrom semantic_kernel.core_plugins import FileIOPlugin, TextPlugin
kernel = Kernel()
# AI 서비스 등록kernel.add_service( OpenAIChatCompletion( service_id="gpt4o", ai_model_id="gpt-4o", ))
# 플러그인 등록kernel.add_plugin(FileIOPlugin(), plugin_name="file")kernel.add_plugin(TextPlugin(), plugin_name="text")커스텀 플러그인
섹션 제목: “커스텀 플러그인”from semantic_kernel.functions import kernel_function
class CodeAnalysisPlugin: @kernel_function( name="analyze_complexity", description="코드의 복잡도를 분석합니다", ) def analyze_complexity(self, code: str) -> str: # 순환 복잡도 계산 complexity = calculate_cyclomatic_complexity(code) return f"복잡도: {complexity} (권장: 10 이하)"
@kernel_function( name="find_code_smells", description="코드 스멜을 감지합니다", ) def find_code_smells(self, code: str) -> str: smells = detect_smells(code) return "\n".join(smells) if smells else "코드 스멜 없음"
kernel.add_plugin(CodeAnalysisPlugin(), plugin_name="code_analysis")계획 수립의 변화
섹션 제목: “계획 수립의 변화”Semantic Kernel의 현재 계획 안내는 모델의 function calling을 중심으로 설명합니다. 모델이 함수를 선택하고, 애플리케이션이 실행 결과를 돌려주는 반복으로 계획이 발전합니다. 고정된 업무 순서가 필요하면 모델에게 순서를 전부 맡기지 않고 명시적 워크플로우를 사용합니다.
과거: 목표 → SequentialPlanner → 미리 작성한 실행 계획현재: 목표 → 모델의 함수 선택 → 실행·인가 → 결과 → 다음 함수 또는 응답고정 업무: 입력 → 명시적 단계·분기·승인 → 결과Microsoft Agent Framework로 실행
섹션 제목: “Microsoft Agent Framework로 실행”다음은 MAF Python API의 최소 도구 실행 예제입니다. agent-framework와 제공자 연동 패키지를 설치하고, OPENAI_API_KEY·OPENAI_MODEL을 환경에 설정합니다. .env 자동 로드는 가정하지 않습니다.
import asyncioimport osfrom agent_framework import Agent, toolfrom agent_framework.openai import OpenAIChatClient
@tooldef service_status(service: str) -> str: """Return a demonstration status for a service.""" return f"{service}: healthy (demo data)"
async def main(): agent = Agent( name="OperationsAssistant", client=OpenAIChatClient(model=os.environ["OPENAI_MODEL"]), instructions="도구 결과를 바탕으로 상태를 설명하세요. 데모 데이터임을 밝히세요.", tools=[service_status], ) print(await agent.run("api 서비스 상태를 알려주세요"))
asyncio.run(main())MAF는 에이전트 외에도 명시적 workflow, 세션 상태, 미들웨어, MCP 통합을 제공합니다. 코드 실행·파일 변경은 도구 함수가 실제로 제공하는 권한 범위에서만 가능합니다.
전환 시 유지할 계약
섹션 제목: “전환 시 유지할 계약”| 기존 구성 | 전환 시 확인할 내용 |
|---|---|
| AutoGen 대화·종료 조건 | 실행 종료, 최대 턴, 대화 이력 보존 |
| UserProxy 코드 실행 | 별도 실행기와 샌드박스·승인 경계 |
| Semantic Kernel 플러그인 | 함수 스키마·도구 이름·인가·오류 형식 |
| 저장된 대화·세션 | 사용자별 격리, 재개 시 중복 실행 방지 |
| GroupChat 조율 | 순차·병렬·handoff·명시적 workflow 중 선택 |
설계 유산 비교
섹션 제목: “설계 유산 비교”| 항목 | AutoGen | Semantic Kernel |
|---|---|---|
| 실행 모델 | 에이전트 간 대화 | 플러그인 조합 |
| 언어 지원 | Python | Python, C#, Java |
| 강점 | 동적 협업, 코드 실행 | 엔터프라이즈, 계획 수립 |
| 진입 장벽 | 낮음 | 중간 |
| 적합한 팀 | 스타트업, 연구 | 엔터프라이즈, .NET 팀 |
| Human-in-the-Loop | human_input_mode | 플래너 단계 중단 |
AutoGen은 에이전트 간 자연스러운 대화와 GroupChat을 통한 멀티에이전트 협업에 강점이 있습니다. Semantic Kernel은 플러그인과 플래너를 통한 구조적 작업 분해와 엔터프라이즈 환경 통합에 강점이 있습니다. 현재 신규 구축에서는 후속 MAF를 검토하며, 보관된 AutoGen 예제와 현재 지원 API를 구분해야 합니다.