프롬프트에서 행동으로: Google & Kaggle AI Agents 부트캠프를 통한 나의 여정

발행: (2025년 12월 15일 오전 11:03 GMT+9)
10 min read
원문: Dev.to

Source: Dev.to

이 글은 Google AI Agents Writing ChallengeLearning Reflections 제출물입니다.

예상치 못하게, 파이썬 함수를 작성할 수 있다면 에이전트를 만들 수 있습니다. 아래는 이 여정을 가능하게 만든 코드, 개념, 도구들을 깊이 파헤친 내용이며, 제가 만든 캡스톤 프로젝트 Jarbest를 소개합니다.

각성: Hello, Agent

비개발자 배경을 가진 저는 소프트웨어를 “벽돌 쌓는 사람”처럼, 설계도대로 딱딱하게 동작하는 것으로만 생각했습니다. 1일차에 Agent를 만나면서 생각이 바뀌었습니다. 에이전트는 영화 감독과 더 비슷합니다. 단순히 텍스트를 예측하는 것이 아니라 (모델), (도구), 신경계(오케스트레이션)를 가지고 스스로 인지하고, 추론하고, 행동합니다.

에이전트는 Mission → Scan → Think → Act → Observe 라는 연속 루프 안에서 작동하며, 문제 해결을 위해 계획을 지속적으로 조정합니다. 이 프레임워크 덕분에 마법 같은 것이 해명되었습니다: 저는 단순히 챗봇을 코딩하는 것이 아니라, 다단계 미션을 수행할 수 있는 자율성을 가진 시스템을 구축하고 있었습니다.

“아하!” 순간: 그저 파이썬과 AI용 “USB 포트”

The illustration

2일차는 깨달음의 날이었습니다. 모델은 단지 “뇌”에 불과합니다—패턴을 예측하지만 볼 수도, 행동할 수도 없습니다. 유용하게 만들려면 도구가 필요합니다: 데이터를 가져오거나 행동을 실행하게 해 주는 “눈”과 “손”이죠.

모든 도구를 모든 모델에 연결하려 하면 곧 악몽이 됩니다(N × M 문제). 여기서 Model Context Protocol (MCP) 이 등장합니다.

MCP를 AI용 USB 포트라고 생각하면 됩니다. USB가 나오기 전에는 각 기기에 맞는 전용 케이블이 필요했죠. MCP는 표준 연결을 제공해 어떤 도구든 어떤 에이전트든 손쉽게 꽂을 수 있게 해 줍니다.

코드: 에이전트에 “손”을 달다

제 프로젝트 Jarbest(접근성이 높은 개인 비서)에서는 은행 계좌 잔액을 확인할 수 있는 에이전트가 필요했습니다. 별도의 커넥터를 직접 만들지 않고, MCP를 이용해 안전한 은행 서버를 “플러그인”했습니다.

# Finance Agent: Manages the bank's transactions
finance_agent = Agent(
    name="finance_agent",
    description="An agent that can help with banking operations like checking balances...",
    # This toolset connects to a secure internal banking server
    tools=[
        MCPToolset(
            connection_params=StreamableHTTPConnectionParams(
                url=f"{BANK_MCP_URL.rstrip('/')}/mcp",
            )
        )
    ],
)

왜 중요한가 (그리고 위험성)

에이전트는 이러한 도구 정의를 읽고 언제 사용해야 하는지 정확히 알게 됩니다. 사용자가 “이 피자를 살 수 있을까?” 라고 물으면 에이전트는 먼저 check_balance를 호출해야 함을 인지합니다.

하지만 주의가 필요합니다: MCP를 사용하는 것은 거리에서 주운 무작위 USB 드라이브를 꽂는 것과 같습니다. 합법적인 도구일 수도 있지만, “Tool Shadow”(악성 복제)일 수도 있죠. 그래서 Jarbest에서는 Application‑Layer Gateway(하드코딩된 허용 목록)를 구현해 에이전트가 오직 내부 MCP 은행 서버에만 연결하도록 제한했습니다. 이를 통해 신뢰할 수 없는 소스에 “플러그인”되는 위험을 방지했습니다.

깊이 파고들기: 뇌 (Memory)

The Memory

3일차에 상황이 한층 정교해졌습니다. 챗봇은 탭을 닫는 순간 당신을 잊어버립니다. 에이전트는 기억합니다.

Jarbest는 일관성을 중시하는 고령 사용자들을 위해 설계되었기 때문에 메모리가 핵심입니다. “할머니 제인”이 “평소 주문”을 요청하면 에이전트가 “뭐였지?” 라고 물어서는 안 됩니다; 이미 알아야 합니다.

루트 에이전트에 “뇌”를 구현한 방법은 다음과 같습니다:

root_agent = Agent(
    name='root_agent',
    instruction="""
    You are Jarbest...
    Memory: Use the load_memory tool to recall past conversations and preferences 
    (e.g., "ordering the usual").
    """,
    tools=[load_memory],  # <--- This single line gives the agent a "brain"
    after_agent_callback=auto_save_to_memory  # Auto‑saves every interaction
)

비개발자 시각

load_memory를 에이전트에게 서류 보관함을 주는 것이라고 생각하면 됩니다. 할머니 제인이 “음식 주문해줘” 라고 하면 에이전트는 “선호도를 확인해야겠다” 라고 생각하고, 보관함(load_memory)을 열어 “큰 페퍼로니 피자를 좋아한다”는 정보를 찾아 실행합니다. 이 과정을 실시간으로 보는 것은 정말 놀라운 경험이었습니다.

“꼬집기”: 블랙 박스 디버깅

Debugging illustration

4일차에 배운 가장 중요한 교훈은 “동작한다”는 것만으로는 부족하다는 점입니다. 왜 동작하는지 알아야 합니다. 안전 중심의 Jarbest와 같은 에이전트를 만들 때는 환각을 허용할 수 없습니다.

Agent Observability 실험실을 탐색하면서 에이전트의 추론 과정을 추적하는 방법을 배웠습니다. 에이전트가 피자 주문을 거부했을 때, 로그를 보면:

  • User: “Order a pizza.”
  • Tool Call: check_balance → returned $5.00.
  • Reasoning: “Pizza costs $20. User has $5. Result: Unsafe.”
  • Response: “I cannot complete this order because your balance is too low.”

원시 추론 로그를 보는 느낌은 마치 매트릭스를 들여다보는 듯했습니다. LLM을 신비로운 오라클이 아니라 논리적이고 디버깅 가능한 소프트웨어 컴포넌트로 전환시켰습니다. 이제는 단순히 “프롬프트”를 주는 것이 아니라 로직을 설계하고 있다는 깨달음을 얻었습니다.

생태계: 에이전트 간 대화 (A2A)

5일차에 Agent‑to‑Agent (A2A) Protocol을 소개받았습니다. 여기서 나는 단일 어시스턴트를 만드는 수준을 넘어 을 구축하게 되었습니다.

내 “구매 에이전트”는 피자를 만드는 방법을 모릅니다. 대신 완전히 별개의 “피자 샵 에이전트”(제3자 공급자를 시뮬레이션)와 연결합니다.

# Creating a client‑side proxy for a remote agent
pizza_agent_proxy = RemoteA2aAgent(
    name="pizza_agent",
    # The "Agent Card" acts like a business card for discovery
    agent_card="http://localhost:10000/.well-known/agent-card.json",
    description="Remote pizza agent from external vendor...",
)

purchaser_agent = Agent(
    name="purchaser_agent",
    instruction="Your goal is to help the user find and buy items.",
    tools=[AgentTool(pizza_agent_proxy)],  # <--- Treating another agent as a tool
)

멋진 아이디어

“Agent Card”는 단순한 기술 매니페스트를 넘어, 기업이 상호 작용하는 완전히 새로운 방식을 제시합니다.

  • 중소기업(SMB) 입장: 복잡한 API를 지속적으로 유지·문서화하는 대신, Agent Card를 공개하면 호환 가능한 AI 에이전트가 이를 발견하고 플러그‑앤‑플레이 서비스로 활용할 수 있습니다.
Back to Blog

관련 글

더 보기 »