상태 관리

상태 관리 (State Management)

AG-UI에서 에이전트와 프론트엔드 간 상태 동기화를 이해하는 방법을 설명드릴게요.

출처: 문서

본문

상태 관리는 AG-UI 프로토콜의 핵심 기능으로, 에이전트와 프론트엔드 애플리케이션 간 실시간 동기화를 가능하게 해요. 상태를 공유하고 갱신하는 효율적인 메커니즘을 제공함으로써, AG-UI는 AI 에이전트와 인간 사용자가 매끄럽게 함께 작업하는 협업 경험의 기반을 만듭니다.

공유 상태 아키텍처 (Shared State Architecture)

AG-UI에서 상태는 다음과 같은 구조화된 데이터 객체입니다:

  1. 에이전트와의 상호작용 전반에 걸쳐 유지
  2. 에이전트와 프론트엔드 양쪽에서 접근 가능
  3. 상호작용이 진행됨에 따라 실시간으로 갱신
  4. 양쪽의 의사 결정을 위한 컨텍스트 제공

이 공유 상태 아키텍처는 양방향 통신 채널을 만들어요:

  • 에이전트는 애플리케이션의 현재 상태에 접근해 정보에 기반한 결정을 내릴 수 있음
  • 프론트엔드는 에이전트의 내부 상태 변화를 관찰하고 반응할 수 있음
  • 양쪽 모두 상태를 수정할 수 있어 협업 워크플로를 만듦

상태 동기화 메서드 (State Synchronization Methods)

AG-UI는 상태 동기화를 위한 두 가지 상호 보완 메서드를 제공합니다:

상태 스냅샷 (State Snapshots)

STATE_SNAPSHOT 이벤트는 에이전트의 현재 상태 완전체 표현을 전달해요:

interface StateSnapshotEvent {
  type: EventType.STATE_SNAPSHOT
  snapshot: any // Complete state object
}

스냅샷은 일반적으로 다음에 사용돼요:

  • 상호작용 시작 시 초기 상태를 설정
  • 연결 중단 후 동기화 보장
  • 완전한 새로고침이 필요한 큰 상태 변화 발생 시
  • 향후 델타 업데이트를 위한 새 기준선(baseline) 설정

프론트엔드는 STATE_SNAPSHOT 이벤트를 받으면 기존 상태 모델을 스냅샷 내용으로 완전히 대체해야 해요.

상태 델타 (State Deltas)

STATE_DELTA 이벤트는 JSON Patch 형식(RFC 6902)으로 상태에 대한 증분 업데이트를 전달해요:

interface StateDeltaEvent {
  type: EventType.STATE_DELTA
  delta: JsonPatchOperation[] // Array of JSON Patch operations
}

델타는 전체 상태가 아닌 변경된 것만 보내므로 대역폭 효율적이에요. 이 접근 방식은 특히 다음과 같은 경우에 유용합니다:

  • 스트리밍 상호작용 중 빈번한 작은 업데이트
  • 대부분의 속성이 변하지 않는 큰 상태 객체
  • 전체 스냅샷으로 보내기엔 비효율적인 고빈도 업데이트

JSON Patch 형식 (JSON Patch Format)

AG-UI는 상태 델타에 JSON Patch 형식(RFC 6902)을 사용하며, 이는 JSON 문서의 변경 사항을 표현하는 표준화된 방법을 정의합니다:

interface JsonPatchOperation {
  op: "add" | "remove" | "replace" | "move" | "copy" | "test"
  path: string // JSON Pointer (RFC 6901) to the target location
  value?: any // The value to apply (for add, replace)
  from?: string // Source path (for move, copy)
}

일반적인 연산에는 다음이 있어요:

  1. add: 객체나 배열에 값 추가

    { "op": "add", "path": "/user/preferences", "value": { "theme": "dark" } }
    
  2. replace: 값 교체

    { "op": "replace", "path": "/conversation_state", "value": "paused" }
    
  3. remove: 값 제거

    { "op": "remove", "path": "/temporary_data" }
    
  4. move: 값을 한 위치에서 다른 위치로 이동

    { "op": "move", "path": "/completed_items", "from": "/pending_items/0" }
    

프론트엔드는 정확한 상태 표현을 유지하기 위해 이 패치들을 순서대로 적용해야 해요. 패치 적용 후 불일치가 감지되면 프론트엔드는 새 STATE_SNAPSHOT을 요청할 수 있어요.

AG-UI에서의 상태 처리 (State Processing in AG-UI)

AG-UI 구현에서 상태 델타는 fast-json-patch 라이브러리를 사용해 적용됩니다:

case EventType.STATE_DELTA: {
  const { delta } = event as StateDeltaEvent;

  try {
    // Apply the JSON Patch operations to the current state without mutating the original
    const result = applyPatch(state, delta, true, false);
    state = result.newDocument;
    return emitUpdate({ state });
  } catch (error: unknown) {
    console.warn(
      `Failed to apply state patch:\n` +
      `Current state: ${JSON.stringify(state, null, 2)}\n` +
      `Patch operations: ${JSON.stringify(delta, null, 2)}\n` +
      `Error: ${errorMessage}`
    );
    return emitNoUpdate();
  }
}

이 구현은 다음을 보장합니다:

  • 패치는 원자적으로 적용됨(전부 또는 전무)
  • 적용 과정에서 원래 상태는 변경되지 않음
  • 오류는 포착되어 우아하게 처리됨

인간-개입 협업 (Human-in-the-Loop Collaboration)

공유 상태 시스템은 AG-UI의 인간-개입 워크플로의 기초입니다. 다음을 가능하게 해요:

  1. 실시간 가시성: 사용자가 에이전트의 사고 과정과 현재 상태를 관찰
  2. 컨텍스트 인지: 에이전트가 사용자 행동, 선호도, 애플리케이션 상태에 접근
  3. 협업적 의사 결정: 인간과 AI가 진화하는 상태에 모두 기여
  4. 피드백 루프: 인간이 상태 속성을 수정해 에이전트를 교정하거나 안내

예를 들어, 에이전트가 제안된 행동으로 상태를 업데이트할 수 있어요:

{
  "proposal": {
    "action": "send_email",
    "recipient": "[email protected]",
    "content": "Draft email content..."
  }
}

프론트엔드는 이 제안을 사용자에게 표시할 수 있고, 사용자는 실행 전에 승인·거부·수정할 수 있어요.

CopilotKit 구현 (CopilotKit Implementation)

AI 어시스턴트 구축을 위한 인기 프레임워크인 CopilotKit은 "shared state" 기능을 통해 AG-UI의 상태 관리 시스템을 활용해요. 이 구현은 에이전트(특히 LangGraph 에이전트)와 프론트엔드 애플리케이션 간 양방향 상태 동기화를 가능하게 합니다.

CopilotKit의 공유 상태 시스템은 다음을 통해 구현됩니다:

// In the frontend React application
const { state: agentState, setState: setAgentState } = useCoAgent({
  name: "agent",
  initialState: { someProperty: "initialValue" },
})

이 훅은 에이전트의 상태에 대한 실시간 연결을 만들어 다음을 가능하게 해요:

  1. 프론트엔드에서 에이전트의 현재 상태 읽기
  2. 프론트엔드에서 에이전트 상태 업데이트
  3. 에이전트 상태에 기반한 UI 컴포넌트 렌더링

백엔드에서 LangGraph 에이전트는 다음을 사용해 상태 업데이트를 발행할 수 있어요:

# In the LangGraph agent
async def tool_node(self, state: ResearchState, config: RunnableConfig):
    # Update state with new information
    tool_state = {
        "title": new_state.get("title", ""),
        "outline": new_state.get("outline", {}),
        "sections": new_state.get("sections", []),
        # Other state properties...
    }

    # Emit updated state to frontend
    await copilotkit_emit_state(config, tool_state)

    return tool_state

이 상태 업데이트는 AG-UI의 상태 스냅샷과 델타 메커니즘을 사용해 전송되어 에이전트와 프론트엔드 사이에 매끄러운 공유 컨텍스트를 만듭니다.

모범 사례 (Best Practices)

AG-UI에서 상태 관리를 구현할 때:

  1. 스냅샷을 신중히 사용: 전체 스냅샷은 기준선을 세울 필요가 있을 때만 보내기.
  2. 증분 변경에는 델타 선호: 작은 상태 업데이트는 데이터 전송을 최소화하기 위해 델타 사용.
  3. 상태를 신중히 구조화: 부분 업데이트를 지원하고 패치 복잡성을 최소화하도록 상태 객체 설계.
  4. 상태 충돌 처리: 에이전트와 프론트엔드의 충돌 업데이트를 해결하는 전략 구현.
  5. 오류 복구 포함: 불일치 감지 시 상태를 재동기화하는 메커니즘 제공.
  6. 보안 고려: 공유 상태에 민감한 정보를 저장하지 않기.

결론 (Conclusion)

AG-UI의 상태 관리 시스템은 인간과 AI 에이전트가 함께 작업하는 협업 애플리케이션 구축을 위한 강력한 기반을 제공해요. 스냅샷과 JSON Patch 델타를 통해 프론트엔드와 백엔드 간 상태를 효율적으로 동기화함으로써, AG-UI는 인간 직관과 AI 기능의 장점을 결합한 정교한 인간-개입 워크플로를 가능하게 합니다.

CopilotKit 같은 프레임워크의 구현은 이 공유 상태 접근 방식이 완전 자율 시스템이나 전통적인 사용자 인터페이스보다 더 효과적인 협업 경험을 만들 수 있음을 보여줍니다.

더 알아보기 (Learn more)

  • Interrupts — 인간-개입 일시중지·재개
  • Capabilities — 상태 관련 기능 선언 STATE_SNAPSHOT/STATE_DELTA