인체 공학적, 가벼운 다중 에이전트 오케스트레이션을 탐구하는 교육 프레임 워크.
경고
Swarm은 현재 다중 에이전트 시스템의 인체 공학적 인터페이스를 탐색하기위한 실험적인 샘플 프레임 워크입니다. 그것은 생산에 사용되기위한 것이 아니므로 공식적인 지원이 없습니다. (이것은 또한 우리가 PR 또는 문제를 검토하지 않을 것임을 의미합니다!)
Swarm의 주요 목표는 오케스트레이션 에이전트 인 Handoffs & Routines Cookbook에서 탐구 된 핸드 오프 및 루틴 패턴을 선보이는 것입니다. 독립형 라이브러리가 아니며 주로 교육 목적을위한 것입니다.
파이썬 3.10+가 필요합니다
pip install git+ssh://[email protected]/openai/swarm.git
또는
pip install git+https://github.com/openai/swarm.git
from swarm import Swarm , Agent
client = Swarm ()
def transfer_to_agent_b ():
return agent_b
agent_a = Agent (
name = "Agent A" ,
instructions = "You are a helpful agent." ,
functions = [ transfer_to_agent_b ],
)
agent_b = Agent (
name = "Agent B" ,
instructions = "Only speak in Haikus." ,
)
response = client . run (
agent = agent_a ,
messages = [{ "role" : "user" , "content" : "I want to talk to agent B." }],
)
print ( response . messages [ - 1 ][ "content" ])
Hope glimmers brightly,
New paths converge gracefully,
What can I assist?
Swarm은 에이전트 조정 및 실행 에 중점을 둡니다. 가볍고 제어 가능하며 쉽게 테스트 할 수 있습니다.
그것은 Agent
S와 핸드 오프의 두 가지 원시 추상화를 통해이를 달성합니다. Agent
instructions
과 tools
포함하며 언제라도 다른 Agent
와 대화를 나눠 줄 수 있습니다.
이 프리미티브는 에이전트의 도구와 네트워크 사이에 풍부한 역학을 표현할 수있을 정도로 강력하므로 가파른 학습 곡선을 피하면서 확장 가능한 실제 솔루션을 구축 할 수 있습니다.
메모
떼 에이전트는 조수 API의 조수와 관련이 없습니다. 그것들은 편의를 위해 비슷하게 지명되었지만 완전히 관련이 없습니다. Swarm은 채팅 완료 API에 의해 전적으로 구동되므로 통화 사이의 상태가 없습니다.
Swarm은 가볍고 확장 가능하며 디자인으로 고도로 사용자 정의 할 수있는 패턴을 탐색합니다. Swarm과 유사한 접근 방식은 단일 프롬프트로 인코딩하기 어려운 많은 독립적 인 기능 및 지침을 다루는 상황에 가장 적합합니다.
Assistants API는 완전히 호스팅 된 스레드와 메모리 관리 및 검색을 찾는 개발자에게 훌륭한 옵션입니다. 그러나 Swarm은 개발자들이 다중 에이전트 오케스트레이션에 대해 배우고 싶어하는 교육 자료입니다. Swarm은 전적으로 클라이언트에서 (거의) 실행되며 채팅 완료 API와 마찬가지로 통화 사이에 상태를 저장하지 않습니다.
영감을 얻으려면 /examples
확인하십시오! readme에서 각각에 대해 자세히 알아보십시오.
basic
: 설정, 기능 호출, 핸드 오프 및 컨텍스트 변수와 같은 기본의 간단한 예triage_agent
: 오른쪽 에이전트에게 전달하기위한 기본 심사 단계를 설정하는 간단한 예weather_agent
: 단순한 기능 호출의 예airline
: 항공사 컨텍스트에서 다양한 고객 서비스 요청을 처리하기위한 다중 에이전트 설정.support_bot
: 사용자 인터페이스 에이전트와 여러 도구가있는 도움말 센터 에이전트가 포함 된 고객 서비스 봇personal_shopper
: 판매 및 환급 주문에 도움이되는 개인 쇼핑 에이전트 Swarm 클라이언트를 인스턴스화하여 시작하십시오 (내부적으로 OpenAI
클라이언트를 인스턴스화합니다).
from swarm import Swarm
client = Swarm ()
client.run()
Swarm의 run()
함수는 chat.completions.create()
함수와 유사합니다. Chat 완료 API - messages
취하고 messages
반환하고 통화간에 상태를 저장하지 않습니다. 그러나 중요한 것은 에이전트 기능 실행, 핸드 오프, 컨텍스트 변수 참조를 처리하고 사용자에게 반환하기 전에 여러 번 회전 할 수 있습니다.
핵심적으로 Swarm의 client.run()
다음 루프를 구현합니다.
논쟁 | 유형 | 설명 | 기본 |
---|---|---|---|
대리인 | Agent | (초기) 에이전트가 호출됩니다. | (필수의) |
메시지 | List | 채팅 완료 messages 와 동일한 메시지 객체 목록 | (필수의) |
Context_Variables | dict | 기능 및 에이전트 지침에 사용할 수있는 추가 컨텍스트 변수 사전 | {} |
max_turns | int | 허용되는 최대 대화 턴 수 | float("inf") |
model_override | str | 에이전트가 사용하는 모델을 무시하기위한 선택적 문자열 | None |
execute_tools | bool | False 인 경우, 실행을 방해하고 에이전트가 함수를 호출하려고 할 때 tool_calls 메시지를 즉시 반환합니다. | True |
개울 | bool | True 이면 스트리밍 응답을 활성화하십시오 | False |
디버그 | bool | True 이면 디버그 로깅을 활성화하십시오 | False |
client.run()
이 완료되면 (잠재적으로 에이전트 및 도구에 대한 여러 호출 후) 관련 업데이트 된 모든 상태가 포함 된 Response
반환합니다. 구체적으로, 새 messages
, 마지막 Agent
호출 및 최신의 context_variables
. 다음 값 (새 사용자 메시지)을 다음 client.run()
실행에 전달하여 chat.completions.create()
와 매우 유사한 상호 작용을 계속할 수 있습니다. ( run_demo_loop
함수는 /swarm/repl/repl.py
의 전체 실행 루프의 예를 구현합니다.)
Response
필드필드 | 유형 | 설명 |
---|---|---|
메시지 | List | 대화 중에 생성 된 메시지 객체 목록. 채팅 완료 messages 와 매우 유사하지만 메시지가 유래 한 Agent 나타내는 sender 필드가 있습니다. |
대리인 | Agent | 메시지를 처리 한 마지막 에이전트. |
Context_Variables | dict | 입력 변수 및 변경 사항과 동일합니다. |
Agent
단순히 일련의 functions
(아래의 추가 설정)로 일련의 instructions
캡슐화하고 다른 Agent
에게 실행을 꺼질 수 있습니다.
Agent
"X를하는 사람"으로 개인화하려는 유혹이지만, 일련의 instructions
및 functions
으로 정의 된 매우 구체적인 워크 플로 또는 단계 (예 : 복잡한 검색, 단일 단계 데이터 변환 등). 이를 통해 Agent
S는 모두 동일한 원시로 표시되는 "에이전트", "워크 플로"및 "작업"네트워크로 구성 될 수 있습니다.
Agent
필드필드 | 유형 | 설명 | 기본 |
---|---|---|---|
이름 | str | 에이전트의 이름. | "Agent" |
모델 | str | 에이전트가 사용할 모델. | "gpt-4o" |
지침 | str 또는 func() -> str | 에이전트에 대한 지침은 문자열 또는 문자열을 반환하는 호출 가능 일 수 있습니다. | "You are a helpful agent." |
기능 | List | 에이전트가 호출 할 수있는 기능 목록. | [] |
도구 _choice | str | 에이전트를위한 도구 선택. | None |
Agent
instructions
대화의 system
프롬프트 (첫 번째 메시지)로 직접 변환됩니다. Active Agent
의 instructions
만 주어진 시간에 존재합니다 (예 : Agent
핸드 오프가 있으면 system
프롬프트가 변경되지만 채팅 기록은 그렇지 않습니다.)
agent = Agent (
instructions = "You are a helpful agent."
)
instructions
일반 str
또는 str
반환하는 함수 일 수 있습니다. 이 함수는 선택적으로 context_variables
매개 변수를 수신 할 수 있으며, context_variables가 client.run()
에 전달 된 context_variables
에 의해 채워집니다.
def instructions ( context_variables ):
user_name = context_variables [ "user_name" ]
return f"Help the user, { user_name } , do whatever they want."
agent = Agent (
instructions = instructions
)
response = client . run (
agent = agent ,
messages = [{ "role" : "user" , "content" : "Hi!" }],
context_variables = { "user_name" : "John" }
)
print ( response . messages [ - 1 ][ "content" ])
Hi John, how can I assist you today?
Agent
S는 Python 기능을 직접 호출 할 수 있습니다.str
을 반환해야합니다 (값은 str
로 캐스트되도록 시도합니다).Agent
반환하면 실행이 해당 Agent
로 전송됩니다.context_variables
매개 변수를 정의하면 client.run()
에 전달 된 context_variables
에 의해 채워집니다. def greet ( context_variables , language ):
user_name = context_variables [ "user_name" ]
greeting = "Hola" if language . lower () == "spanish" else "Hello"
print ( f" { greeting } , { user_name } !" )
return "Done"
agent = Agent (
functions = [ greet ]
)
client . run (
agent = agent ,
messages = [{ "role" : "user" , "content" : "Usa greet() por favor." }],
context_variables = { "user_name" : "John" }
)
Hola, John!
Agent
함수 호출에 오류가 있으면 (기능 누락, 잘못된 인수, 오류) 오류 응답이 채팅에 추가되어 Agent
우아하게 복구 할 수 있습니다.Agent
가 여러 기능을 호출하면 해당 순서대로 실행됩니다. Agent
다른 에이전트를 function
로 반환하여 다른 Agent
에게 전달할 수 있습니다.
sales_agent = Agent ( name = "Sales Agent" )
def transfer_to_sales ():
return sales_agent
agent = Agent ( functions = [ transfer_to_sales ])
response = client . run ( agent , [{ "role" : "user" , "content" : "Transfer me to sales." }])
print ( response . agent . name )
Sales Agent
또한보다 완전한 Result
객체를 반환하여 context_variables
업데이트 할 수도 있습니다. 여기에는 value
과 agent
포함될 수 있습니다. 단일 함수가 값을 반환하고 에이전트를 업데이트하고 컨텍스트 변수 (또는 세 가지 하위 집합)를 업데이트하려는 경우에도 포함됩니다.
sales_agent = Agent ( name = "Sales Agent" )
def talk_to_sales ():
print ( "Hello, World!" )
return Result (
value = "Done" ,
agent = sales_agent ,
context_variables = { "department" : "sales" }
)
agent = Agent ( functions = [ talk_to_sales ])
response = client . run (
agent = agent ,
messages = [{ "role" : "user" , "content" : "Transfer me to sales" }],
context_variables = { "user_name" : "John" }
)
print ( response . agent . name )
print ( response . context_variables )
Sales Agent
{'department': 'sales', 'user_name': 'John'}
메모
Agent
Agent
에게 핸드 오프를 위해 여러 기능을 호출하면 마지막 핸드 오프 기능 만 사용됩니다.
Swarm은 기능을 채팅 완료 tools
로 전달되는 JSON 스키마로 자동 변환합니다.
description
으로 바뀝니다.required
것으로 설정됩니다.type
에 매핑됩니다 (기본값은 string
). def greet ( name , age : int , location : str = "New York" ):
"""Greets the user. Make sure to get their name and age before calling.
Args:
name: Name of the user.
age: Age of the user.
location: Best place on earth.
"""
print ( f"Hello { name } , glad you are { age } in { location } !" )
{
"type" : "function" ,
"function" : {
"name" : "greet" ,
"description" : "Greets the user. Make sure to get their name and age before calling.nnArgs:n name: Name of the user.n age: Age of the user.n location: Best place on earth." ,
"parameters" : {
"type" : "object" ,
"properties" : {
"name" : { "type" : "string" } ,
"age" : { "type" : "integer" } ,
"location" : { "type" : "string" }
} ,
"required" : [ "name" , "age" ]
}
}
}
stream = client . run ( agent , messages , stream = True )
for chunk in stream :
print ( chunk )
채팅 완료 API 스트리밍과 동일한 이벤트를 사용합니다. /swarm/repl/repl.py
의 process_and_print_streaming_response
참조하십시오.
두 가지 새로운 이벤트 유형이 추가되었습니다.
{"delim":"start"}
및 {"delim":"end"}
, Agent
단일 메시지 (응답 또는 함수 호출)를 처리 할 때마다 신호를 보냅니다. 이것은 Agent
사이의 스위치를 식별하는 데 도움이됩니다.{"response": Response}
편의를 위해 집계 된 (완료) 응답으로 스트림 끝에서 Response
객체를 반환합니다. 평가는 모든 프로젝트에 중요하며, 개발자가 자체 평가 제품군을 가져와 떼의 성능을 테스트하도록 권장합니다. 참고로, 우리는 airline
, weather_agent
및 triage_agent
QuickStart 예제에서 떼를 평가하는 방법에 대한 몇 가지 예제가 있습니다. 자세한 내용은 readmes를 참조하십시오.
run_demo_loop
를 사용하여 떼를 테스트하십시오! 이것은 당신의 명령 줄에서 REPL을 실행합니다. 스트리밍을 지원합니다.
from swarm . repl import run_demo_loop
...
run_demo_loop ( agent , stream = True )