LLM 에이전트를 위한 결정론적 FSM 런타임 구축 노트
Notes on building a deterministic FSM runtime for LLM agents
핵심 요약
LLM 에이전트의 추론과 실행 권한을 분리하여 결정론적 FSM 기반의 안전한 런타임을 구축한 사례.
- 추론과 실행 분리 — LLM의 제안과 실제 상태 변경을 분리하여 운영 안정성을 확보함.
- 결정론적 FSM 런타임 — nano-vm을 통해 상태 전환과 부작용을 엄격하게 제어함.
- 정책 계층 제한 — 파이썬보다 낮은 표현력을 가진 AST 서브셋을 사용하여 감사 가능성을 높임.
- 장애 시뮬레이션 — 사보타주 모드를 통해 권한 없는 도구 주입이나 해시 변조 등 다양한 공격을 테스트함.
대부분의 AI 에이전트 런타임은 현재 동일한 실행 패턴을 따릅니다:
LLM -> 도구 호출 -> 런타임이 부작용 실행
이는 읽기 전용 작업에는 꽤 잘 작동합니다. 하지만 에이전트가 외부 상태(결제, 데이터베이스, 인프라, 개인정보 등)를 변경하기 시작하면, 운영 관점에서 실행 모델을 추론하기가 어려워집니다.
내부 에이전트 중 일부를 준비하면서, 우리는 추론과 실행 권한을 완전히 분리하기로 했습니다.
우리는 nano-vm을 구축했습니다: 이는 다음과 같은 특징을 가진 결정론적 FSM 런타임입니다:
- 모델은 작업을 제안하지만,
- 런타임이 상태 전환과 부작용을 제어합니다.
런타임은 다음을 강제합니다:
- 유한 실행 그래프,
- 컴파일 타임 단계 순서 지정,
- 기능별 도구 권한 제어,
- 재실행/멱등성 경계,
- 추가 전용 감사 기록.
중요하게 작용한 설계 선택 중 하나는 정책 계층의 표현력을 의도적으로 파이썬보다 낮게 설정한 것입니다.
우리는 eval 스타일의 실행을 완전히 제거하고 정책을 작은 결정론적 AST 서브셋으로 제한했습니다:
- 단순 연산자,
- 루프 없음,
- 시스템 호출 없음.
이러한 제한은 감사 가능성을 단순화했으며, 금융 스타일의 워크플로우에서 원치 않는 여러 유형의 런타임 동작을 제거했습니다.
실패 의미론을 테스트하기 위해, 우리는 다음과 같은 여러 적대적 사례를 포함한 사보타주 모드를 추가했습니다:
- 권한 없는 도구 주입,
- 재실행 시도,
- 해시 손상,
- 건너뛴 전환.
지금까지 운영상 가장 유용한 속성은 부작용을 둘러싼 결정론적 재실행 경계였습니다.
또한 우리는 까다로운 규정 준수 문제도 해결해야 했습니다: GDPR 스타일의 삭제 요청을 지원하면서 변경 불가능한 감사 체인을 유지하는 것입니다.
우리의 현재 접근 방식은 해시 연속성과 참조 무결성을 유지하면서 볼트 참조를 툼스톤(tombstone)으로 대체합니다.
저는 다른 분들이 상태 유지 에이전트 시스템에서 실행 권한을 어떻게 처리하고 있는지 궁금합니다.
모델이 직접 부작용을 주도하게 하시나요, 아니면 중간에 결정론적 제어 계층을 삽입하시나요?
구현 내용을 보고 싶은 분들을 위해 댓글에 핵심 런타임과 MCP 계층에 대한 GitHub 링크를 남기겠습니다.

