Agenvoy - 도구 ask_user의 비동기 (Asynchronous) 설계
요약
Agenvoy가 기존의 블로킹 방식에서 벗어나 ask_user 도구의 비동기 설계를 도입했습니다. 상태를 메모리에서 디스크로 저장하여 사용자의 답변을 기다리는 동안 프로세스를 중단하고, 답변 시 컨텍스트를 복구하여 작업을 재개할 수 있습니다.
핵심 포인트
- ask_user 도구의 비동기 설계로 사용자 대기 시간 문제 해결
- 상태(State)를 디스크에 저장하여 장기적인 자율성 확보
- 목표, 완료 사항, 다음 단계를 기록하여 컨텍스트 유지
- 사용자 답변 시 상태 기록을 기반으로 프로세스 재개
Agenvoy - AI가 실제로 당신을 위해 작동하게 만드세요 — 당신만의 개인 AI 어시스턴트.
v0.25.13 (이전) 버전에서 Agent가 사용자에게 질문을 던지는 방식은 사용자의 답변을 기다렸다가 다음 단계를 진행하는 블로킹 (Blocking) 설계였습니다.
대량의 작업이 쌓일 가능성을 해결하기 위해 10분의 타임아웃 (Timeout)을 추가했지만, 대부분의 경우 문제가 없더라도 사용자가 메시지를 계속 주시해야만 하는 상황으로 제한되었습니다. 그렇지 않으면 작업을 다시 실행해야 할 수도 있기 때문입니다.
이러한 사용 시나리오에서는 always-allow 외에는 누군가가 계속 모니터링해야 하므로, 장기적으로 자율적으로 작동하는 Agent라는 목표를 달성할 수 없습니다.
Claude 웹 버전에서 영감을 받아, 질문을 던진 후 질문 내용과 답변을 함께 Agent에게 전달하여 다음 실행 루프를 돌리도록 구현했습니다.
따라서 기존의 Pending 설계에 목표, 실행 완료 사항, 다음 단계에 대한 완전한 기록을 추가했습니다. ask_user 호출 전에 이를 먼저 기록하고 현재 실행 루프를 종료한 뒤, 사용자가 답변하면 프로세스를 다시 트리거하도록 했습니다.
이러한 설계는 사용자의 주의력을 진정으로 해방시켜 줍니다. 답변을 잊어버려 모든 것을 처음부터 다시 해야 할까 봐 걱정할 필요가 없으며, Agent의 가용성을 한 단계 더 높였습니다.
비동기 (Asynchronous)의 장점?
Agent가 도구를 실행하는 데 걸리는 시간: 수백 밀리초 (ms)
사용자가 질문에 답변하기를 기다리는 시간: 즉시일 수도 있고, 몇 시간 뒤일 수도 있습니다.
이번 변경의 핵심은 원래 메모리 (Memory)에 존재하던 상태 (State)를 디스크 (Disk)에 저장하여 해제하는 것입니다.
메모리 내의 상태는 생명 주기 (Lifecycle)에 따라 존재합니다. 디스크 상의 상태는 명시적으로 삭제되지 않는 한 항상 그 자리에 있습니다.
따라서 현재의 생명 주기는 ask_user 직전에 바로 중단됩니다. 사용자가 하루 뒤에 답변하더라도 문제가 되지 않는데, 답변 후에 전체 상태 기록을 읽어와 작업을 다시 시작하기 때문입니다.
ask_user 전의 상태 기록
실행을 중단하기 전, Agent는 반드시 세 가지 질문에 답해야 합니다: 목표는 무엇인가, 무엇을 완료했는가, 다음에 무엇을 할 것인가. 이 설계에는 두 가지 목적이 있습니다:
- Resume (재개) 시 Agent에게 완전한 컨텍스트 (Context)를 제공하여 실행을 계속할 수 있도록 함 (이미 찾아낸 데이터 등 포함)
ask_user이전에 Agent가 현재 상태를 정리하여 요구사항과 목표를 일치시키도록 함
Resume 프로세스 복구
사용자가 답변하면, 먼저 상태 기록과 사용자의 답변을 읽어 하나의 완전한 컨텍스트로 조합하여 새로운 입력값으로 Agent에게 전달합니다.
대화 기록 (Conversation History)에 의존하는 대신, 상태 기록의 내용을 완전히 활용하여 Agent에게 이전에 완료한 단계와 사용자가 답변한 내용을 알리고 다음 단계를 진행하도록 합니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기