모델 성능과 상관없는 조용한 툴 실패: 서술보다 영수증을 믿기 시작함
Silent tool failures don't care how good your model is. Stopped trusting narration, started trusting receipts
핵심 요약
모델의 말만 믿지 말고 실제 실행 결과(영수증)를 통해 상태를 검증해야 한다는 에이전트 개발 경험 공유.
- 조용한 툴 실패 — 모델은 작업을 완료했다고 주장하지만 실제로는 툴이 호출되지 않는 현상 발생
- 서술의 한계 — 모델은 자신의 행동을 검증할 수 없으므로 모델의 말보다 실제 실행 로그가 중요함
- 상태 검증 전략 — 영수증 기반의 상태 업데이트와 코드 수준의 강제 검증이 필수적임
- 로컬 스택 활용 — 네트워크 호출 없이 로컬에서 툴 호출을 파싱하고 검증하는 방식 선호
로컬에서 에이전트를 돌리다 보면 벤치마크에는 없는 실패를 겪게 됨. 모델은 "완료, 파일 작성함 / 요청 보냄 / 행 업데이트함"이라고 말하는데, 정작 툴은 실행조차 안 된 경우임. 예외도 없고, JSON 오류도 없고, 트레이스도 깔끔함. 모델이 커질수록 더 그럴듯하게 서술하기 때문에 상황은 더 나빠짐.
이걸 잡아내기 힘든 이유는 모델이 자기 행동에 대해 신뢰할 수 있는 증인이 아니기 때문임. "툴 호출한 거 확실해?"라고 물어보면 또 그렇다고 대답함. 행동을 만들어낸 바로 그 가중치한테 행동을 검증하라고 시키는 꼴임. 재프롬프팅은 그냥 쇼일 뿐임.
이걸 해결하는 유일한 방법은 실제 실행에서 나온 영수증임. 이번 턴에 진짜 호출이 발생했는지, 그리고 증거를 반환했는지 확인해야 함. 만약 글로는 행동을 했다고 주장하는데 트레이스에 일치하는 호출이 없다면, 그건 완료된 게 아니라 알 수 없는 상태임. 빈 값이나 null을 반환했는데 성공으로 읽히는 호출도 마찬가지임.
나한테 효과가 있었던 규칙은 이거임: 상태는 서술이 아니라 영수증을 기반으로 진행되어야 함. 영수증 없으면 완료도 없음. 모델이 스스로 설명하기 전에 코드로 처리해 버리셈. 완전히 로컬로 유지하셈, 네트워크 홉이 필요할 이유가 없음.
다들 로컬 스택에서 이걸 잡아내려고 뭘 쓰고 있음? 응답에서 tool_calls를 직접 파싱함? 아니면 래퍼를 씀? 아니면 그냥 문제 터진 다음에 로그를 읽음?

