TL;DR
- Pi Durable는 모든 작업 단계를 저장소에 체크포인트로 기록하는 내구성 에이전트 하네스로, 프로세스가 종료돼도 새 프로세스가 미완료 작업을 이어서 실행함.
- 모델 요청과 도구 실행을 작업으로 취급하고, 중단된 작업의 재시도 여부와 제출의 정확히 한 번 처리를 관리함.
- 여러 대화를 병렬로 실행하며, 대화 분기와 확장 기능을 통해 에이전트·검토자·도구의 구성을 유연하게 조정함.
- 훅, 작업 소유권 트리, 백그라운드 작업, 문맥 압축으로 실행 흐름과 부작용을 관리함.
- 대화 기록과 원자적으로 저장되는 타입 지정 JSON 문서, 변경 사항만 전달하는 멀티플레이어 클라이언트로 상태를 유지함.
시뮬레이션과 구성
- Pi Durable의 작동 모델은 Earendil의 내구성 에이전트 하네스로, 모든 작업이 상태 차트(statechart)로 표현되고 각 단계를 저장소에 커밋함.
- 프로세스를 언제든 종료해도 새 프로세스가 체크포인트부터 모든 작업을 이어서 실행함.
- 상태 차트, 하네스 모델, 안내 자료는
examples/pi-durable에 있으며 Pi Durable 자체는earendil-works/pi에 있음. <scxml-explorer>,PlaybackClock, 사용자 지정 입출력 프로세서와 인보커로 구축됨.
하네스란?
- 하네스는 대형 언어 모델(LLM)과 하나 이상의 대화를 병렬로 실행하는 데 필요한 저장소와 실행 장치임.
- 모델이 호출하는 도구와 해당 도구가 실행되는 환경을 제공함.
- 모델 호출부터 도구 실행까지 하네스가 실행하는 모든 항목이 작업임.
어디서나 장시간 실행
- Pi Durable의 하네스는 저장소 백엔드 위에서 열림.
- 한 번에 하나의 프로세스만 저장소를 소유하고, 다른 클라이언트는 해당 프로세스에 연결됨.
env함수는 대화의 작업 디렉터리를 바탕으로 각 도구 호출의 환경을 구성하므로, 대화마다 서로 다른 위치에서 실행 가능함.
충돌 후에도 실행 지속
- 실행의 각 단계는 다음 단계로 넘어가기 전에 체크포인트를 저장하는 작업임.
- 프로세스가 종료되면 새 프로세스가 같은 저장소를 열고 미완료 작업을 찾아 마지막 체크포인트부터 각각 이어서 실행함.
- 중단된 모델 요청은 다시 전송되며, 부분 응답은 중단 표시와 함께 대화 기록에 남음.
- 중단된 도구 호출은 안전한 경우에만 다시 실행되며, 그렇지 않으면 모델에 도구 실행이 중단됐다고 알림.
- 대기열에 들어간 메시지는 계속 대기 상태를 유지함.
requestId를 사용해 제출을 정확히 한 번 처리하므로, 충돌 후 재시도하는 클라이언트는 요청을 중복 제출하는 대신 기존 제출 결과를 돌려받음.
여러 대화를 동시에 실행
- 대화는 새로 시작하거나 대화 기록의 어느 지점에서든 다른 대화를 분기할 수 있으며, 기록을 복사하지 않고 해당 지점까지 부모 대화의 이력을 확인함.
- 주 에이전트 옆의 검토자는 더 저렴한 모델, 읽기 전용 도구, 독립된 체크아웃을 사용할 수 있음.
확장 기능: 시스템 프롬프트 섹션
- 매 요청 전에 대화의 확장 기능 섹션을 바탕으로 시스템 프롬프트를 다시 구성하므로, 변경된 섹션은 다음 요청에 반영됨.
- Pi Durable는 변경 내용을 바뀐 시점의 대화 기록에 기록하므로, 재시작이나 분기 후에도 모델이 본 내용과 정확히 일치함.
확장 기능: 도구
- 각 도구 호출은 자체 내구성 작업으로 실행되며, 실행 전에 호출 의도를 저장함.
- 충돌 후 도구는 안전하다고 명시한 경우에만 다시 실행됨.
- 도구는 자신이 소유하는 대화를 만들고, 그 대화에 더 작은 모델과 별도의 지시를 부여한 뒤 응답을 기다릴 수 있음.
- 나중에 로드된 확장 기능의 도구 이름이 앞선 도구와 같으면 앞선 도구를 대체함. 예를 들어 가상환경 안에서 실행되는
bash도구를 사용할 수 있음. - 래핑 확장 기능을 선택하면 래퍼가 선택된 도구를 감쌈.
확장 기능: 훅
- 훅은 충돌 후 다시 실행될 수 있으므로, 결정을 내리는 훅은 작업에 함께 저장되는 작은 값인 메모(memo)에 결정을 기록함. 메모는 최초 기록이 유지됨.
- 훅은 대화에서 확장 기능을 선택한 순서대로 연결되며, 각 훅이 체인의 실행 방식을 정의함.
확장 기능: 작업
- 여러 카드에 비용을 나눠 청구하는 체크아웃은 모든 카드에 동시에 요금을 청구함. 한 카드의 결제가 거부되면 나머지 결제는 중단되고 환불됨.
- 작업과 대화는 하나의 소유권 트리를 구성함. 작업을 중단하면 그 작업이 소유한 항목도 아래에서 위로 중단되며, 각 작업은 자신의 부작용을 먼저 정리함. 작업은 소유한 작업이 모두 끝나야 완료됨.
- 백그라운드 작업은 대화에 속하지만 현재 진행 중인 작업에는 속하지 않음. 백그라운드 작업이 실행되는 동안 대화는 유휴 상태가 되며, 일반적인 중단은 해당 작업과 그 작업이 소유한 항목에 영향을 주지 않음.
문맥 압축
- 문맥이 모델의 한도에 가까워지면 백그라운드 압축이 오래된 메시지를 요약하고, 요약을 다음 턴의 경계에 배치함.
- 다음 요청이 요약 없이는 한도에 들어가지 않을 때만 대화가 요약을 기다림.
- 내용을 삭제하지 않으므로 다른 도구가 인계 이전의 모든 기록을 검색할 수 있음.
내구성 있는 애플리케이션 상태
- 문서는 대화 기록 옆에 저장되는 타입 지정 JSON이며, 같은 원자적 커밋에서 변경되므로 상태가 그 상태를 만든 대화 기록과 어긋나지 않음.
- 각 문서는 분기 시 시작 상태를 부모의 분기 지점 값, 현재 값, 새 값 중 하나로 지정함.
유연한 변경
- 이미 설치된 이름으로 확장 기능을 설치하면 한 단계로 기존 확장 기능을 대체함.
- 이미 실행 중인 도구 호출은 시작할 때 사용한 코드로 완료되며, 다음 호출부터 새 코드를 사용함.
- 대화에는 코드가 아니라 확장 기능 이름과 도구 이름을 저장하므로, 재시작 후 새 프로세스가 설치한 항목을 사용함.
멀티플레이어
- 클라이언트는 먼저 대화 기록, 스트리밍 중인 응답, 실행 중인 도구와 출력, 대기 중인 메시지, 에이전트, 사용량 등 현재 상태를 받음. 이후에는 변경 사항만 받음.
- 어느 클라이언트든 실행 중인 대화를 조정하거나 후속 메시지를 대기열에 넣을 수 있음.
댓글 (0)
로그인하면 이 기사에 내 생각을 남길 수 있어요