본문으로 건너뛰기

© 2026 Molayo

Zenn헤드라인2026. 06. 22. 09:16

A2A 에이전트 카드로 하위 에이전트를 찾아 호출해 보기

요약

A2A 프로토콜을 활용하여 라우팅 에이전트가 AgentPool에서 적절한 하위 에이전트를 검색하고 업무를 의뢰하는 메커니즘을 구현합니다. 에이전트 카드를 기반으로 검색과 메시지 전송 툴을 사용하여 에이전트 간 협업 과정을 시연합니다.

핵심 포인트

  • A2A 프로토콜 기반의 에이전트 검색 및 의뢰 메커니즘 구현
  • AgentPool을 통한 에이전트 카드 검색 및 키워드 검색 기능
  • 라우팅 에이전트가 후보 선정, 업무 배분, 결과 요약을 수행
  • .NET 10 및 Gemma-4-12b 환경에서의 구현 사례

서론

이번에는 A2A 프로토콜을 이용한 「에이전트 카드를 검색하는 툴」과 「의뢰문을 보내는 툴」을 준비하여, 에이전트가 해당 툴들을 사용하여 각 에이전트에게 의뢰할 수 있는지 확인해 보겠습니다.

이 기사에서는 다음 내용을 확인합니다.

  • 아래를 에이전트가 호출할 수 있는 툴로 정의
  • A2A 프로토콜을 이용한 에이전트를 검색하는 메커니즘 → AgentPool 준비
    • AgentPool에 A2A 대응 에이전트를 복수 등록
    • AgentPool은 등록된 에이전트의 에이전트 카드를 검색하는 기능을 제공
  • A2A 프로토콜을 이용한 에이전트에게 의뢰문을 보내는 메커니즘 준비
  • 에이전트는 해당 툴들을 사용하여 A2A 대응 에이전트를 조사하고 적절한 에이전트에게 업무를 의뢰
    • 이 의뢰를 던지는 에이전트를 **라우팅 에이전트 (Routing Agent)**로 정의
  • 라우팅 에이전트가 A2A 대응 에이전트의 답변을 모아서 요약

코드상의 「에이전트 카드를 검색하는 툴」은

search_agent_pool

「의뢰문을 보내는 툴」은 send_a2a_message

로 정의했습니다.

환경

아래 환경에서 확인했습니다.

항목버전 / 값
Target Framework.NET 10
...A2A 1.0.0-preview2 / A2A.AspNetCore 1.0.0-preview2
LM Studio modelgoogle/gemma-4-12b

에이전트 구성도

A2A 대응 에이전트 등록

기동 시 생성한 A2A 대응 에이전트를 AgentPool에 등록합니다.

A2A 대응 에이전트에 대한 의뢰

사용자 지시는 라우팅 에이전트에게만 수행합니다.

라우팅 에이전트는 AgentPool에 등록된 A2A 대응 에이전트를 검색하고 의뢰를 던집니다.

에이전트 상세

A2A 에이전트

아래와 같은 A2A 에이전트를 준비했습니다.

에이전트역할
관광 플랜 담당 에이전트아사쿠사 주변의 반나절 관광 플랜을 제안함
...

이러한 A2A 에이전트들은 각각의 에이전트 카드를 공개하고 있습니다.

AgentPool

등록한 A2A 대응 에이전트의 에이전트 카드를 검색하는 기능으로서 독자적으로 구현했습니다.

아래 기능을 제공합니다.

  • 각 A2A 호스트의 /.well-known/agent-card.json을 취득
  • 취득한 에이전트 카드로부터 검색 정보를 작성
  • 키워드 검색 기능 제공

라우팅 에이전트

후보 검색과 배분은 전용 라우팅 에이전트가 담당합니다.

이 에이전트는 아래의 툴을 가집니다.

tool역할
search_agent_poolAgentPool을 의뢰문으로 검색하여 후보 A2A 에이전트의 name, description, skill, tag를 반환
send_a2a_message지정한 name의 A2A 에이전트에게 A2A 메시지를 보내고 응답 텍스트를 반환

라우팅 에이전트의 시스템 프롬프트(System Prompt)에서는 후보 검색, 담당 선택, A2A 메시지 전송, 마지막 요약까지를 지시합니다.

private const string SystemPrompt = """
당신은 AgentPool의 라우팅 에이전트입니다.
당신 자신은 사용자의 상담 내용에 직접 답하지 않습니다.
...

A2A 메시지 포맷

이번에 A2A 에이전트에게 보낼 메시지는 아래 포맷으로 설정했습니다.

return $"""
의뢰:
{request}
...

라우팅 에이전트는 후보를 「이름」으로 지정하며, 실제 A2A 전송은 「의뢰문을 보내는 툴」 내부에서 이루어집니다.

전체 흐름은 다음과 같습니다.

실행 결과

라우팅 에이전트에게 아래와 같은 의뢰를 수행했습니다.

아이를 동반하여 도쿄역에서 아사쿠사로 갑니다. 오후에는 비 예보가 있습니다. 관광 플랜, 준비물, 교통수단, 예산 8000엔의 배분을 상담하고 싶습니다.

실행하면 라우팅 에이전트 (Routing Agent)는 「에이전트 카드 검색 툴 (search_agent_pool tool)」로 후보를 취득하고, 의뢰 내용과 관련이 있다고 판단한 담당자에게 「의뢰문 전송 툴 (send_request_tool)」로 A2A 메시지를 보냈습니다.

이번 실행에서는 4개의 여행 담당자가 모두 선택되었는데, 이는 의뢰문에 관광, 준비물, 교통, 예산 토픽이 모두 포함되어 있었기 때문입니다.

「에이전트 카드 검색 툴」로 취득한 후보는 다음 4건입니다. 라우팅 에이전트는 후보를 보고 의뢰 토픽에 맞는 담당자를 선택합니다.

[Routing Agent Tool] search_agent_pool
candidate=관광 플랜 담당 A2A 에이전트
candidate=준비물 정리 담당 A2A 에이전트
...

라우팅 에이전트와 A2A 대응 에이전트의 주고받음은 다음과 같습니다.

각 담당자의 답변은 아래 내용이 반환되었습니다.

[Dispatcher Summary]
- 관광 플랜 담당 A2A 에이전트:
관광 플랜: 아사쿠사 지역을 반나절 동안 둘러보는, 아이 동반 가족을 위한 안심 코스입니다. 우선 나카미세 거리와 센소지를 짧은 시간 동안 둘러보며, 이동 거리를 최소화하고 휴식을 취하며 진행합니다. 오후의 비 예보에 대비하여, 비가 올 경우에는 아사쿠사 문화 관광 센터 주변이나 수족관 방면 등의 실내 시설로 매끄럽게 전환이 가능합니다. 걷는 거리를 최소한으로 억제한 구성으로 되어 있어, 아이와 함께 무리 없이 즐길 수 있습니다.
...

라우팅 에이전트로부터는 아래 메시지가 최종 답변으로 반환되었습니다.

[Routing Agent Plan]
상담 내용에 기반하여, 다음과 같이 담당 에이전트에게 배분하여 답변을 취득했습니다.
- **관광 플랜**: 「관광 플랜 담당 A2A 에이전트」에게, 아이 동반 및 비 예보가 있는 경우의 아사쿠사 관광 코스를 상담했습니다.
...

요약

이번에는 에이전트 카드를 검색하여 A2A 에이전트를 호출하는 구성을 확인했습니다.

에이전트에게 에이전트 카드 검색 기능과 A2A 메시지 전송 기능을 툴 (Tool)로 부여하면, 목적에 맞는 A2A 에이전트를 찾아 업무를 의뢰할 수 있었습니다.

에이전트 카드의 컨텍스트 (Context) 조정은 필요하지만, AgentPool과 같은 메커니즘을 마련해 둔다면 유연하게 에이전트를 추가할 수 있을 것 같습니다.

소스

Program.cs

using System.Text;
using A2A;
using Microsoft.Agents.AI;
...

RoutingAgent.cs

using System.ClientModel;
using System.Text;
using A2A;
...

SubAgents.cs

using System.ClientModel;
using System.Text.RegularExpressions;
using A2A;
...

AgentPool.cs

using A2A;
using Microsoft.Agents.AI;
internal sealed class AgentPool
...

LocalA2AHost.cs

using A2A;
using A2A.AspNetCore;
internal sealed class LocalA2AHost : IAsyncDisposable
...

Discussion

AI 자동 생성 콘텐츠

본 콘텐츠는 Zenn AI의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.

원문 바로가기
0

댓글

0