멀티에이전트 시스템 설계 Designing Multi-Agent Systems
Chapter 06 · 구현

다중 에이전트 워크플로우 구축하기

명시적 제어 흐름을 갖춘 결정론적 계산 그래프 — 워크플로우는 실행 흐름을 완벽히 통제하면서도 타입 안전성과 스트리밍 관측 가능성으로 정교함을 발휘한다.

계산 그래프 타입 안전 단계 조건부 엣지 DAG 러너 체크포인팅 무상태 확장

Section 1계산 그래프로서의 워크플로우

워크플로우는 본질적으로 계산 그래프다 — 단계(노드)와 엣지(연결)를 담는 컨테이너. n8n이나 Flowise 같은 드래그 앤 드롭 AI 툴의 내부가 바로 이렇게 만들어진다.

이 그래프 기반 접근은 강력한 역량을 가능케 한다.

  • 검증 — 런타임 이전에 실행 경로를 확인한다.
  • 시각화 — 시스템 동작에 대한 명료한 표현.
  • 결정론적 실행 — 예측 가능한 결과.
  • 병렬 처리 — 의존성이 허용하는 한 동시 실행.
  • 조건부 로직 — 단계 출력이나 공유 상태에 기반한 동적 라우팅.
Listing 6.2 · 플루언트 체이닝으로 워크플로우 조합·실행
# 단계들을 워크플로우로 조합
workflow = (Workflow(metadata=WorkflowMetadata(name="Math Pipeline"))
            .chain(double_step, add_ten_step))

# 스트리밍 관측 가능성과 함께 실행
runner = WorkflowRunner()
async for event in runner.run_stream(workflow, {"value": 3}):
    print(event)   # 3 → 6 → 16
에이전트 노드

단계는 어떤 계산이든 담을 수 있다 — 수학 연산, 데이터 변환, API 호출, 그리고 4장에서 정의한 에이전트 자체. 이 장 후반의 AgentStep 클래스가 에이전트를 워크플로우 단계로 캡슐화한다. 위 예제에는 AI 모델도 에이전트도 없다 — 순수 결정론적 계산이다. 이것이 핵심을 드러낸다 — 워크플로우는 실행 흐름에 대한 저수준 제어를 제공한다.

Section 2단계 — 계산의 단위

단계는 워크플로우의 근본 빌딩 블록 — 입력 데이터를 출력 데이터로 변환하는 단일 계산 단위다. 모든 단계는 공통 베이스 BaseStep으로부터 확장된다.

Listing 6.1 · 타입 안전 단계 함수
class NumberInput(BaseModel):
    value: int

class NumberOutput(BaseModel):
    result: int

async def double_number(input_data: NumberInput,
                        context: Context) -> NumberOutput:
    return NumberOutput(result=input_data.value * 2)

double_step = FunctionStep(
    step_id="double",
    input_type=NumberInput,
    output_type=NumberOutput,
    func=double_number)

Pydantic 모델이 단계 사이를 흐르는 데이터의 계약을 정의한다. 워크플로우는 실행 전에 double_stepNumberOutputadd_ten_step의 입력 타입과 일치하는지 검증한다. BaseStep은 인프라 관심사(실행 생애 주기·상태 추적·오류 처리)를, FunctionStep 같은 구체적 구현은 도메인 로직을 다룬다.

Section 3엣지 — 전환으로 단계 연결하기

엣지는 단계 간 제어 흐름·조건을 정의한다. 세 가지 패턴을 다룬다 — 순차, 조건부, 병렬.

Motion · DAG 러너의 의존성 해결 STEP 01 / 6
팬-인 — 모든 의존성 완료를 기다린다
  • 조건부 엣지 — 출력 기반 조건은 검증·품질 관리 패턴을, 상태 기반 조건은 구성 주도 동작과 동적 적응을 가능케 한다.
  • 병렬 실행 패턴 — DAG 러너는 자동 팬-인 감지를 사용한다. 동일 단계로 향하는 여러 엣지가 "always" 조건을 가질 때, 러너는 모든 의존성이 완료될 때까지 기다린다.
Motion · 조건부 엣지 — 검증 분기와 재시도 루프 STEP 01 / 5
출력 기반 조건이 경로를 결정한다

Section 4워크플로우 러너

WorkflowRunner는 정교한 의존성 해결을 구현한다 — 팬인(모든 입력을 기다림)과 조건부(유효한 경로 중 어느 하나를 기다림) 로직. 자원 한계 내 동시 단계 실행, 교착 상태 탐지, 우아한 오류 복구를 처리하면서 디버깅·모니터링을 위한 스트리밍 관측 가능성을 제공한다.

표 · 워크플로우가 자동으로 처리하는 것
기능설명
타입 안전 데이터 흐름각 단계의 출력은 다음 단계의 입력이 되기 전 검증된다
스트리밍 관측 가능성실시간 이벤트가 실행 중 무엇이 일어나는지 보여준다
오류 처리내장 재시도 로직, 타임아웃 처리, 우아한 장애 복구
의존성 해결팬인·조건부 로직, 교착 상태 탐지

Section 5직렬화와 체크포인팅

워크플로우는 공유·버전 관리·UI 통합을 위해 JSON으로의 완전한 직렬화를 지원한다. 자동 체크포인팅은 실패 이후 실행 재개를 가능케 하며, 구조 해시 검증이 안전한 재개를 보장한다.

무상태 수평 확장

체크포인트 저장소 추상화 위에서, 어떤 워커든 공유 저장소로부터 어떤 워크플로우든 재개할 수 있다. 이것이 무상태 수평 확장(stateless horizontal scaling)을 떠받친다 — 워커 자체에 상태를 묶어 두지 않으므로 자유롭게 추가·교체할 수 있다.

언제 워크플로우를 선택하나

해법으로 가는 길이 이미 알려져 있을 때, 예측 가능성이 중요할 때, 의존성을 명시적으로 조율해야 할 때, 단계 단위 관측 가능성이 요구될 때. 데이터 처리 파이프라인, 승인 워크플로우, 감사 흔적과 결정론적 실행이 본질적으로 요구되는 시나리오에서 빛을 발한다. 7장은 AI 모델이 조율 결정을 쥐는 자율 패턴으로 — 예측 가능성을 내어주고 적응성을 얻는 거래로 — 이어진다.

멀티에이전트 시스템 설계 제6장 · 다중 에이전트 워크플로우 구축하기