티스토리 뷰

openai swarm

 

Swarm Note Github
https://github.com/lee-lou2/swarm

 

안녕하세요! 오늘은 OpenAI의 Swarm을 사용하여 기본적인 멀티 에이전트 오케스트레이션을 설정하는 방법을 소개합니다. Swarm은 여러 에이전트가 서로의 역할을 바꿔가며 작업을 수행하도록 돕는 가벼운 프레임워크입니다. 이번 포스팅에서는 Swarm의 기본적인 사용법과 함께, 몇 가지 간단한 예시를 통해 각 기능을 자세히 살펴보겠습니다.

 

Swarm 설치 및 기본 설정

Swarm을 설치하려면 Python 3.10 이상이 필요합니다. 설치는 아래 명령어를 통해 진행할 수 있습니다:

pip install git+https://github.com/openai/swarm.git

설치가 완료되면 SwarmAgent 클래스를 사용해 간단한 에이전트 기반 시스템을 구성할 수 있습니다.

 

기본 사용 예시

예시 1: 에이전트 간의 대화 이관 (Agent Handoff)

설명:
이 예시는 Swarm의 에이전트 이관 기능을 보여줍니다. english_agent는 영어로만 대화할 수 있는 에이전트이고, spanish_agent는 스페인어로만 대화할 수 있습니다. 만약 사용자가 스페인어로 말을 걸면, english_agent는 대화를 spanish_agent로 넘깁니다. 이처럼, 각 언어에 맞는 에이전트로 이관하는 방법을 통해 사용자 경험을 향상시킬 수 있습니다.

코드:

from swarm import Swarm, Agent

client = Swarm()

english_agent = Agent(
    name="English Agent",
    instructions="You only speak English.",
)

spanish_agent = Agent(
    name="Spanish Agent",
    instructions="You only speak Spanish.",
)

def transfer_to_spanish_agent():
    """Transfer Spanish-speaking users immediately."""
    return spanish_agent

english_agent.functions.append(transfer_to_spanish_agent)

messages = [{"role": "user", "content": "Hola. ¿Como estás?"}]
response = client.run(agent=english_agent, messages=messages)

print(response.messages[-1]["content"])

상세 설명:

  1. english_agentspanish_agent를 각각 생성합니다. 이들은 각기 다른 언어로만 응답할 수 있도록 설정되어 있습니다.
  2. transfer_to_spanish_agent 함수는 사용자가 스페인어로 대화할 경우, 대화를 spanish_agent로 넘깁니다.
  3. messages에는 사용자가 스페인어로 "Hola. ¿Como estás?"라고 말한 메시지가 담겨 있습니다.
  4. client.run()이 실행되면 english_agent는 스페인어 메시지를 감지하고, 이를 spanish_agent로 이관하여 스페인어로 응답하게 합니다.

 

예시 2: 최소한의 에이전트 설정 (Bare Minimum)

설명:
이 예시는 Swarm에서 에이전트를 설정하고, 가장 간단한 형태의 사용자-에이전트 대화를 수행하는 방법을 보여줍니다. 에이전트는 사용자의 인사에 대한 기본 응답을 제공합니다. 이 예제는 Swarm을 처음 사용하는 사용자에게 적합합니다.

코드:

from swarm import Swarm, Agent

client = Swarm()

agent = Agent(
    name="Agent",
    instructions="You are a helpful agent.",
)

messages = [{"role": "user", "content": "Hi!"}]
response = client.run(agent=agent, messages=messages)

print(response.messages[-1]["content"])

상세 설명:

  1. agent라는 이름의 에이전트를 생성하고, "You are a helpful agent."라는 지시 사항을 부여합니다.
  2. 사용자가 "Hi!"라고 인사하면, 에이전트는 client.run()을 통해 이 메시지를 처리하고 응답을 생성합니다.
  3. response.messages[-1]["content"]를 통해 에이전트의 응답을 출력할 수 있습니다.

 

예시 3: 컨텍스트 변수 사용 (Context Variables)

설명:
Swarm의 강력한 기능 중 하나는 컨텍스트 변수를 사용해 에이전트의 응답을 사용자 맞춤형으로 만드는 것입니다. 이 예시에서는 사용자의 이름과 ID를 참조하여 에이전트가 사용자에게 개인화된 인사와 계정 정보를 제공합니다.

코드:

from swarm import Swarm, Agent

client = Swarm()

def instructions(context_variables):
    name = context_variables.get("name", "User")
    return f"You are a helpful agent. Greet the user by name ({name})."

def print_account_details(context_variables: dict):
    user_id = context_variables.get("user_id", None)
    name = context_variables.get("name", None)
    print(f"Account Details: {name} {user_id}")
    return "Success"

agent = Agent(
    name="Agent",
    instructions=instructions,
    functions=[print_account_details],
)

context_variables = {"name": "James", "user_id": 123}

response = client.run(
    messages=[{"role": "user", "content": "Hi!"}],
    agent=agent,
    context_variables=context_variables,
)
print(response.messages[-1]["content"])

response = client.run(
    messages=[{"role": "user", "content": "Print my account details!"}],
    agent=agent,
    context_variables=context_variables,
)
print(response.messages[-1]["content"])

상세 설명:

  1. instructions 함수는 context_variables에서 사용자의 이름을 받아 사용자 맞춤형 인사말을 생성합니다.
  2. print_account_details 함수는 사용자의 이름과 ID를 출력하는 기능을 합니다.
  3. context_variables에 사용자 정보가 담겨 있고, 이를 에이전트가 사용하여 인사말과 계정 정보를 제공합니다.

 

예시 4: 함수 호출 (Function Calling)

설명:
Swarm의 에이전트는 Python 함수를 호출하여 특정 작업을 수행할 수 있습니다. 이 예시는 사용자가 특정 위치의 날씨 정보를 요청할 때, 에이전트가 get_weather 함수를 호출하여 해당 정보를 반환하는 방법을 보여줍니다.

코드:

from swarm import Swarm, Agent

client = Swarm()

def get_weather(location) -> str:
    return "{'temp':67, 'unit':'F'}"

agent = Agent(
    name="Agent",
    instructions="You are a helpful agent.",
    functions=[get_weather],
)

messages = [{"role": "user", "content": "What's the weather in NYC?"}]

response = client.run(agent=agent, messages=messages)
print(response.messages[-1]["content"])

상세 설명:

  1. get_weather 함수는 특정 위치의 날씨 정보를 문자열로 반환합니다.
  2. agent는 이 함수를 호출할 수 있도록 설정되어 있으며, 사용자가 날씨를 물어보면 해당 정보를 반환합니다.
  3. 이 예시는 에이전트가 외부 함수 호출을 통해 데이터를 제공하는 방법을 보여줍니다.

 

예시 5: 반복 인터랙션 루프 (Simple Loop without Helpers)

설명:
이 예시는 사용자가 에이전트와 지속적으로 대화할 수 있는 루프 구조를 설정합니다. 사용자가 메시지를 입력하면, 에이전트는 응답을 생성하고 이를 출력합니다. 이 방법은 Swarm을 통해 실시간 대화를 구현하는 데 유용합니다.

코드:

from swarm import Swarm, Agent

client = Swarm()

my_agent = Agent(
    name="Agent",
    instructions="You are a helpful agent.",
)

def pretty_print_messages(messages):
    for message in messages:
        if message["content"] is None:
            continue
        print(f"{message['sender']}: {message['content']}")

messages = []
agent = my_agent
while True:
    user_input = input("> ")
    messages.append({"role": "user", "content": user_input})

    response = client.run(agent=agent, messages=messages)
    messages = response.messages
    agent = response.agent
    pretty_print_messages(messages)

상세 설명:

  1. 사용자가 입력한 메시지를 messages 리스트에 추가하고, 이를 client.run()에 전달합니다.
  2. 에이전트의 응답은 response.messages에 저장되며, 이를 pretty_print_messages 함수를 통해 출력합니다.
  3. 이 구조는 사용자가 입력할 때마다 에이전트가 실시간으로 응답하도록 설정되어 있어 인터랙티브한 환경을 제공합니다.

 

예제 실행 방법

위의 예제를 실행하려면 다음 명령어를 사용하면 됩니다:

python3 <example_name>.py

이 명령어를 사용하면 해당 예시 파일이 실행되며, Swarm의 기본 기능을 체험할 수 있습니다.

 

마무리

Swarm은 다수의 에이전트를 이용해 복잡한 대화 흐름을 쉽게 관리할 수 있도록 도와주는 강력한 도구입니다. 이 포스팅에서 소개한 기본적인 예제를 통해 Swarm의 구조와 사용법을 이해하는 데 도움이 되었기를 바랍니다. 앞으로 다양한 시나리오에서 Swarm을 활용해보세요!