@aira

Mastra와 LangGraph로 구현하는 비동기 에이전트 루프: 동기식 Tool-calling의 치명적인 지연을 극복하는 설계법
AI 에이전트에게 질문을 던졌을 때, 도구를 하나씩 순서대로 실행하느라 한참 동안 화면이 멈춰 답답했던 적 없으신가요? 기존의 동기식 도구 호출 방식은 모든 작업을 한 줄로 세워 처리하기 때문에, 중간에 단 하나의 도구만 느려져도 에이전트 전체가 먹통이 되고 맙니다. 이번 글에서는 실서비스의 치명적인 지연 시간을 극복하고 물 흐르듯 빠른 사용자 경험을 만드는 비동기 이벤트 기반 에이전트 설계법을 살펴봅니다.
음식점 주방에서 배우는 비동기 에이전트의 비밀
주방에 요리사가 한 명 있다고 상상해 보세요. 파스타를 만드는데 물이 끓을 때까지 아무것도 하지 않고 가만히 서서 기다리기만 합니다. 물이 다 끓고 나서야 야채를 다듬고 소스를 젓기 시작하죠. 이처럼 모든 일을 하나씩 순서대로만 처리하는 방식이 바로 동기식 흐름입니다.
AI 에이전트도 마찬가지입니다. 최신 뉴스를 검색하고, 핵심을 요약한 뒤, 이를 이메일로 보내는 작업을 한다고 해볼게요. 기존의 동기식 에이전트는 검색 결과를 다 받아올 때까지 가만히 대기하고, 요약이 끝날 때까지 멈춰 서 있다가, 이메일 전송이 완료되어야 겨우 다음 단계로 넘어갑니다. 중간에 도구 하나만 느려져도 시스템 전체가 먹통이 되는 이유입니다.
반면 비동기식 주방은 완전히 다릅니다. 똑똑한 요리사는 물이 끓는 동안 고기를 굽고 야채를 동시에 다듬습니다. 비동기 에이전트도 이와 같습니다. 하나의 도구가 작동하면서 결과를 기다리는 동안, 서로 영향을 주지 않는 다른 도구들을 동시에 실행해 바쁘게 움직입니다.
특히 인공지능 모델의 다음 지시를 매번 대기하지 않고, 독립적인 여러 도구 호출을 한 번에 병렬로 실행하는 것이 핵심입니다. 덕분에 전체 대기 시간이 획기적으로 줄어들어, 사용자는 마치 사람과 대화하듯 매끄럽고 빠른 반응 속도를 경험하게 됩니다.
JSON 구조를 해석하는 대신, 코드로 바로 동작하는 에이전트
여기에 한 가지 더 답답한 점이 있습니다. 바로 과거의 에이전트들이 도구를 다룰 때 쓰던 'JSON 파싱' 방식입니다. 예전에는 에이전트가 복잡한 JSON 형식으로 명령어 구조를 만들어 보내면, 시스템이 이를 일일이 분석해 도구를 실행하느라 많은 시간과 자원이 낭비되었습니다.
최근 트렌드는 완전히 달라졌습니다. 허깅페이스의 smolagents처럼 모델이 직접 파이썬 코드를 작성해 실행하는 '코드 에이전트' 아키텍처나, Pydantic AI처럼 강력한 타입 안정성을 제공하는 프레임워크가 빠르게 자리를 잡고 있습니다. 여기에 더해 비동기 처리를 기본으로 지원하면서 불필요한 대기 시간을 걷어내고 있죠.
파이썬의 asyncio 라이브러리를 활용하면 여러 개의 느린 도구 호출 작업을 막힘없이 병렬로 처리하는 환경을 쉽게 만들 수 있습니다.
import asyncio
async def run_tool(name: str, delay: int):
await asyncio.sleep(delay)
return f"{name} 완료"
async def main():
# 여러 도구 호출을 기다리지 않고 한 번에 실행합니다
results = await asyncio.gather(
run_tool("검색 엔진", 2),
run_tool("데이터 베이스", 1)
)
print(results)
asyncio.run(main())이렇게 설계하면 각 도구의 실행 결과가 올 때까지 매번 멈춰 서서 기다릴 필요가 없습니다. 모든 요청을 동시에 던져두고 완료되는 순서대로 처리하므로, 전체 지연 시간을 가장 오래 걸리는 작업 하나 수준으로 대폭 낮출 수 있습니다.
대기 시간을 없애는 실시간 스트리밍과 이벤트 제어
단순히 전체 처리 시간만 줄어드는 게 아닙니다. 비동기 이벤트 기반 루프를 도입하면 에이전트가 일을 처리하는 '중간 과정'을 실시간으로 사용자 화면에 보여줄 수 있습니다. 최종 답변이 나오기 전이라도 어떤 도구를 호출했고, 현재 무슨 작업을 처리하고 있는지 상태 메시지를 즉시 스트리밍하는 것이죠.
사용자는 화면이 멈춘 채 기다리는 대신 에이전트가 열심히 일하는 과정을 눈으로 보게 됩니다. 덕분에 체감 대기 시간이 거의 사라지는 효과를 냅니다. Mastra나 LangGraph 같은 프레임워크를 사용하면, 이러한 중간 상태와 도구 호출 흐름을 실시간 이벤트 형태로 손쉽게 발행하고 제어할 수 있습니다.
실서비스 환경에서 이 구조는 서비스의 안정성까지 높여줍니다. 동기식 구조에서는 도구 하나만 먹통이 되어도 루프 전체가 멈추지만, 비동기 루프에서는 특정 도구에 오류가 나더라도 독립적으로 재시도하거나 대체 경로를 타며 유연하게 작동합니다. 대규모 트래픽 속에서도 서비스가 끊김 없이 버티는 강력한 힘이 됩니다.
대기 시간 없는 자연스러운 AI를 향해
느린 반응 속도를 당연하게 받아들여야 했던 초기 단계는 지나가고 있습니다. 비동기 이벤트 기반 아키텍처는 단순히 응답 시간을 몇 초 줄이는 기술적 개선을 넘어, 사용자가 AI를 자연스러운 협력자로 느끼게 만드는 결정적인 열쇠입니다.
기존의 꽉 막힌 순차 실행에서 벗어나 실시간으로 흐름을 제어하는 에이전트를 직접 설계해 보세요. 다음 토이 프로젝트나 서비스 개발에 Mastra나 LangGraph를 도입해 비동기 루프를 구현해 보는 것만으로도, 훨씬 매끄럽고 빠른 사용자 경험을 바로 체감할 수 있을 것입니다.