프롬프트 캐싱은 IBM® Granite 모델 같은 언어 모델을 사용할 때 실행된 프롬프트에서 생성된 응답을 저장한 다음 재사용하는 방법입니다. 동일한 인풋(프롬프트)이 다시 들어오면 애플리케이션이 새 API 호출을 수행하지 않고, 프롬프트 캐시에 저장되어 있던 응답을 검색합니다.
프롬프트 캐싱은 애플리케이션의 일종의 '메모리'라고 생각하면 됩니다. 시스템은 동일한 입력에 대한 요청을 반복할 필요가 없으므로, 이전 쿼리의 결과를 유지해서 컴퓨팅 시간을 절약합니다.
프롬프트 캐싱은 동일한 반복적인 프롬프트에 기존 응답을 재사용하여, 반복적인 애플리케이션 프로그래밍 인터페이스(API) 호출을 방지하는 중요한 역할을 합니다. 이 기능을 사용하면 응답 시간이 빨라지고 아웃풋의 일관성이 높아지며 API 사용량이 줄어들어 속도 제한을 지키는 데 도움이 됩니다. 또한 플로를 확장하고 가동 중단 시 복원력을 갖추는 데 도움이 됩니다. 프롬프트 캐싱은 비용 효과가 높고 효율적이며 사용자 친화적인 AI 애플리케이션에 가치를 더하는 중요한 기능입니다.
watsonx.ai 프로젝트를 생성하려면 IBM Cloud 계정이 필요합니다.
Python 3.12.7 버전도 필요합니다.
여러 툴 중에서 선택할 수 있지만, 이 튜토리얼에서는 Jupyter Notebook을 사용하기 위해 IBM 계정을 설정하는 방법을 안내합니다.
IBM Cloud 계정을 사용하여 watsonx.ai에 로그인합니다.
watsonx.ai 프로젝트를 생성합니다. 프로젝트 내에서 프로젝트 ID를 가져올 수 있습니다. 관리 탭을 클릭합니다. 그런 다음 일반 페이지의 세부 정보 섹션에서 프로젝트 ID를 복사합니다. 이 튜토리얼에는 이 ID가 필요합니다.
Jupyter Notebook을 만듭니다. 이 단계에서는 이 튜토리얼의 코드를 복사할 수 있는 Notebook 환경이 열립니다. 또는 이 노트북을 로컬 시스템에 다운로드하여 watsonx.ai 프로젝트에 에셋으로 업로드할 수 있습니다. 더 많은 Granite 튜토리얼을 보려면 IBM Granite 커뮤니티 를 확인하세요.
watsonx.ai 런타임 서비스 인스턴스를 만듭니다(무료 인스턴스인 Lite 요금제 선택).
API 키를 생성합니다.
watsonx.ai 런타임 서비스를 watsonx.ai에서 생성한 프로젝트에 연결합니다.
langchain 프레임워크 및 WatsonxLLM이 함께 작동하려면 라이브러리가 필요합니다. 먼저 필요한 패키지를 설치해 보겠습니다. 이 튜토리얼은 Python 3.12.7을 사용하여 작성했습니다.
참고: 이전 버전의 pip를 사용하는 경우 pip install --upgrade pip 명령을 사용하여 이전 버전과 호환되지 않을 수 있는 최신 패키지를 쉽게 설치할 수 있습니다. 그러나 이미 최신 버전을 사용하고 있거나 최근에 패키지를 업그레이드한 경우 이 명령을 건너뛸 수 있습니다.
os 모듈은 프로젝트 자격 증명이나 API 키와 같은 환경 변수에 액세스하는 데 사용됩니다.
WatsonxLLM은 IBM Watson LLM을 통합하여 생성 AI 모델에서 출력을 생성하는 langchain_ibm의 모듈입니다.
ChatWatsonx는 LangChain을 통해 IBM Watsonx를 사용하여 채팅 기반 상호작용을 가능하게 합니다.
SimpleDirectoryReader는 LlamaIndex를 사용하여 인덱싱하기 위해 디렉터리에서 문서를 로드하고 읽는 용도입니다.
GenParams에는 Watsonx 텍스트 생성 매개변수를 구성하기 위한 메타데이터 키가 포함되어 있습니다.
SQLiteCache를 사용하면 로컬 .cache.db SQLite 데이터베이스를 설정하여 중복된 API 호출을 피하고 개발 및 테스트 속도를 높일 수 있습니다.
이 튜토리얼에는 몇 가지 라이브러리와 모듈이 필요합니다. 다음 항목을 가져와야 합니다. 설치되지 않은 경우, 빠른 PIP 설치로 이 문제를 해결할 수 있습니다.
이 코드는 IBM® Watson Machine Learning(WML) API에 액세스하기 위한 자격 증명을 설정하고 프로젝트 ID가 올바르게 구성되었는지 확인합니다.
이 코드는 IBM WatsonxLLM을 애플리케이션에서 사용할 수 있도록 초기화합니다.
최소 및 최대 토큰 제한과 같은 모델 매개변수에 대해 자세히 알아보려면 문서를 참조하세요.
SQLiteCache는 LangChain이 제공하는 영구 캐싱 도구로, LLM 호출의 응답을 SQLite 데이터베이스 파일에 저장합니다. SQLiteCache는 비용이 많이 드는 계산을 저장하여 CPU 시간을 스마트하게 줄여 데이터를 다시 계산하는 대신 검색하는 데 중점을 둡니다. 프로세스 전체를 되풀이하지 않고 디스크에서 결과를 가져오기만 해서 효율적이고 안정적이며 재사용할 수 있습니다.
그림은 프롬프트 캐싱을 사용할 때 결과가 디스크에서 즉시 로드되는 것을 보여줍니다. 프롬프트 캐싱이 없으면 모든 쿼리가 중복 계산에 시간을 허비합니다.
이 경우 CPU는 22ms 동안만 작동했지만 실제 경과 시간은 1.43초였습니다.
이 예시는 대부분의 시간이 I/O 작업(예: 디스크 읽기 및 쓰기, 네트워크 액세스 또는 API 호출)을 기다리는 데 소비되었음을 시사합니다.
이제 프롬프트와 함께 모델을 두 번째로 실행하고 응답 시간을 확인해 보겠습니다.
SQLiteCache를 사용하니 CPU가 7.26ms 동안 사용되었지만 실제 경과 시간은 6.15초였습니다.
이는 외부 종속성(서버의 응답 대기 등)을 차단한 덕분임을 확실하게 알 수 있습니다.
프롬프트 캐싱은 GPT-4o와 같은 대규모 언어 모델에 대한 API 요청 비용을 절감하고 가속화합니다. 프롬프트는 입력 토큰, 아웃풋 토큰, 임베딩 및 사용자의 메시지, 시스템 프롬프트 또는 함수의 아웃풋과 같은 콘텐츠를 캐시하며, 이제 네트워크가 새 수정본을 요청하는 것이 아니라 캐시된 콘텐츠를 사용합니다. 이 방법을 택하면 가격이 저렴해지고, 응답 시간이 짧아지고, KPI가 개선됩니다.
프롬프트 캐싱은 챗봇, RAG 시스템, 미세 조정 및 코드 어시스턴트에 유용할 수 있습니다. 캐시 읽기, 캐시 쓰기, 시스템 메시지, 캐시 제어 및 적절한 TTL(Time to Live)과 같은 기능을 아우르는 강력한 캐싱 전략을 취하면 캐시 적중률을 높이고 캐시 누락률을 낮출 수 있습니다.
동일한 프롬프트 토큰, 프롬프트 접두사 및 사용 시스템 지침을 일관되게 사용하면 멀티턴 대화와 후속 요청에서 일관된 프롬프트 성능을 발휘하는 데 도움이 됩니다. Python, SDK를 사용하든 OpenAI 또는 다른 서비스와 협력하든, 프롬프트 캐싱의 작동 방식을 이해하면 프롬프트 캐싱을 많은 사용 사례에 맞춰 더 잘 구현할 수 있습니다.