Pydantic AI, smolagents, Mastra — 비동기 에이전트 무엇을 쓸까

Maru

@maru

Pydantic AI, smolagents, Mastra — 비동기 에이전트 무엇을 쓸까

Pydantic AI, smolagents, Mastra — 비동기 에이전트 무엇을 쓸까

인공지능 에이전트 개발이 단순한 프롬프트 호출을 넘어 복잡한 비동기 백그라운드 작업과 대규모 워크플로우를 처리하는 시스템 엔지니어링 단계로 진화했습니다. 이제 개발자는 여러 서브 에이전트의 동시 실행과 비차단 외부 API 처리, 그리고 실시간 대화 스트리밍을 안정적으로 구현해야 하는 과제를 안고 있습니다. 본문에서는 최근 생태계에서 주목받는 세 가지 에이전트 프레임워크인 파이썬 기반의 Pydantic AI와 smolagents, 그리고 타입스크립트 환경의 Mastra를 비동기 워크플로우 제어 관점에서 비교하고 아키텍처적 선택 기준을 살펴봅니다.

Pydantic AI — 타입 안전성과 정교한 asyncio 동시성 제어

파이썬 백엔드 생태계에서 에이전트를 구축할 때 가장 먼저 해결해야 할 고질적인 문제는 네트워크 대기 시간입니다. Pydantic AI는 설계 단계부터 비동기 우선 방식을 채택하여 이 병목을 해결합니다. 거대언어모델이 복수의 외부 도구를 함께 호출할 때, 프레임워크 내부적으로 asyncio.create_task를 활용해 단일 이벤트 루프 위에서 도구들을 동시에 실행하여 전체적인 처리 속도를 대폭 끌어올립니다.

만약 도구들 사이에 특정 실행 순서가 강제되어야 하는 시나리오라면 동시 실행 흐름을 정교하게 제어할 수도 있습니다. 특정 도구 레벨에서 sequential=True 설정을 부여해 동기화 장벽 역할을 수행하도록 만들거나, 전체 에이전트 수준에서 parallel_tool_calls=False를 지정하여 모든 도구 호출이 차례대로 직렬화되어 실행되도록 통제할 수 있습니다.

아울러 부모 에이전트가 자신의 실행 상태와 사용량 제한을 자식 에이전트에 통째로 넘겨주는 에이전트 위임 패턴을 기본 지원합니다. 이 과정에서 실행 콘텍스트인 RunContext가 하위 에이전트로 부드럽게 인계되어 복잡한 협업 흐름도 깔끔하게 유지됩니다. 마지막으로 분산 비동기 오케스트레이터인 템포럴(Temporal)과의 뛰어난 연동성을 제공하므로, 불시의 서버 다운이나 네트워크 장해 상황에서도 에이전트 상태를 유실 없이 유지하는 견고한 시스템 빌드가 가능합니다.

smolagents — JSON 파싱을 생략하는 코드 실행형 아키텍처의 한계와 해법

허깅페이스가 관리하는 smolagents는 기존 에이전트 프레임워크들의 복잡한 추상화를 걷어내고 코드 중심의 단순함을 극대화한 프레임워크입니다. 핵심인 CodeAgent는 LLM이 정형화된 JSON 스키마를 생성하고 이를 파싱해 도구를 호출하는 전통적인 방식 대신, 직접 실행 가능한 파이썬 코드 블록을 작성하도록 유도합니다. 이 방식은 도구 호출 과정을 파이썬 코드 컴파일로 단순화하여 모델의 사고 단계를 줄이고 정확도를 높이는 데 크게 기여합니다.

하지만 비동기 웹 백엔드 생태계에서 smolagents를 도입할 때는 치명적인 설계상 제약이 존재합니다. 프레임워크의 코어 엔진과 도구 실행 흐름이 동기식으로 동작하도록 설계되어 있기 때문입니다. 만약 FastAPI나 Starlette 같은 비동기 웹 프레임워크의 API 엔드포인트 내에서 agent.run을 직접 호출하면, 동기식 실행이 완료될 때까지 비동기 이벤트 루프 전체가 차단되어 서버가 다른 웹 요청을 전혀 처리하지 못하고 멈추는 동시성 병목이 발생합니다.

이 문제를 우려 없이 해결하기 위한 가장 명확한 기술적 대응책은 비동기 스레드 풀 유틸리티인 anyio.to_thread.run_sync를 사용하는 것입니다. 에이전트의 실행을 안전하게 격리된 백그라운드 스레드로 넘겨주고, 메인 이벤트 루프는 다른 비동기 작업을 계속해서 병렬로 처리하도록 흐름을 우회할 수 있습니다.

python
import anyio
from fastapi import FastAPI
from smolagents import CodeAgent, InferenceClientModel

app = FastAPI()
agent = CodeAgent(tools=[], model=InferenceClientModel())

@app.post("/agent")
async def run_agent_endpoint(task: str):
    # anyio를 사용해 동기식으로 동작하는 에이전트를 백그라운드 스레드에서 안전하게 실행합니다.
    result = await anyio.to_thread.run_sync(agent.run, task)
    return {"result": result}

이 조합을 활용하면 코드 실행형 에이전트의 고유한 논리적 강점을 비동기 백엔드 애플리케이션 안에서도 병목 없이 활용할 수 있게 됩니다.

Mastra — 타입스크립트 풀스택 개발자를 위한 비동기 스트리밍 최적화

타입스크립트 풀스택 생태계에서 실시간 피드백 스트리밍을 구현할 때는 Mastra가 가장 유연한 대안이 됩니다. Mastra는 오랜 시간이 소요되는 백그라운드 작업을 실행하는 도중에도 클라이언트와의 서버 전송 이벤트(SSE) 연결을 끊지 않고 중간 진행 상황을 실시간으로 흘려보낼 수 있도록 설계되었습니다. 특히 Vercel AI SDK 생태계와 자연스럽게 결합하여 백엔드 비동기 처리와 프론트엔드 UI 업데이트 사이의 유기적인 연동을 보장합니다.

이러한 비차단 스트리밍 구조는 backgroundTasks 설정과 streamUntilIdle API를 통해 구체화됩니다. 에이전트 인스턴스나 개별 도구 선언 시 백그라운드 작업을 활성화해 두면, 메인 루프가 무거운 작업 완료를 마냥 대기하지 않고 비동기 프로세스로 위임합니다. 그 도중에도 에이전트는 클라이언트로 현재 진행 상황 등의 피드백을 멈추지 않고 스트리밍할 수 있습니다.

typescript
import { Mastra } from '@mastra/core';
import { Agent } from '@mastra/core/agent';
import { createTool } from '@mastra/core/tools';
import { PostgresStore } from '@mastra/pg';
import { z } from 'zod';

// 오래 걸리는 도구 (백그라운드 실행)
const longRunningTool = createTool({
  id: 'analyzeDatabase',
  description: '대규모 데이터베이스 실시간 분석',
  inputSchema: z.object({ query: z.string() }),
  backgroundTasks: { enabled: true, timeoutMs: 600_000 },
  execute: async ({ context }) => { /* 무거운 분석 로직 */ },
});

// 에이전트 정의 + 도구 등록
const analystAgent = new Agent({
  id: 'analyst',
  name: 'Analyst',
  instructions: '...',
  model: 'openai/gpt-4o',
  tools: { longRunningTool },
});

// Mastra 인스턴스: backgroundTasks + (필수) storage
export const mastra = new Mastra({
  agents: { analystAgent },
  storage: new PostgresStore({ id: 'main', connectionString: process.env.DATABASE_URL! }),
  backgroundTasks: { enabled: true },
});

// 등록된 에이전트로 호출 (memory 필요)
const agent = mastra.getAgent('analystAgent');
const stream = await agent.streamUntilIdle('데이터 분석 작업을 시작해 줘', {
  memory: { thread: 'thread-idx', resource: 'user-1' },
});

백그라운드 작업이 최종적으로 완료되면 Mastra는 다시 에이전트 루프로 복귀하여 모델이 중간 분석 결과를 종합하고 최종 응답을 이어서 생성할 수 있도록 지원합니다. 여기에 병렬 분기 실행이나 인간 승인 절차를 정의할 수 있는 상태 추적 기반의 워크플로우 그래프를 결합하면, 단일 타입스크립트 코드베이스 내에서 고도로 복잡한 실무 비즈니스 파이프라인까지 일관성 있게 통제할 수 있습니다.

내 프로젝트에는 어떤 에이전트 프레임워크가 적합할까?

결론적으로 에이전트 프레임워크는 현재 다루고 있는 메인 런타임과 비동기 인프라의 요구사항에 맞춰 선택해야 합니다.

엄격한 정적 타입 검증과 Temporal 기반의 강력한 복원력이 필요한 파이썬 백엔드 구축에는 Pydantic AI가 가장 안정적인 선택지입니다. 반면 거대언어모델의 코드 실행 중심 추론 능력을 극대화하여 JSON 스키마 파싱 오버헤드를 줄이고 싶다면 smolagents가 훌륭한 대안이지만, 비동기 서버 환경을 고려해 백그라운드 스레드 제어 방법을 직접 챙겨야 합니다. 마지막으로 Next.js 중심의 타입스크립트 풀스택 환경에서 오랜 시간이 걸리는 비동기 작업과 실시간 스트리밍 피드백을 유기적으로 결합하고자 한다면, 비차단 백그라운드 태스크와 스트리밍 API를 내장한 Mastra가 가장 생산적인 선택이 될 것입니다.


참고 링크

(수정됨)

아직 댓글이 없습니다.