LangGraph 에이전트가 무한 루프에 빠졌을 때 복구해주는 가드 노드 'Sotis'를 만들었습니다
I built a LangGraph guard node that catches agents mid-spiral and rolls back the damage
핵심 요약
에이전트의 무한 루프와 상태 오염을 실시간으로 감지하고 이전 체크포인트로 롤백해주는 LangGraph용 가드 노드입니다.
- 무한 루프 방지 — 섀넌 엔트로피와 루프 감지 알고리즘으로 에이전트 폭주를 실시간 차단함
- 상태 롤백 기능 — 오류 발생 시 마지막 정상 체크포인트로 복구하고 메시지 기록을 정리함
- 간편한 통합 — LangGraph의 툴 노드 뒤에 Sotis 노드를 추가하여 쉽게 적용 가능함
- 설정 최적화 필요 — 기본 엔트로피 임계값에 대한 사용자 피드백을 적극적으로 구함
LangGraph 에이전트로 길고 복잡한 다단계 작업을 구축해 보셨다면, 에이전트가 붕괴하는 모습을 한 번쯤 보셨을 겁니다. 똑같은 툴 호출을 반복하고, 오류 추적 정보로 상태를 가득 채우고, 같은 파일을 계속 건드리다가 결국 실행이 멈출 때까지 폭주하며 토큰만 낭비하는 상황 말이죠.
저는 이런 상황을 막기 위해 Sotis를 만들었습니다. Sotis는 툴 노드 뒤에 연결하는 가드 노드(SotisLangGraphGuard)로, 그래프 내부에 삽입됩니다. 이 노드는 툴 호출 스트림을 실시간으로 감시하다가, 슬라이딩 윈도우 섀넌 엔트로피와 루프 감지(정확/의미론적)를 통해 폭주를 감지하면 그래프 내부에서 개입합니다. 작업 공간 파일을 마지막 정상 체크포인트로 롤백하고, 비대해진 메시지 기록을 정리(RemoveMessage)하며, 요약된 재개 정보를 주입하여 에이전트가 헛짓을 멈추고 검증된 진행 상황부터 다시 시작하도록 경로를 변경합니다.
연결 방법은 기본적으로 다음과 같습니다:
tools노드 뒤에sotis노드를 추가합니다.- 조건부 엣지 설정: 리셋이 주입되었다면 요약된 컨텍스트와 함께 에이전트로 다시 라우팅하고, 그렇지 않으면 정상적으로 계속 진행합니다.
이 도구는 별도의 학습이 필요 없으며, 솔직한 주의 사항을 말씀드리자면: 실패 범위를 제한할 뿐 성공을 보장하지는 않습니다. 제가 실제 실행해 본 결과, 폭주를 확실하게 잡아내고 피해를 롤백했지만, 성능이 낮은 모델이 마법처럼 작업을 완수하게 해주지는 않습니다. 즉, 무한정 실패하는 대신 깔끔하고 복구 가능한 실패를 얻게 되는 것입니다. 기본 엔트로피 임계값(1.5비트)은 짧은 시간 내에 여러 툴을 정당하게 사용하는 에이전트에서 오탐을 발생시킬 수 있습니다. 이는 설정 가능한 값인데, 1.5가 적절한 기본값인지 확신이 서지 않아 여러분의 의견을 듣고 싶습니다.
40초짜리 데모 GIF(대시보드에서 Llama-3.3-70B 에이전트가 3번 차단되는 모습)와 원본 트랜스크립트를 저장소에서 확인하실 수 있습니다. arXiv:2603.29231을 기반으로 했으며, MIT 라이선스, 127개의 테스트가 포함되어 있습니다.
pip install sotis
LangGraph 에이전트를 운영 중인 분들, 특히 가드 노드 통합과 관련하여 피드백을 주시면 정말 큰 도움이 될 것 같습니다.


