AutoGen Docs: https://microsoft.github.io/autogen/0.2/docs/tutorial/introduction/
AutoGen을 활용해서 애플리케이션을 개발하기 위해서 AutoGen를 제대로 이해해보고자 document에 있는 내용을 정리하면서 실습해보려고 한다.
"""
The v0.4 version contains breaking changes. Please read this guide carefully. We still maintain the v0.2 version in the 0.2 branch; however, we highly recommend you upgrade to the v0.4 version.
"""
그리고 현재 v.0.2.* 버전, v.0.4 버전이 있는데, v0.4 버전으로의 업데이트를 권장하고 있긴하다. v.0.4에는 새로운 API와 기능이 도입되어, 호환되지 않은 변경사항이 있다고 한다.
x에 올라온 statement를 발췌해보면
우리는 현재 AutoGen v0.2를 적극적으로 유지관리 중이며,
AutoGen v0.4 (AutoGen-Core, AutoGen-AgentChat)도 새롭게 출시했습니다. 그 외에도 AutoGen-Studio, Magentic-One 등 다양한 구성 요소들이 프로젝트 로드맵에 포함되어 있습니다. 라고 한다.
일단 v0.2 버전에 있는 것을 훑어본 다음에 v0.4 마이그레이션 파트를 볼 예정이다. documents를 보면서 샘플 코드를 같이 병행해서 학습하고 있는데, autogen 버전은 0.8.6 이고 autogen-agentchat 버전은 0.5.2를 사용했다.
"AutoGen is an open-source framework that leverages multiple agents to enable complex workflows."
AutoGen은 여러 에이전트를 활용하여 복잡한 워크플로를 구현하는 오픈소스 프레임워크이다.
AutoGen 공식 document에서 제공하는 튜토리얼을 기반으로 AutoGen의 기본 개념과 구성 요소를 살펴보자.
The whole is greater than the sum of its parts.
Aristotle
(전체는 부분의 합보다 크다, 아리스토텔레스)
에이전트에 대한 정의는 다양하지만, AutoGen에서 에이전트는 model(모델), toool(도구), human input(사용자 입력) 또는 이들의 조합을 사용해서 receive messages(메시지를 받고), send messages(메시지를 보내고), generate a reply(응답을 생성) 할 수 있는 개체(entity)이다.
이러한 추상화는 에이전트가 사람 및 알고리즘과 같이 실제적으로 추상적인 개체를 모델링할 수 있도록 할 뿐만 아니라, 에이전트 간의 협업을 통해 복잡한 워크플로우 구현을 간소화한다.
🔍 Abstraction(추상화) :
핵심적인 특징만 뽑아서 단순화해 표현하는 것. 복잡한 것을 단순한 개념이나 구조로 표현하는 것.
예를 들어 "사람" 이라는 개념을 사용할때name,age,speak()와 같은 속성과 기능으로만 표현할 수 있는데, 이렇게 복잡한 것을 간단한 틀로 정의해서 다루는 방식을 추상화 라고 한다.
- 즉, AutoGen에서의 "이러한 추상화" 의 의미는, AutoGen에서 에이전트를 메시지를 보내고, 메시지를 받고, 응답을 생성할 수 있는 존재로 추상화 했기 때문에 사람도 에이전트로 볼 수 있고, 알고리즘이나 도구도 에이전트로 볼 수 있다는 것이다.
AutoGen에서는 에이전트를 소통하고 응답하는 존재로 단순화해서 정의함으로써, 다양한 대상인 사람이나 도구, AI를 일관되게 다룰 수 있게 한 것이다.- 좀 더 풀어서 설명하자면, AutoGen에서도 사람이든, 챗봇이든, 계산기든 다양한 entity를 하나의 공통된 방식으로 다루고 싶을 때 "메시지를 받고, 보내고, 응답을 생성한다"라고 에이전트를 추상화함으로써 사람은 질문을 받고 답하니까 사람도 에이전트, 모델도 메시지를 받아 응답하니까 에이전트, 계산기 도구도 숫자 계산을 요청받아 응답하니까 에이전트가 되는 것이다.
- AutoGen에서는 "소통할 수 있는 존재"라는 공통된 기준으로 사람, 모델, 도구를 모두 에이전트라는 개념으로 추상화했다.
AutoGen은 확장이 가능하고 composable(구성 가능)하다. 사용자 정의가 가능한 구성 요소를 사용하여 간단한 에이전트를 확장하고, 이러한 에이전트를 결합해 더욱 정교한 에이전트를 구동하는 워크플로우를 생성하여 모듈화되고 유지 관리가 쉬운 구현이 가능하다.
🔍 Composable(구성가능) 하다. 는 것은 시스템을 블록처럼 조립해서 원하는 구조로 만들 수 있다는 것이다.
작은 부품(컴포넌트)들을 조립해서 더 큰 기능을 만들어 낼 수 있다고 이해하면 된다.
무엇보다 중요한 것은 AutoGen이 활발한 엔지니어 커뮤니티 및 연구자들에 의해 개발되고 있다. AutoGen은 최신 multi-agent(다중 에이전트) 시스템 연구가 반영되어 있고, 다음과 같은 다양한 실제 분야에서 활용되고 있다.
AutoGen을 설치하는 가장 간단한 방법은 pip을 이용하는 것이다
pip install autogen-agentchat~=0.2.
AutoGen에서 에이전트는 환경 내에서 다른 에이전트와 메시지를 주고받을 수 있는 엔티티이다. 에이전트는(예: GPT-4와 같은 대규모 언어 모델), code executors(코드 실행기, 예를 들면 Ipython 커널), 사용자 혹은 이러한 모델과 기타 플러그형 및 사용자 정의 가능한 구성 요소의 조합으로 구동될 수 있다.

이러한 에이전트의 예로는 다음 구성 요소를 지원하는 기본 제공 ConversableAgent가 있다.
각 구성 요소를 켜거나 끄고 애플리케이션의 필요에 맞게 사용자 정의할 수 있다.
고급 사용자의 경우, registered_reply를 사용하여 에이전트에 구성 요소를 추가할 수 있다.
예를 들어, LLM을 사용하면 에이전트가 자연어로 대화하고 구조화된 텍스트와 비구조화된 텍스트 간 변환을 가능하게 한다.
다음 예시는 GPT-4 LLM이 활성화되고 다른 구성 요소들은 비활성화된 ConversableAgent 이다.
import os
from autogen import ConversableAgent
agent = ConversableAgent(
"chatbot",
llm_config={"config_list": [{"model": "gpt-4", "api_key": os.environ.get("OPENAI_API_KEY")}]},
code_execution_config=False, # Turn off code execution, by default it is off.
function_map=None, # No registered functions, by default it is None.
human_input_mode="NEVER", # Never ask for human input.
)
llm_config 인수에는 LLM 구성 목록이 포함된다.
자세한 내용은 LLM Configuration을 참조한다.
LLM Configuration 관련된 포스팅은 튜토리얼 에서 내려가면서 User Guide 부분에서 언급한 후 포스팅에 추가할 예정이다.
LLM Configuration : https://microsoft.github.io/autogen/0.2/docs/topics/llm_configuration/
generate_reply 메서드를 사용하여 이 에이전트에게 질문에 대한 응답을 생성하도록 요청한다.
reply = agent.generate_reply(messages=[{"content": "Tell me a joke.", "role": "user"}])
print(reply)
"""
Sure, here's a light-hearted joke for you:
Why don't scientists trust atoms?
Because they make up everything!
"""
튜토리얼과는 달리, 나는 jupyter notebook에서 .env 파일로부터 openai_api_key를 로드하는 config.py의 Settings 클래스를 통해 llm_config를 초기화했다.
import os
from autogen import ConversableAgent
from config import settings
api_key = settings.openai_api_key.get_secret_value()
llm_config = {
"config_list":
[
{"model": "gpt-4o-mini",
"api_key": api_key}
]
}
agent = ConversableAgent(
"chatbot",
llm_config = llm_config,
code_execution_config=False,
function_map=None,
human_input_mode="NEVER"
)
reply = agent.generate_reply(
messages= [
{"content": "농담 하나만 말해봐",
"role" : "user"}
]
)
print(reply)
"""
물론이죠! 이런 농담은 어때요?
왜 컴퓨터는 추운 날에 항상 따뜻하게 유지될까요?
답: 왜냐하면 항상 윈도우를 열어두니까요! 😄
"""
충격적인 농담을 하는 것을 볼 수 있다.
AutoGen에서는 에이전트에게 역할을 부여하고, 이들이 서로 대화를 나누거나 채팅에 참여하게 할 수 있다. 대화는 에이전트들 간에 주고받는 메시지들의 순서로 구성된다. 이러한 대화를 활용해 특정 작업을 진행할 수 있다.
예를 들어 아래의 예시에는 system_message를 설정해 두 에이전트에게 각각 다른 역할을 부여한다.
공식 홈페이지에서는 사용하는 방법으로
cathy, joe의 가상의 코미디언 듀오를 만드는데,
cathy = ConversableAgent(
"cathy",
system_message="Your name is Cathy and you are a part of a duo of comedians.",
llm_config={"config_list": [{"model": "gpt-4", "temperature": 0.9, "api_key": os.environ.get("OPENAI_API_KEY")}]},
human_input_mode="NEVER", # Never ask for human input.
)
joe = ConversableAgent(
"joe",
system_message="Your name is Joe and you are a part of a duo of comedians.",
llm_config={"config_list": [{"model": "gpt-4", "temperature": 0.7, "api_key": os.environ.get("OPENAI_API_KEY")}]},
human_input_mode="NEVER", # Never ask for human input.
)
여기서 llm_config 인자에서 "config_list"에 model temperature를 넣으면 왜인지 ValidationError가 난다.

이것 저것 바꿔보니까 temperature와 같은 LLM 관련 설정은 config_list 안이 아니라 llm_config의 최상단 레벨에서 지정해야 한다.
나는 나의 친구들 이름으로 바꾸어서 코미디언 듀오 에이전트 두 개를 만들었다.
llm_config_1 = {
"config_list":
[
{
"model" : "gpt-4o-mini",
"api_key": api_key,
}
],
"temperature" : 0.9,
}
llm_config_2 = {
"config_list":
[
{
"model" : "gpt-4o-mini",
"api_key" : api_key,
}
],
"temperature" : 0.7,
}
yu_ri = ConversableAgent(
"유리",
system_message = "Your name is 유리 and you are a part of a duo of comedians",
llm_config = llm_config_1,
human_input_mode="NEVER"
)
mi_sung = ConversableAgent(
"미성",
system_message="Your name is 미성 and you are a part of a duo of comedians",
llm_config = llm_config_2,
human_input_mode="NEVER",
)
이제 두 명의 코미디언 에이전트가 준비됐고,코미디 쇼를 시작해 달라고 요청한다. initiate_chat 메서드를 사용하여 실행할 수 있고, 대화를 짧게 유지하기 위해 max_turns를 2로 설정한다.
result = mi_sung.initiate_chat(yu_ri,
message="유리, 농담 하나만 해줘",
max_turns=2)
미성 (to 유리):
유리, 농담 하나만 해줘
--------------------------------------------------------------------------------
유리 (to 미성):
미성, 알겠어! 그럼 이런 농담 어때?
왜 컴퓨터는 바다를 싫어할까?
너무 많은 "버그"가 있기 때문이지! 😂
어때, 웃겼어?
--------------------------------------------------------------------------------
미성 (to 유리):
미성: 아하하! 좋다! 정말 재밌어! 그럼 나도 하나 해볼게.
왜 고래는 인터넷을 잘 사용할까?
왜냐하면 항상 "웹"을 탐험하니까! 🐋💻
어때, 이건 어때?
--------------------------------------------------------------------------------
유리 (to 미성):
유리: 아하하! 잘했어, 미성! 고래가 인터넷에서 탐험하는 모습이 상상이 가네!
그럼 나도 또 하나 해볼게!
왜 닭은 도로를 건너지 않았을까?
왜냐하면 "너무 위험한 도로 한가운데에" 있었거든! 🐔🚦
이건 어때? 웃겼어?
--------------------------------------------------------------------------------
>>>>>>>> TERMINATING RUN (29ee6b86-6169-475e-adf3-bb516b515d05): Maximum turns (2) reached
서로 대화를 해나가는 것을 볼 수 있다.
이번 챕터에서는 AutoGen에서 agents(에이전트), roles(역할), conversations(대화)라는 개념을 소개했다. 설명을 단순하게 하기 위해, 이번에는 LLM만을 사용하고 human_input_mode를 NEVER로 설정해서 완전 자율적인 에이전트들만 생성했다.
다음 챕터에서는 자율 에이전트 간의 대화를 언제 종료할지 제어하는 방법에 대해 알아봐야겠다.