A2A 소개¶
더 복잡한 에이전트 시스템을 구축하다 보면 단일 에이전트로는 충분하지 않은 경우가 많다는 것을 알게 될 것입니다. 문제를 해결하기 위해 협력할 수 있는 전문화된 에이전트를 만들고 싶을 것입니다. Agent2Agent(A2A) 프로토콜은 이러한 에이전트가 서로 통신할 수 있도록 하는 표준입니다.
A2A와 로컬 하위 에이전트 사용 시기¶
-
로컬 하위 에이전트: 주 에이전트와 동일한 애플리케이션 프로세스 내에서 실행되는 에이전트입니다. 코드를 논리적이고 재사용 가능한 구성 요소로 구성하는 데 사용되는 내부 모듈이나 라이브러리와 같습니다. 주 에이전트와 로컬 하위 에이전트 간의 통신은 네트워크 오버헤드 없이 메모리에서 직접 발생하므로 매우 빠릅니다.
-
원격 에이전트(A2A): 네트워크를 통해 통신하는 별도의 서비스로 실행되는 독립적인 에이전트입니다. A2A는 이 통신을 위한 표준 프로토콜을 정의합니다.
다음과 같은 경우 A2A 사용을 고려하십시오.
- 통신해야 하는 에이전트가 별도의 독립 실행형 서비스인 경우(예: 전문 금융 모델링 에이전트).
- 에이전트가 다른 팀이나 조직에서 유지 관리되는 경우.
- 다른 프로그래밍 언어 또는 에이전트 프레임워크로 작성된 에이전트를 연결해야 하는 경우.
- 시스템 구성 요소 간에 강력하고 공식적인 계약(A2A 프로토콜)을 적용하려는 경우.
A2A 사용 시기: 구체적인 예¶
- 타사 서비스와 통합: 주 에이전트가 외부 금융 데이터 공급자로부터 실시간 주가를 받아야 합니다. 이 공급자는 A2A 호환 에이전트를 통해 데이터를 노출합니다.
- 마이크로서비스 아키텍처: 주문 처리 에이전트, 재고 관리 에이전트, 배송 에이전트 등 더 작고 독립적인 서비스로 나뉜 대규모 시스템이 있습니다. A2A는 이러한 서비스가 네트워크 경계를 넘어 서로 통신하는 데 이상적입니다.
- 교차 언어 통신: 핵심 비즈니스 로직은 Python 에이전트에 있지만 에이전트로 통합하려는 Java로 작성된 레거시 시스템이나 특수 구성 요소가 있습니다. A2A는 표준화된 통신 계층을 제공합니다.
- 공식 API 적용: 여러 팀이 에이전트를 제공하는 플랫폼을 구축하고 있으며 호환성과 안정성을 보장하기 위해 이러한 에이전트가 상호 작용하는 방식에 대한 엄격한 계약이 필요합니다.
A2A를 사용하지 않는 경우: 구체적인 예(로컬 하위 에이전트 선호)¶
- 내부 코드 구성: 단일 에이전트 내의 복잡한 작업을 처리하기 전에 입력 데이터를 정리하는
DataValidator하위 에이전트와 같이 더 작고 관리하기 쉬운 함수나 모듈로 나누고 있습니다. 이러한 작업은 성능과 단순성을 위해 로컬 하위 에이전트로 처리하는 것이 가장 좋습니다. - 성능에 중요한 내부 작업: 하위 에이전트가 주 에이전트의 실행과 밀접하게 결합된 고주파, 저지연 작업을 담당하는 경우(예: 동일한 애플리케이션 내에서 데이터 스트림을 처리하는
RealTimeAnalytics하위 에이전트). - 공유 메모리/컨텍스트: 하위 에이전트가 효율성을 위해 주 에이전트의 내부 상태나 공유 메모리에 직접 액세스해야 하는 경우 A2A의 네트워크 오버헤드와 직렬화/역직렬화는 비생산적입니다.
- 간단한 도우미 함수: 독립적인 배포나 복잡한 상태 관리가 필요 없는 작고 재사용 가능한 논리의 경우 동일한 에이전트 내의 간단한 함수나 클래스가 별도의 A2A 에이전트보다 더 적합합니다.
ADK의 A2A 워크플로: 간소화된 보기¶
에이전트 개발 키트(ADK)는 A2A 프로토콜을 사용하여 에이전트를 구축하고 연결하는 프로세스를 단순화합니다. 작동 방식에 대한 간단한 설명은 다음과 같습니다.
-
에이전트 액세스 가능하게 만들기(노출): 다른 에이전트와 상호 작용할 수 있도록 하려는 기존 ADK 에이전트로 시작합니다. ADK는 이 에이전트를 "노출"하여 A2AServer로 바꾸는 간단한 방법을 제공합니다. 이 서버는 공용 인터페이스 역할을 하여 다른 에이전트가 네트워크를 통해 에이전트에 요청을 보낼 수 있도록 합니다. 에이전트용 웹 서버를 설정하는 것과 같다고 생각하면 됩니다.
-
액세스 가능한 에이전트에 연결(소비): 별도의 에이전트(동일한 시스템이나 다른 시스템에서 실행될 수 있음)에서
RemoteA2aAgent라는 특수 ADK 구성 요소를 사용합니다. 이RemoteA2aAgent는 이전에 노출한 A2AServer와 통신하는 방법을 아는 클라이언트 역할을 합니다. 백그라운드에서 네트워크 통신, 인증 및 데이터 형식 지정의 모든 복잡성을 처리합니다.
개발자 입장에서 이 연결을 설정하면 원격 에이전트와 상호 작용하는 것이 로컬 도구나 함수와 상호 작용하는 것처럼 느껴집니다. ADK는 네트워크 계층을 추상화하여 분산 에이전트 시스템을 로컬 시스템처럼 쉽게 작업할 수 있도록 합니다.
A2A 워크플로 시각화¶
A2A 워크플로를 더 명확하게 설명하기 위해 에이전트 노출 및 소비 전후와 결합된 시스템을 살펴보겠습니다.
에이전트 노출¶
노출 전: 에이전트 코드는 독립 실행형 구성 요소로 실행되지만 이 시나리오에서는 다른 원격 에이전트가 에이전트와 상호 작용할 수 있도록 노출하려고 합니다.
노출 후:
에이전트 코드는 A2AServer(ADK 구성 요소)와 통합되어 다른 원격 에이전트가 네트워크를 통해 액세스할 수 있게 됩니다.
+-----------------+
| A2A 서버 |
| (ADK 구성 요소) |<--------+
+-----------------+ |
| |
v |
+-------------------+ |
| 에이전트 코드 | |
| (이제 액세스 가능)| |
+-------------------+ |
|
| (네트워크 통신)
v
+-----------------------------+
| 원격 에이전트 |
| (이제 통신 가능) |
+-----------------------------+
에이전트 소비¶
소비 전: 이 컨텍스트에서 "루트 에이전트"라고 하는 에이전트는 원격 에이전트와 상호 작용해야 하는 개발 중인 애플리케이션입니다. 소비하기 전에는 직접적인 메커니즘이 없습니다.
+----------------------+ +-------------------------------------------------------------+
| 루트 에이전트 | | 원격 에이전트 |
| (기존 코드) | | (루트 에이전트가 통신하려는 외부 서비스) |
+----------------------+ +-------------------------------------------------------------+
소비 후:
루트 에이전트는 RemoteA2aAgent(원격 에이전트의 클라이언트 측 프록시 역할을 하는 ADK 구성 요소)를 사용하여 원격 에이전트와 통신을 설정합니다.
+----------------------+ +-----------------------------------+
| 루트 에이전트 | | RemoteA2aAgent |
| (기존 코드) |<------->| (ADK 클라이언트 프록시) |
+----------------------+ | |
| +-----------------------------+ |
| | 원격 에이전트 | |
| | (외부 서비스) | |
| +-----------------------------+ |
+-----------------------------------+
(이제 RemoteA2aAgent를 통해 원격 에이전트와 통신)
최종 시스템(결합된 보기)¶
이 다이어그램은 소비 및 노출 부분이 연결되어 완전한 A2A 시스템을 형성하는 방법을 보여줍니다.
소비 측:
+----------------------+ +-----------------------------------+
| 루트 에이전트 | | RemoteA2aAgent |
| (기존 코드) |<------->| (ADK 클라이언트 프록시) |
+----------------------+ | |
| +-----------------------------+ |
| | 원격 에이전트 | |
| | (외부 서비스) | |
| +-----------------------------+ |
+-----------------------------------+
|
| (네트워크 통신)
v
노출 측:
+-----------------+
| A2A 서버 |
| (ADK 구성 요소) |
+-----------------+
|
v
+-------------------+
| 에이전트 코드 |
| (노출된 서비스) |
+-------------------+
구체적인 사용 사례: 고객 서비스 및 제품 카탈로그 에이전트¶
별도의 제품 카탈로그 에이전트에서 제품 정보를 검색해야 하는 고객 서비스 에이전트의 실제적인 예를 살펴보겠습니다.
A2A 이전¶
처음에는 고객 서비스 에이전트가 특히 별도의 서비스이거나 다른 팀에서 관리하는 경우 제품 카탈로그 에이전트를 쿼리하는 직접적이고 표준화된 방법이 없을 수 있습니다.
+-------------------------+ +--------------------------+
| 고객 서비스 에이전트 | | 제품 카탈로그 에이전트 |
| (제품 정보 필요) | | (제품 데이터 포함) |
+-------------------------+ +--------------------------+
(직접적이고 표준화된 통신 없음)
A2A 이후¶
A2A 프로토콜을 사용하면 제품 카탈로그 에이전트가 해당 기능을 A2A 서비스로 노출할 수 있습니다. 그러면 고객 서비스 에이전트는 ADK의 RemoteA2aAgent를 사용하여 이 서비스를 쉽게 사용할 수 있습니다.
+-------------------------+ +-----------------------------------+
| 고객 서비스 에이전트 | | RemoteA2aAgent |
| (루트 에이전트) |<------->| (ADK 클라이언트 프록시) |
+-------------------------+ | |
| +-----------------------------+ |
| | 제품 카탈로그 에이전트 | |
| | (외부 서비스) | |
| +-----------------------------+ |
+-----------------------------------+
|
| (네트워크 통신)
v
+-----------------+
| A2A 서버 |
| (ADK 구성 요소) |
+-----------------+
|
v
+------------------------+
| 제품 카탈로그 에이전트 |
| (노출된 서비스) |
+------------------------+
이 설정에서는 먼저 제품 카탈로그 에이전트를 A2A 서버를 통해 노출해야 합니다. 그런 다음 고객 서비스 에이전트는 RemoteA2aAgent의 메서드를 도구인 것처럼 간단히 호출할 수 있으며 ADK는 제품 카탈로그 에이전트에 대한 모든 기본 통신을 처리합니다. 이를 통해 관심사를 명확하게 분리하고 전문화된 에이전트를 쉽게 통합할 수 있습니다.
다음 단계¶
이제 A2A의 "이유"를 이해했으므로 "방법"에 대해 자세히 알아보겠습니다.
- 다음 가이드로 계속 진행: 빠른 시작: 에이전트 노출