또 하나의 캐시, 하지만 ChatGPT용
ChatGPT는 개발자가 게임 체인징 애플리케이션을 만들 수 있게 해주는 인상적인 기술입니다. 그러나 언어 모델 모델(LLM)의 성능과 비용은 다양한 분야에서의 광범위한 적용을 저해하는 중요한 문제입니다. 예를 들어, 오픈소스 커뮤니티를 위한 챗봇 https://osschat.io/를 개발하면서, ChatGPT는 우리 애플리케이션이 기대한 만큼 빠르게 응답하지 못하게 하는 주요 병목이었습니다. 비용 또한 더 많은 오픈소스 커뮤니티에 서비스를 제공하지 못하게 하는 또 다른 장애물입니다.
팀 점심 자리에서 한 가지 아이디어가 떠올랐습니다: LLM이 생성한 응답을 위한 또 다른 캐시 계층을 추가하면 어떨까? 이 캐싱 계층은 과거 Redis와 Memcache가 데이터베이스 접근 속도를 높이고 비용을 줄이기 위해 만들어졌던 방식과 유사할 것입니다. 이 캐시를 통해 콘텐츠 생성 비용을 줄이고 더 빠른 실시간 응답을 제공할 수 있습니다. 또한 캐시는 응답을 모킹하는 데 사용할 수 있어, 테스트에 추가 비용을 발생시키지 않고 애플리케이션의 기능을 검증하는 데 도움이 됩니다.
전통적인 캐시는 키가 동일할 때만 데이터를 가져옵니다. 이러한 한계는 자연어를 자주 다루며 더 구체적인 구문 제한이나 추가 데이터 정제 메커니즘이 필요한 AIGC 애플리케이션에 중요한 문제를 제기합니다. 이 문제를 해결하기 위해 우리는 AIGC 네이티브 애플리케이션을 위한 Yet Another Cache를 만들었으며, ChatGPT를 가속화하도록 네이티브하게 구축되고 시맨틱 검색에 최적화되어 있기 때문에 이를 GPTCache(https://github.com/zilliztech/GPTCache)라고 이름 붙였습니다.
GPTCache를 사용하면 몇 줄의 코드 변경만으로 LLM 응답을 캐시하여 LLM 애플리케이션을 100배 더 빠르게 만들 수 있습니다. 이 블로그 게시물에서는 우리가 시맨틱 캐시를 어떻게 구축했는지와 우리가 내린 몇 가지 설계 선택에 대해 설명하겠습니다.
왜 캐시가 우리의 사용 사례에 도움이 될까요?
우리 챗봇은 사용자가 GitHub의 오픈소스 프로젝트에 대한 일반적인 질문과 특정 GitHub 리포지토리 및 관련 문서 페이지에 대한 상세한 질문을 할 수 있게 합니다. 서비스가 인기를 얻으면서 OpenAI API 호출과 관련된 비용이 증가합니다. 우리는 인기 있거나 트렌딩 중인 주제, 인기 GitHub 리포지토리와 같은 특정 유형의 콘텐츠가 더 자주 접근된다는 것을 관찰했습니다. “무엇인가” 질문은 서비스 첫 페이지의 추천 질문 목록과 함께 가장 일반적으로 접근되는 질문입니다.
전통적인 애플리케이션과 마찬가지로 AIGC 애플리케이션에 대한 사용자 접근에는 시간적 및 공간적 지역성이 있습니다. ChatGPT 호출 수를 줄이는 캐시 시스템을 구현함으로써 이를 활용할 수 있습니다. OpenAI API의 느린 응답 시간과 높은 비용을 고려하면, 일반적으로 1M 토큰당 몇 달러가 청구되고 응답하는 데 몇 초가 걸리는 이 캐시 시스템은 필수적입니다. 수백만 개의 캐시된 벡터 중에서 벡터 검색을 수행하고 데이터베이스에서 캐시된 결과를 가져옴으로써, 서비스의 평균 종단 간 응답 시간을 크게 줄이고 OpenAI 서비스 비용을 낮출 수 있습니다.
왜 Redis는 AIGC 시나리오에서 작동하지 않을까요?
저는 Redis의 유연성과 성능 때문에 다양한 사용 사례에 적합하다고 생각하는 Redis의 열렬한 팬입니다. 그러나 ChatGPT를 위한 캐시를 구축하는 데에는 Redis가 제 첫 번째 선택이 아닙니다. Redis는 키-값 데이터 모델을 사용하며 근사 키를 쿼리할 수 없습니다.
예를 들어, 사용자가 "모든 딥러닝 프레임워크의 장점과 단점은 무엇인가요?" 또는 "PyTorch vs. TensorFlow vs. JAX에 대해 알려주세요?"와 같은 질문을 한다고 가정해 보겠습니다. 이 경우 그들은 같은 것을 묻고 있습니다. 그러나 Redis는 전체 질문을 캐시하든 토크나이저에서 생성된 키워드만 캐시하든 쿼리를 적중시키지 못합니다. 이러한 실패는 자연어에서 서로 다른 단어가 같은 의미를 가질 수 있고, 딥러닝 모델이 규칙보다 이러한 의미를 더 잘 드러내기 때문입니다. 따라서 우리는 시맨틱 캐시의 일부로 벡터 유사도 검색을 통합해야 합니다.
Redis가 AIGC 캐싱에 완벽하게 적합하지 않을 수 있는 또 다른 이유는 높은 비용입니다. 긴 컨텍스트로 인해 키와 값이 크기 때문에 모든 것을 Redis에 저장하면 빠르게 비용이 많이 들 수 있습니다. chatGPT 응답은 느리므로 캐시가 밀리초 미만 또는 수십 밀리초 안에 응답할 수 있는지는 중요하지 않기 때문에 디스크 기반 데이터베이스를 사용한 캐싱이 더 나은 대안일 수 있습니다.
처음부터 GPTCache 구축하기
우리는 이 아이디어에 흥미를 느꼈고 밤새 논의했습니다. 그 결과, 아래에 표시된 유용한 아키텍처 다이어그램을 고안했습니다:
GPTCache High Level Architecture | Zilliz
나중에 우리는 컨텍스트 매니저를 건너뛰어 구현을 단순화하기로 결정했습니다. 이러한 변경에도 불구하고, 시스템은 여전히 다섯 가지 주요 구성 요소로 이루어져 있습니다. 아래에 각 구성 요소의 주요 기능을 나열했습니다:
- LLM 어댑터: 어댑터는 LLM 요청을 캐시 프로토콜로 변환하고 캐시된 결과를 LLM 응답으로 변환합니다. 우리는 이 캐시를 투명하게 만들어, 이를 우리 시스템이나 ChatGPT에 의존하는 다른 어떤 시스템에도 추가 노력 없이 통합할 수 있도록 하는 것을 목표로 합니다. 어댑터는 모든 LLM의 쉬운 통합을 촉진하고 향후 멀티모달 모델을 위해 확장 가능해야 합니다. 초기에는 우리 시스템이 OpenAI와 langchain에 크게 의존하기 때문에 OpenAI 및 langchain 어댑터를 구현했습니다. 여러 구현은 또한 우리의 인터페이스가 모든 LLM API에 적합하다는 것을 보장하여 어댑터를 더 확장할 수 있게 했습니다.
- 임베딩 생성기: 임베딩 생성기는 쿼리를 임베딩으로 인코딩하여 유사도 검색을 가능하게 합니다. 다양한 사용자의 요구를 충족하기 위해, 우리는 임베딩을 생성하는 두 가지 방식을 지원합니다. 첫 번째는 OpenAI, Hugging Face, Cohere와 같은 클라우드 서비스를 통한 방식입니다. 두 번째는 ONNX에서 제공되는 로컬 모델을 통한 방식입니다. 또한 PyTorch 임베딩 생성기를 지원하고 이미지, 오디오 파일 및 기타 유형의 비정형 데이터를 인코딩할 계획입니다.
- 캐시 관리자: 캐시 관리자는 GPTCache의 핵심 구성 요소로, 세 가지 기능을 수행합니다: 사용자 요청과 해당 LLM 응답을 저장하는 캐시 스토리지; 벡터 임베딩을 저장하고 유사한 결과를 검색하는 벡터 스토리지; 그리고 캐시 용량을 제어하고 캐시가 가득 찼을 때 LRU 또는 FIFO 정책을 사용하여 만료된 데이터를 제거하는 축출 관리입니다. 캐시 관리자는 플러그형 설계를 사용합니다. 처음에는 SQLite와 FAISS를 백엔드로 사용하여 구현했습니다. 이후 MySQL, PostgreSQL, Milvus, 기타 벡터 데이터베이스와 같은 다른 구현을 포함하도록 확장하여 더욱 확장 가능하게 만들었습니다. 축출 관리자는 GPTCache에서 오래되고 사용되지 않는 데이터를 제거하여 메모리를 확보합니다. 필요할 때 캐시와 벡터 스토리지 모두에서 항목을 제거합니다. 그러나 대부분의 벡터 스토리지 시스템에서 빈번한 삭제는 성능 저하를 초래할 수 있습니다. GPTCache는 이 문제를 완화하기 위해 삭제 임계값에 도달하면 인덱스 구축이나 압축과 같은 비동기 작업을 트리거합니다.
- 유사도 평가기: GPTCache는 캐시에서 상위 k개의 유사한 답변을 검색하고 유사도 평가 함수를 사용하여 캐시된 답변이 입력 쿼리와 일치하는지 판단합니다. GPTCache는 세 가지 평가 함수를 지원합니다: 정확 일치 평가, 임베딩 거리 평가, ONNX 모델 평가입니다. 유사도 평가 모듈은 GPTCache의 효과성에 매우 중요합니다. 조사 후, 우리는 ALBERT 모델의 파인튜닝된 버전을 사용했습니다. 그러나 다른 파인튜닝된 언어 모델이나 LLaMa-7b와 같은 다른 LLM을 사용하여 개선할 여지는 항상 있습니다. 어떤 기여나 제안도 매우 환영합니다.
- 후처리기: 후처리기는 사용자에게 최종 응답을 준비하는 데 도움을 줍니다. 가장 유사한 응답을 반환하거나 요청 온도에 따라 무작위성을 추가할 수 있습니다. 캐시에서 유사한 응답을 찾을 수 없는 경우, 요청은 LLM에 위임되어 새 응답을 생성하고 캐시합니다.
평가
우리의 아이디어를 설명하기 위해, 우리는 세 가지 문장 쌍을 포함하는 데이터셋을 발견했습니다: 동일한 의미를 가진 양성 샘플, 관련은 있지만 동일하지 않은 의미를 가진 음성 샘플, 그리고 완전히 관련 없는 의미를 가진 양성 및 음성 샘플 사이의 문장들입니다. 이 데이터셋은 우리 저장소에서 찾을 수 있습니다.
실험 1
기준선을 설정하기 위해, 먼저 30,000개의 모든 양성 샘플의 키를 캐시합니다. 다음으로, 무작위로 1,000개의 샘플을 선택하고 해당 피어 값을 쿼리로 사용합니다. 다음은 우리가 얻은 결과입니다:
| 캐시 적중 | 캐시 미스 | 양성 | 음성 | 적중 지연 시간 |
|---|---|---|---|---|
| 876 | 124 | 837 | 39 | 0.20s |
GPTCache의 유사도 임계값을 0.7로 설정하면 히트 비율과 긍정 비율 사이에서 좋은 균형을 달성한다는 것을 발견했습니다. 따라서 이후 모든 테스트에는 이 설정을 사용할 것입니다.
캐시된 결과가 쿼리와 관련하여 긍정인지 부정인지 판단하기 위해, ChatGPT가 생성한 유사도 점수를 사용하고 긍정 임계값을 0.6으로 설정합니다. 이 유사도 점수는 다음 프롬프트를 사용해 생성합니다:
다음 두 질문의 유사도를 0부터 1까지의 척도로 평가해 주세요. 여기서 0은 관련이 없음을 의미하고 1은 정확히 같은 의미를 의미합니다.
질문 "What are some good tips for self-study?"와 "What are the smart tips for self-studying?"는 매우 유사하며, 유사도 점수는 1.0입니다.
질문 "What are some essential things for wilderness survival?"와 "What are the things you need for survival?"는 꽤 유사하며, 유사도 점수는 0.8입니다.
질문 "What advice would you give to 16-year-old you?"와 "Where should I promote my business online?"는 완전히 다르므로, 유사도 점수는 0입니다.
그러면, 질문 "Which app lets you watch live football for free?"와 "How can I watch a football live match on my phone?"의 유사도 점수는
실험 2
우리는 50%의 긍정 샘플과 50%의 부정 샘플(관련 없는 쿼리)로 구성된 쿼리를 실행했습니다. 그 결과, 1160개의 요청을 실행한 후 다음 결과를 얻었습니다:
| Cache Hit | Cache Miss | Positive | Negative | Hit Latency |
|---|---|---|---|---|
| 570 | 590 | 549 | 21 | 0.17s |
히트 비율은 거의 50%이며, 히트 결과 중 부정 비율은 실험 1과 유사합니다. 이는 GPTCache가 관련 쿼리와 관련 없는 쿼리를 구별하는 데 훌륭한 성능을 보였다는 의미입니다.
실험 3
우리는 또 다른 실험을 수행하여 모든 부정 샘플을 캐시에 삽입하고 그들의 쌍 값을 쿼리로 사용했습니다. 일부 부정 샘플 쌍은 높은 유사도 점수(ChatGPT에 따르면 0.9보다 큼)를 가졌지만, 놀랍게도 부정 예시 중 어떤 것도 캐시에 히트하지 않았습니다. 이는 유사도 평가기에 사용된 모델이 이 데이터셋에 맞게 미세 조정되었고, 부정 샘플에 대한 거의 모든 유사도 점수가 과소평가되었기 때문일 가능성이 높습니다.
향후 평가
우리는 GPTCache를 OSSChat 웹사이트에 통합했으며, 현재 프로덕션 통계 수집 작업을 진행하고 있습니다. 따라서 실제 사용 사례를 포함할 다음 벤치마크 공개를 기대해 주세요.
블로그는 여기서 끝이지만, GPTCache는 이제 시작입니다
우리는 2주도 채 되지 않는 기간에 이렇게 놀라운 결과물을 구현하고 오픈 소스로 공개할 수 있었다는 점에 만족하고 있습니다. Bravo! 이제 GPTCache의 아이디어, 구현 방식, 그리고 이를 여러분의 시스템에 통합할 수 있는 수많은 아이디어를 충분히 이해하셨기를 바랍니다.
GPTCache에 대한 몇 가지 핵심 내용을 빠르게 요약해 보겠습니다:
- ChatGPT는 인상적이지만, 때로는 비용이 많이 들고 느릴 수 있습니다.
- 다른 애플리케이션과 마찬가지로, AIGC 사용 사례에서도 지역성을 확인할 수 있습니다.
- 이 지역성을 완전히 활용하려면 필요한 것은 의미론적 캐시뿐입니다.
- 의미론적 캐시를 구축하려면 쿼리 컨텍스트를 임베딩하고 벡터 데이터베이스에 저장하세요. 그런 다음 요청을 LLMs로 보내기 전에 캐시에서 유사한 쿼리를 검색하세요.
- 캐시의 용량을 관리하는 것을 잊지 마세요!
우리는 현재 GPTCache를 더 많은 LLMs 및 벡터 데이터베이스와 통합하는 작업을 진행하고 있습니다. 곧 GPTCache Bootcamp를 공개할 예정이며, 여기에서는 GPTCache를 LangChain 및 Hugging Face와 함께 사용하는 방법과 GPTCache를 멀티모달로 만들기 위한 다른 아이디어를 설명할 것입니다. 우리는 모든 기여나 제안을 환영하며, 여러분의 애플리케이션에서 GPTCache가 어떻게 도움이 되는지 보여주시기를 권장합니다!
GPTCache에 대해 더 알아보기
계속 읽기

Introducing Business Critical Plan: Enterprise-Grade Security and Compliance for Mission-Critical AI Applications
Discover Zilliz Cloud’s Business Critical Plan—offering advanced security, compliance, and uptime for mission-critical AI and vector database workloads.

Zilliz Cloud Now Available in Azure North Europe: Bringing AI-Powered Vector Search Closer to European Customers
The addition of the Azure North Europe (Ireland) region further expands our global footprint to better serve our European customers.

Balancing Precision and Performance: How Zilliz Cloud's New Parameters Help You Optimize Vector Search
Optimize vector search with Zilliz Cloud’s level and recall features to tune accuracy, balance performance, and power AI applications.



