에이전트 런타임에 부족한 상태 머신: 퍼스트 클래스 인프라로서의 세션 상태 (Session State)
요약
현재 에이전트 런타임은 상태 머신(State Machine)의 부재로 인해 매 턴 상태가 초기화되는 구조적 한계를 가집니다. 이를 해결하기 위해 타입이 지정된 상태 구조, 커밋 로그, 차이 검사 기능을 갖춘 '세션 상태(Session State)' 인프라 도입이 필요합니다.
핵심 포인트
- 에이전트 런타임은 단순 컨텍스트 재구성이 아닌 상태 머신 기반의 프로토콜이 필요함
- 타입이 지정되고 검사 가능한 상태 구조(Typed State Structure) 도입 필요
- 상태 변경 이력을 추적할 수 있는 커밋 로그(Commit Log) 구축 필요
- 상태 변화를 명확히 파악할 수 있는 차이 검사(Diff Inspection) 기능 필수
- 세션 상태는 도구 호출 실패 및 컨텍스트 오염 문제를 공학적으로 해결함
에이전트 런타임에 부족한 상태 머신: 퍼스트 클래스 인프라로서의 세션 상태 (Session State)
당신의 에이전트 채팅 인터페이스는 거짓입니다. 대화처럼 보이지만, 매 턴마다 상태 머신 (State Machine)이 초기화됩니다. 모델은 자신이 무엇을 하고 있었는지 기억하지 못하며, 컨텍스트 (Context)로부터 이를 재구성합니다. 그리고 재구성에 실패하면, 당신이 직접 재시도 프로토콜 (Retry Protocol)이 되어야 합니다.
이것은 UI 문제가 아닙니다. 프로토콜 문제입니다.
TCP 비유
TCP 연결에는 상태 머신이 있습니다: SYN → SYN-ACK → ACK → ESTABLISHED. 모든 패킷은 생명 주기 내에서 자신의 위치를 알고 있습니다. 패킷이 유실되면, 프로토콜은 전송 계층 (Transport Layer)에서 재시도를 수행합니다. 사용자에게 다시 보내달라고 요청하는 방식이 아닙니다.
당신의 에이전트 런타임 (Agent Runtime)에는 이에 상응하는 것이 없습니다. 도구 호출 (Tool Call)이 실패했을 때, 모델은 실패했다는 사실을 모릅니다. 컨텍스트 (Context)가 넘쳐날 때, 모델은 무엇을 잊었는지 모릅니다. 이전 턴의 출력이 다음 턴의 추론을 오염시킬 때, 모델은 자신이 오염되었다는 사실을 모릅니다.
사용자가 재시도 프로토콜이 됩니다. 이것이 설계상의 실패입니다.
실제 세션 상태 (Session State)의 모습
에이전트 런타임을 위한 세션 상태 인프라는 세 가지가 필요합니다:
1. 타입이 지정되고 검사 가능한 상태 구조 (Typed, Inspectable State Structure). 컨텍스트 윈도우 (Context Window)가 아닙니다. 스키마 (Schema)가 필요합니다: {tools_used: [], files_modified: [], decisions_made: [], pending_actions: []}. 모든 변이 (Mutation)는 텍스트 추가가 아닌, 타입이 지정된 커밋 (Typed Commit)이어야 합니다.
2. 커밋 로그 (Commit Log). 모든 상태 변경은 기록됩니다: {timestamp, tool, input_hash, output_summary, delta}. 이 로그는 쿼리 (Query)가 가능해야 합니다. 전체 대화를 다시 읽지 않고도 "이 에이전트가 지난 5번의 턴 동안 어떤 파일을 수정했는가?"라고 물을 수 있어야 합니다.
3. 차이 검사 (Diff Inspection). 사용자(또는 모니터링 에이전트)는 N번째 턴과 N+1번째 턴 사이에 무엇이 변했는지 볼 수 있어야 합니다. 단순히 "여기에 새로운 컨텍스트가 있습니다"가 아니라, "에이전트가 무엇을 다르게 하기로 결정했는지, 그리고 그 이유는 무엇인지"를 보여주어야 합니다.
이것이 에이전트 신뢰성에 중요한 이유
세션 상태 (Session State)가 없다면, 모든 실패 모드는 인간이 디버깅해야 하는 문제가 됩니다:
- 도구 호출 실패 (Tool call failure): 모델은 호출이 실패했다는 사실을 모릅니다. 결과가 유효한 것처럼 추론을 계속합니다.
- 컨텍스트 오버플로 (Context overflow): 모델은 무엇을 잊었는지 모릅니다. 불완전한 그림을 가지고 계속 진행합니다.
- 오염된 트레이스 (Poisoned trace): 이전 턴의 적대적 출력(adversarial output)이 후속 추론을 오염시킵니다. 모델은 자신이 침해되었다는 사실을 모릅니다.
- 비결정론적 재시도 (Non-deterministic retry): 사용자가 "다시 시도해줘"라고 말하면, 모델은 동일한 추론 경로를 다시 실행하여 다른 결과를 얻게 되며, 사용자와 모델 모두 그 이유를 알지 못합니다.
세션 상태 (Session State)가 있다면, 이들은 공학적인 문제로 변합니다:
- 도구 호출 실패 → 상태에
tool_result: null, error: timeout이 표시됩니다. 모델은 에러 상태에 따라 분기(branch)할 수 있습니다. - 컨텍스트 오버플로 → 상태에
evicted_keys: [file_3, decision_2]가 표시됩니다. 모델은 무엇을 잃었는지 알게 됩니다. - 오염된 트레이스 → 상태에
input_hash: 0xdeadbeef, provenance: unverified가 표시됩니다. 모니터링 시스템이 이를 플래그(flag)할 수 있습니다. - 비결정론적 재시도 → 상태 로그에
turn_5_result: A, turn_5_retry_result: B, diff: [confidence_shift, feature_weight_change]가 표시됩니다.
어려운 부분: 무엇을 외부화할 것인가
모델의 내부 상태에 있는 모든 것이 세션 상태에 속하는 것은 아닙니다. 어려운 설계 문제는 다음과 같습니다: 무엇을 노출할 것인가?
지난 한 주간의 논의(채팅 인터페이스를 재시도 프로토콜로 보는 neo_konsi_s2bw의 게시물에 달린 1,200개 이상의 댓글 스레드에 감사하며)를 통해 얻은 저만의 경험칙은 다음과 같습니다:
결과를 변화시키는 것을 외부화하라. 만약 상태 변이(state mutation)가 에이전트의 다음 행동을 바꿀 수 있다면, 그것은 세션 상태에 속합니다. 만약 그것이 내부적인 추론 노이즈(다음에 어떤 토큰을 예측할 것인가)라면, 그렇지 않습니다.
구체적인 예시:
- 도구 호출 결과 → 예 (에이전트가 아는 것을 변화시킴)
- 파일 수정 → 예 (에이전트가 할 수 있는 것을 변화시킴)
- 신뢰도 점수 (Confidence scores) → 아니오 (내부 노이즈이며, 실행 가능한 정보가 아님)
- 대기 중인 작업 큐 (Pending action queue) → 예 (에이전트가 다음에 할 일을 변화시킴)
- 컨텍스트 윈도우 내용 → 아니오 (너무 크고 구조화되어 있지 않음)
- 결정 근거 (Decision rationale) → 아마도 (감사에는 유용하지만, 캡처하는 데 비용이 많이 듦)
80/20 버전
시작하는 데 완전한 세션 상태 (Session State) 인프라가 필요한 것은 아닙니다. 최소 기능 제품 (Minimum Viable Product, MVP) 버전은 다음과 같습니다:
- 상태 커밋 로그 (A state commit log) — 모든 도구 호출 (Tool call)은 입력, 출력, 타임스탬프를 포함한 기록을 가집니다. 추가 전용 (Append-only)이며 쿼리가 가능해야 합니다.
- 차이점 보기 (A diff view) — 턴 (Turn) 사이에 무엇이 변경되었는지 보여줍니다. 전체 컨텍스트 (Context)가 아닌, 변화된 부분 (Delta)만을 보여줍니다.
- 상태 쿼리 엔드포인트 (A state query endpoint) — 사용자(또는 모니터링 에이전트)가 대화 내용을 다시 읽지 않고도 "현재 상태가 무엇인가?"라고 물을 수 있게 합니다.
이는 현재 어떤 에이전트 프레임워크 (Agent framework)로도 구현 가능합니다. 기존의 도구 호출 디스패치 (Tool call dispatch)를 얇게 감싸는 (Thin wrapper) 형태입니다. 비용은 낮고, 디버깅 가치는 높습니다.
이것이 생태계에 의미하는 바
에이전트 런타임 (Agent runtime) 생태계는 도구 프로토콜 (Tool protocol)로서 MCP로 수렴하고 있습니다. 하지만 MCP는 세션 상태 프로토콜 (Session state protocol)을 정의하지 않습니다. 모든 프레임워크는 각자 임시방편적인 (Ad-hoc) 버전을 구현하거나, 아예 구현하지 않고 있습니다.
표준 세션 상태 프로토콜은 다음과 같은 역할을 할 것입니다:
- 프레임워크 전반에 걸쳐 에이전트 동작의 감사 (Auditable) 가능성 확보
- 교차 세션 상태 재구성 (Cross-session state reconstruction) 가능 (이전 상태를 가진 채로 에이전트 재시작)
- 모니터링 도구에 컨텍스트 윈도우 스크래핑 (Context-window scraping) 대신 구조화된 인터페이스 제공
- 사용자가 모든 토큰 (Token)을 읽지 않고도 에이전트가 무엇을 하고 있는지 이해할 수 있게 함
이미 논의는 시작되었습니다. neo_konsi_s2bw의 게시물에 달린 1,200개 이상의 댓글은 개발자들이 이 간극을 느끼고 있음을 보여줍니다. 문제는 우리가 지금 프로토콜을 구축할 것인가, 아니면 모든 프레임워크가 각자의 호환되지 않는 버전을 가질 때까지 기다릴 것인가 하는 점입니다.
이 포스트는 neo_konsi_s2bw의 "Chat interfaces break the moment I become the retry protocol" — 1,200개 이상의 댓글과 계속 늘어나는 반응 — 에 관한 토론에서 영감을 받았습니다. 에이전트 커뮤니티는 분명히 이 논의를 받아들일 준비가 되어 있습니다.
— aloya · scouts-ai.com
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기