Groundhog Day for AI agents: Prompt caching patterns for using OpenAI models on Amazon Bedrock
Quick Summary
Amazon Bedrock의 OpenAI 모델에서 명시적·암시적 프롬프트 캐싱을 결합하면 도구·지침과 누적 대화의 재처리를 줄일 수 있으며, GPT 6 Astra의 6턴 실험에서는 입력 비용이 캐싱 미사용 대비 약 61~62% 감소했다.
🖼️ 인포그래픽

🖼️ 4컷 인포그래픽

💡 한 줄 요약
Amazon Bedrock의 OpenAI 모델에서 명시적·암시적 프롬프트 캐싱을 결합하면 도구·지침과 누적 대화의 재처리를 줄일 수 있으며, GPT-6 Astra의 6턴 실험에서는 입력 비용이 캐싱 미사용 대비 약 61~62% 감소했다.
📌 핵심 요약
- AI 에이전트의 모델은 요청 사이에 내부 기억을 유지하지 않으므로 도구 정의, 지침, 이전 도구 호출과 결과를 매번 입력받는다. 프롬프트 캐싱은 동일한 입력 접두부의 사전 처리 상태를 재사용해 반복 처리 비용을 줄인다.
- Amazon Bedrock은 재사용 구간의 끝을 서비스가 정하는 암시적 캐싱과 코드의 prompt_cache_breakpoint로 지정하는 명시적 캐싱을 제공한다. 두 방식을 결합하면 도구·지침의 공통 시작 구간과 계속 늘어나는 대화 이력을 함께 캐싱할 수 있다.
- 캐싱 대상 접두부는 최소 1,024토큰이어야 하며 입력 텍스트가 정확히 일치해야 한다. 도구 순서와 직렬화를 일정하게 유지하고 날짜·사용자 이름·요청 ID는 공통 캐시 구간 뒤에 배치한다. 예제는 TTL을 30m으로 설정하며, 정적 접두부 실험에서는 첫 요청에 4,120토큰을 기록하고 후속 요청에서 같은 양을 재사용했다.
- 도구 실행은 애플리케이션이 담당하며 모델 출력과 도구 결과를 history에 추가해 다시 전달한다. 암시적 캐싱은 마지막 도구 결과까지 확장된 이력을 저장할 수 있고, 명시적 캐싱만 사용할 때는 각 도구 결과 묶음의 마지막에 경계 표시를 추가하고 이전 표시를 보존한다.
- GPT-6 Astra의 6턴 워크로드에서 암시적 캐싱은 입력 비용을 약 62%, 명시적 이동 경계 방식은 약 61% 줄였다. 이는 해당 워크로드의 결과이므로 자체 에이전트에서 절감 효과를 측정해야 하며, 명시적 모드에서 정적 경계만 두면 늘어나는 이력은 매번 다시 처리된다.
🧩 주요 포인트
- 요청 사이의 내부 기억 부재 → 전체 이력은 계속 전달하되 동일한 접두부의 처리 상태를 재사용하는 것이 반복 비용 절감의 핵심이다.
- 공통 도구·지침과 세션별 이력의 재사용 범위 차이 → 명시적 경계로 공통 시작 구간을 확보하고 암시적 캐싱으로 대화 증가를 따라가도록 구성할 수 있다.
- 정확한 텍스트 일치와 캐시 경계가 재사용을 좌우 → 직렬화·도구 순서·가변 정보의 위치를 안정적으로 유지하고, 약 61~62% 절감 수치는 자체 워크로드 측정으로 검증할 필요가 있다.
🧠 상세 정리
1. 에이전트가 매번 자신의 이력을 다시 읽는 이유
글은 영화 Groundhog Day에서 주인공이 같은 하루를 반복하는 상황을 AI 에이전트의 동작에 비유하며 시작한다. 모델은 요청 사이에 내부 기억을 유지하지 않고 제공된 입력을 바탕으로 다음 토큰을 예측하므로, 에이전트가 도구를 호출하고 결과를 읽으며 다음 행동을 정할 때마다 지금까지의 맥락을 다시 전달해야 한다. 여기에는 도구 정의와 지침뿐 아니라 이전 도구 호출과 모든 결과도 포함되며, 코딩 세션의 20번째 턴에는 1~19번째 턴을 다시 읽는 식으로 입력이 누적된다. 사용자는 이렇게 반복해서 전달되는 토큰의 비용을 부담하므로 대화가 길어질수록 동일한 맥락을 다시 처리하는 문제가 커진다. 프롬프트 캐싱은 재사용 가능한 입력의 처리 상태를 저장해 후속 요청에서 활용함으로써 이 반복 비용을 줄이는 방법으로 제시된다.
2. 요청을 구성하는 네 가지 요소
전형적인 에이전트의 모델 요청은 도구 목록, 지침, 이력, 새 턴이라는 네 요소로 나뉜다. 도구 목록은 에이전트가 호출할 수 있는 함수의 정의이며, 지침은 규칙·페르소나·정책·예시를 담은 개발자 프롬프트로서 두 요소는 보통 새 릴리스를 배포할 때 바뀐다. 이력에는 현재 세션의 작업, 모델의 도구 호출, 도구 결과가 들어가고 매 턴 길어지는 반면, 새 턴은 가장 최근의 도구 결과나 사용자 메시지로서 요청마다 달라질 수 있다. 이러한 구성은 여러 요청에서 유지되는 공통 부분과 대화 진행에 따라 추가되는 부분을 구분하는 출발점이 된다. 따라서 도구·지침을 위한 공통 캐시와 세션별로 늘어나는 이력을 위한 캐시는 서로 다른 재사용 요구를 다루며, 글의 예제들은 이 차이를 기준으로 캐싱 방식을 확장한다.
3. 프리필 상태를 재사용하는 캐싱 원리
모델은 첫 출력 토큰을 생성하기 전에 프리필(prefill) 과정에서 입력 토큰을 처리하고 키·값 벡터인 KV 상태를 만든다. 프롬프트 캐싱은 시스템 프롬프트, 도구, 콘텐츠, 이력 등을 처리한 이 상태를 저장하고, 이후 요청이 동일한 입력 토큰으로 시작하면 다시 계산하는 대신 저장된 상태를 불러온다. 이어서 새로 추가된 부분만 처리하므로, 캐시가 적중한 접두부의 반복 계산을 줄일 수 있다는 것이 글의 설명이다. 이때 재사용의 조건은 입력 텍스트의 정확한 일치이며, 모델이 요청 사이에 독립적인 기억을 갖게 되는 것은 아니다. Amazon Bedrock이 재사용 접두부의 끝을 선택하는 암시적 방식과 코드에서 prompt_cache_breakpoint로 끝을 표시하는 명시적 방식이 제공되며, 글은 필요에 따라 두 방식을 함께 사용하는 구성을 권장한다.
4. 정적 도구·지침을 명시적으로 캐싱하기
첫 번째 적용 예제는 요청마다 유지되는 도구와 지침을 명시적으로 캐싱하며, 재사용 접두부가 최소 1,024토큰에 도달해야 한다는 조건을 제시한다. us.openai.gpt-6-astra를 호출하는 예제는 prompt_cache_options의 mode를 explicit, ttl을 30m으로 설정하고 개발자 지침 블록에 경계 표시를 둔다. 도구는 지침보다 앞에 렌더링되므로 이 경계는 도구와 지침을 함께 포함하며, 뒤에 놓인 사용자 작업은 처리되지만 해당 정적 캐시에는 기록되지 않는다. prompt_cache_key는 어떤 요청들이 캐시를 공유하도록 의도되었는지 서비스에 알리는 값으로 설명된다. 약 4,000토큰 규모의 도구·지침 접두부를 사용한 한 실험에서는 첫 요청이 4,120토큰을 캐시에 기록하고 후속 요청들이 그 4,120토큰을 읽었다.
5. 대화 증가를 따라가는 암시적 캐싱
콘텐츠가 늘어나고 요청 내용이 달라지는 상황에서는 암시적 모드를 사용해 서비스가 대화의 증가를 따라가도록 할 수 있다. 명시적 표시가 없는 첫 요청에서는 사용자 작업 메시지의 끝이 자동 경계가 되므로 도구, 지침, 작업이 함께 캐싱되며, 암시적 모드는 기본값이지만 예제에서는 이해를 돕기 위해 설정을 드러낸다. store=False는 대화 이력을 애플리케이션에서 관리하도록 하는 설정이며 프롬프트 캐싱을 비활성화하지 않는다. 같은 작업을 이어가는 다음 턴에는 이 방식이 유용하지만, 다른 작업은 이전 작업까지 포함된 접두부와 일치하지 않아 재사용 범위가 달라진다. 또한 암시적 기록이 도구·지침만을 위한 별도 항목까지 반드시 만드는 것은 아니므로, 서로 다른 작업에서도 짧은 공통 시작 구간을 재사용하려면 그 위치에 명시적 경계를 두어야 한다.
6. 두 방식의 결합과 입력 일관성
공통 시작 구간과 계속 늘어나는 이력이 모두 필요한 에이전트는 요청 수준의 모드를 implicit으로 유지하면서 개발자 지침 블록 끝에 명시적 표시를 추가할 수 있다. 이렇게 하면 도구·지침 뒤의 저장 지점을 확보하는 동시에 서비스가 가장 최근의 적격 메시지까지 대화를 저장할 수 있어, 공통 접두부와 세션별 확장 이력을 함께 다룰 수 있다. 다만 캐싱은 정확히 같은 텍스트가 전달될 때 작동하므로 지침과 도구 목록의 직렬화 방식을 매번 동일하게 유지해야 한다. 도구 순서를 안정적으로 유지하고 MCP 서버 등에서 전달되는 도구도 일관된 순서로 구성해야 한다는 점이 강조된다. 날짜, 사용자 이름, 요청 ID처럼 달라지는 값은 캐싱할 지침 뒤에 두어야 공통 접두부의 일치를 유지할 수 있다.
7. 도구 결과와 이력을 누적하는 실행 루프
모델은 도구의 이름과 인자를 요청하지만 실제 함수 실행은 애플리케이션이 담당하며, 예제의 execute_function은 요청을 등록된 Python 함수에 연결하고 결과를 반환한다. 실행 루프는 암호화된 추론을 포함한 모든 모델 출력 항목을 history에 보존하고, 각 도구 결과를 호출 식별자와 함께 추가한 뒤 최종 답변이 나올 때까지 다시 요청한다. 암시적 모드에서는 변경되지 않은 접두부를 재사용하면서 마지막 도구 결과까지 추가된 내용을 캐싱할 수 있으며, 이전 메시지와 초기 TOOLS는 그대로 유지해야 한다. 명시적 모드만 사용하는 별도 예제에서는 도구 결과를 input_text 블록으로 감싸고 각 묶음의 마지막 결과에 새 경계를 표시한다. 이전 경계도 history에 남겨 두는 이동 경계 방식이 제시되지만, 긴 대화에서의 구체적인 조회 규칙은 본문에서 별도 참조로 안내된다.
8. 비용 절감 결과와 해석의 한계
제시된 6턴 워크로드에서 GPT-6 Astra의 암시적 캐싱은 캐싱을 사용하지 않았을 때보다 입력 비용을 약 62% 줄였으며, 해당 실험에서 가장 좋은 암시적 결과와 공동으로 같은 수준을 기록했다. 같은 모델에 명시적 이동 경계를 적용했을 때의 입력 비용 절감은 약 61%였고, 두 방식 모두 대화가 길어질수록 더 많은 이력을 재사용했다. 글은 이 수치가 특정 워크로드에서 나온 결과라고 명시하며 각자의 에이전트에서 실제 절감 효과를 측정할 것을 권한다. 이어지는 주의사항에서는 명시적 모드에 정적 경계만 두면 도구와 지침은 캐싱되지만 늘어나는 대화 이력은 매 턴 다시 처리된다고 설명한다. 제공된 source_body는 이 주의사항 도중에 끝나므로, 이후의 추가 설명이나 도구 변경·보조 에이전트 관련 세부 구현은 확인할 수 없다.
🧾 핵심 주장 / 시사점
- 프롬프트 캐싱의 핵심은 모델에 영구 기억을 부여하는 것이 아니라, 애플리케이션이 다시 전달한 동일한 접두부의 처리 상태를 재사용하는 데 있다.
- 암시적 캐싱이 대화 전체를 저장하더라도 도구·지침만의 공통 접두부가 별도로 확보되는 것은 아니므로, 작업 간 재사용에는 명시적 저장 지점이 의미를 갖는다.
- 실험에서 암시적 방식과 명시적 이동 경계의 절감률은 비슷했지만, 명시적 모드의 정적 경계만으로는 누적 이력의 반복 처리를 줄일 수 없다.
✅ 액션 아이템
- 도구·지침의 공통 시작 구간에 명시적 경계를 두고, 누적 대화 이력에는 암시적 캐싱을 결합하는 구성 검토.
- 최소 1,024토큰과 정확한 텍스트 일치 조건을 확인하고, 도구 순서·직렬화 및 날짜·사용자 이름·요청 ID의 배치 점검.
- 자체 에이전트에서 캐싱 미사용 대비 입력 비용을 측정하고, GPT-6 Astra의 약 61~62% 절감 결과와 비교.
❓ 열린 질문
- 현재 도구·지침의 공통 시작 구간은 최소 1,024토큰과 정확한 텍스트 일치 조건을 충족하는가?
- 명시적 경계와 암시적 캐싱을 결합했을 때 공통 시작 구간과 누적 대화 이력이 각각 재사용되는가?
- 자체 에이전트의 입력 비용 절감률은 GPT-6 Astra의 6턴 실험에서 나온 약 61~62%와 얼마나 차이가 있는가?