AI 에이전트를 위한 PRG 패턴

AI 에이전트가 오래된 문제에 직면하고 있습니다. 이는 90년대 웹 폼을 망가뜨렸던 것과 동일한 버그입니다.

과거 웹 시절에는 사용자가 폼을 제출했습니다. 만약 새로고침을 누르면 브라우저는 데이터를 다시 제출했습니다. 이는 두 번의 주문, 두 번의 결제, 또는 두 번의 이메일 발송을 의미했습니다.

해결책은 Post/Redirect/Get (PRG) 패턴이었습니다.

로직은 간단합니다:

  • 사용자가 POST 요청을 보냅니다.
  • 서버가 작업을 처리합니다.
  • 서버가 새로운 URL로 302 Redirect를 보냅니다.
  • 브라우저가 GET 요청으로 리다이렉트를 따릅니다.

이제 새로고침을 해도 결과 페이지를 다시 불러올 뿐, 동작을 반복하지 않습니다.

AI 에이전트가 이 버그를 새로운 계층으로 다시 불러왔습니다.

에이전트가 카드를 결제하거나 레코드를 생성하기 위해 도구를 호출할 때 문제가 발생합니다. 네트워크 연결이 끊기거나, 컨테이너가 재시작되거나, 속도 제한(rate limit)이 걸릴 수 있습니다. 에이전트는 마지막 호출이 성공했는지 알 수 없습니다. 그래서 재시도(retry)를 합니다.

해결책이 없다면, 에이전트는 중복 주문을 생성하고 화가 난 고객을 만들게 됩니다.

멱등성 키(idempotency keys)를 사용하여 에이전트 파이프라인에 PRG 패턴을 적용해야 합니다.

멱등성 키는 여러분의 리다이렉트 역할을 합니다. 이는 동작과 결과를 분리합니다.

구현 방법:

  • 모든 상태 변경(mutating) 도구는 멱등성 키를 받아야 합니다.
  • 첫 번째 시도 전에 키를 생성하십시오.
  • 키는 타임스탬프가 아닌 사용자 의도(intent)로부터 도출하십시오.
  • 서버는 이전에 해당 키를 본 적이 있는지 확인해야 합니다.
  • 키가 이미 존재한다면, 작업을 다시 실행하는 대신 저장된 결과를 반환해야 합니다.

긴 작업의 경우, 키만으로는 부족합니다. 체크포인팅(checkpointing)이 필요합니다.

체크포인팅은 매 단계마다 상태를 저장합니다. 에이전트가 20분짜리 작업을 수행하던 중 중단되더라도, 멈춘 지점부터 다시 시작할 수 있습니다. 처음부터 다시 시작하지 않습니다.

단 한 가지만 할 수 있다면, 모든 도구 호출이 두 번 실행되어도 안전하게 만드십시오.

다음 다섯 가지 확인 사항을 바탕으로 에이전트를 구축하십시오:

  • 모든 도구가 멱등성 키를 허용합니까?
  • 키가 시간이 아닌 의도에 기반합니까?
  • 모든 재시도 시 키가 재사용됩니까?
  • 서버가 중복된 키에 대해 저장된 결과를 반환합니까?
  • 긴 작업을 위해 중간 단계가 저장됩니까?

패턴은 동일합니다. 계층만 바뀌었을 뿐입니다.

출처: https://dev.to/ravikiran438/the-prg-pattern-for-ai-agents-a-25-year-old-fix-coming-of-age-in-a-new-era-23fh