1.概述
傳統應用開發中,爲了提升系統的查詢性能,往往會在系統架構設計中加入緩存機制。在AI大模型領域,雖然功能非常強大,但是使用成本也是非常昂貴的,比如OpenAI的GPT-4按照token的個數來計算費用。那麼,在這種情況下是否有一種方案來解決呢?既能降低使用LLM API的成本,也能同時提升調用LLM API的效率和性能。GPTCache的出現,專門解決了這類痛點,對於大語言模型的對話場景,沒有必要每次都去調用LLM的API,完全可以通過緩存調用一次即可,大大節省使用成本。本篇博客,筆者將爲大家介紹GPTCache的相關內容。
2.內容
GPTCache 是一款高效的開源緩存解決方案,專爲提升基於 GPT 的應用程序性能而設計。它通過語義緩存技術,有效存儲語言模型的生成響應,從而加速應用程序的響應速度和整體效率。作爲一個靈活的 LLM 緩存層,GPTCache 提供了高度可定製的緩存選項,允許用戶根據特定需求調整嵌入函數、相似性評估機制、數據存儲位置以及緩存驅逐策略。目前,GPTCache 支持與 OpenAI ChatGPT 和 LangChain 接口的集成,擴展了其在多種應用場景下的適用性。
2.1 爲什麼使用 GPTCache?
使用語義緩存來存儲 LLM 響應的好處如下:
-
提升性能:將 LLM 響應存儲在緩存中可以顯著減少檢索響應所需的時間。如果之前的請求已經存儲在緩存中,能夠更大幅度地降低響應時間,提高應用程序的整體性能;
- 節省開銷:大多數LLM服務根據請求次數和 令牌數 的組合收費。緩存 LLM 響應可以減少對服務 API 的調用次數,從而節省成本。尤其是在高流量場景下,緩存尤爲重要。如果不使用語義緩存,可能會多次調用 API,產生極高的費用;
-
提高可擴展性:緩存 LLM 響應可以通過降低 LLM 服務的負載來提高整體應用的可擴展性。語義緩存有助於避免系統瓶頸,確保應用可以處理更多請求;
- 降低開發成:語義緩存工具能夠減少大語言模型應用的開發成本。開發過程中需要連接大語言模型的 API,因此成本可能會十分高昂。GPTCache 界面與大語言模型 API 相同,可存儲模型生成數據。使用 GPTCache 無需再連接至大語言模型 API,從而降低成本;
- 降低網絡延遲:語義緩存更靠近客戶端,可以減少從 LLM 服務檢索數據所需的時間。降低網絡延遲能有效提升用戶的整體體驗;
- 提升可用性:LLM 服務頻繁限制用戶或客戶端在特定時間段內訪問服務器的頻次。觸達訪問速率上限時,請求會被屏蔽。用戶不得不等待一段時間後纔可以繼續訪問服務器,這種限制會導致服務中斷。使用 GPTCache 後,您可以根據應用用戶數量和查詢量靈活快速擴展,保障服務可用性和性能。
總的來說,開發用於存儲LLM響應的語義緩存可以提供多種好處,包括性能改進、降低成本、更好的可伸縮性、自定義性和降低網絡延遲。
2.2 GPTCache 的工作原理
GPTCache 通過捕捉在線服務數據的局部性特徵,對頻繁使用的數據進行存儲,從而顯著減少檢索延遲並緩解後端服務器的壓力。區別於傳統的緩存解決方案,GPTCache 實現了先進的語義緩存機制,能夠識別並保留高度相似或緊密相關的查詢,大幅提升緩存的命中率。
該工具運用 embedding 技術將用戶的問題轉換爲向量形式,並藉助向量數據庫執行相似性查詢,以便從緩存中快速提取相關響應。GPTCache 的模塊化架構設計爲用戶提供了極大的靈活性,使得每個組件都可以根據用戶的具體需求進行個性化配置。
儘管語義緩存在某些情況下可能會產生誤報(false positives)或漏報(false negatives),GPTCache 設計了三種性能評估指標,協助開發者對緩存系統進行細緻的調優。
通過這一高效流程,GPTCache 能夠有效地在緩存中定位並提取出與用戶查詢相似或相關的信息,如流程圖所示:
2.3 什麼是語義緩存
GPTCache 的模塊化架構提供了靈活性和可定製性,使用戶能夠根據特定的應用需求和場景,輕鬆構建和調整個性化的語義緩存解決方案。每個組件都配備了多樣的配置選項,確保用戶能夠精準地實現其緩存策略,以適應不同的業務挑戰和技術環境。
1.大語言模型適配器(LLM Adapter)
適配器將大語言模型請求轉換爲緩存協議,並將緩存結果轉換爲 LLM 響應。適配器方便輕鬆集成所有大語言模型,並可靈活擴展。GPTCache 支持多種大語言模型,包括:
- OpenAI ChatGPT API
- langchain
- Minigpt4
- Llamacpp
- dolly
- 後續將支持:Hugging Face Hub、Bard、Anthropic 等
2.預處理器(Pre-Processor)
預處理器管理、分析請求,並在將請求發送至 LLM 前調整請求格式,具體包括:移除輸入種冗餘的信息、壓縮輸入信息、切分長文本、執行其他相關任務等。
3.向量生成器(Embedding Generator)
Embedding 生成器將用戶查詢的問題轉化爲 embedding 向量,便於後續的向量相似性檢索。GPTCache 支持多種模型,包括:
- OpenAI embedding API
- ONNX(GPTCache/paraphrase-albert-onnx 模型)
- Hugging Face embedding API
- Cohere embedding API
- fastText embedding API
- SentenceTransformers embedding API
- Timm 模型庫中的圖像模型
4.緩存存儲(Cache Store)
GPTCache 將 LLM 響應存儲在各種數據庫管理系統中。GPTCache 支持豐富的緩存存儲數據庫,用戶可根據性能、可擴展性需求和成本預算,靈活選擇最適合的數據庫。GPTCache 支持多個熱門數據庫,包括:
- SQLite
- PostgreSQL
- MySQL
- MariaDB
- SQL Server
- Oracle
5.向量存儲(Vector Store)
向量存儲模塊會根據輸入請求的 embedding 查找 top-K 最相似的請求。簡而言之,該模塊用於評估請求之間的相似性。GPTCache 的界面十分友好,提供豐富的向量存儲數據庫。選擇不同的向量數據庫會影響相似性檢索的效率和準確性。GPTCache 支持多個向量數據庫,包括:
- Milvus
- Zilliz Cloud
- Milvus Lite
- Hnswlib
- PGVector
- Chroma
- DocArray
- FAISS
6.逐出策略(Eviction Policy)
管理:控制緩存存儲和向量存儲模塊的操作。緩存滿了之後,緩存替換機制會決定淘汰哪些數據,爲新數據騰出空間。GPTCache 目前支持以下兩種標準逐出策略:
- “最近最少使用”逐出策略(Least Recently Used,LRU)
-
“先進先出”逐出策略(First In First Out,FIFO)
7.相似性評估器(Similarity Evaluator)
GPTCache 中的相似性評估模塊從 Cache Storage 和 Vector Store 中收集數據,並使用各種策略來確定輸入請求與來自 Vector Store 的請求之間的相似性。該模塊用於確定某一請求是否與緩存匹配。GPTCache 提供標準化接口,集成各種相似性計算方式。多樣的的相似性計算方式能狗靈活滿足不同的需求和應用場景。GPTCache 根據其他用例和需求提供靈活性。
8.後處理器(Post-Processor)
後處理器負責在返回響應前處理最終響應。如果沒有命中緩存中存儲的數據,大語言模型適配器會從 LLM 請求響應並將響應寫入緩存存儲中。
3.案例實踐
接下來,筆者將介紹學習如何有效地使用 GPT 聊天功能。雖然原始示例基於 OpenAI 的演示,但我們的重點是教授如何通過 GPTCache 來緩存精確和相似的響應,這一過程異常簡潔。您只需遵循幾個簡單的初始化緩存的步驟即可。
在開始之前,請確保您已經通過設置環境變量 OPENAI_API_KEY 來配置您的 OpenAI API 密鑰。如果您還未進行設置,根據您的操作系統(MacOS/Linux或 Windows),可以通過以下命令進行設置:
對於 MacOS/Linux 系統:
export OPENAI_API_KEY=YOUR_API_KEY
完成這些步驟後,您可以通過以下代碼示例來體驗 GPTCache 的應用和加速效果。我們將展示三個部分:使用 OpenAI 的原始方式、進行精確搜索以及執行相似搜索。
1.使用 OpenAI 的原始方式
實現代碼如下所示:
import time from openai import ChatCompletion def format_response(openai_response): return openai_response['choices'][0]['message']['content'] # 定義問題 question = 'what’s github' # 使用 OpenAI API 獲取響應 start_time = time.time() response = ChatCompletion.create( model='gpt-4-0125-preview', messages=[{'role': 'user', 'content': question}] ) # 打印問題和響應 print(f"Question: {question}") print(f"Time consuming: {time.time() - start_time:.2f}s") print(f"Answer: {format_response(response)}\n")
2.精確搜索
爲了啓動 GPTCache 並優化性能,您需要進行適當的初始化。這包括從 gptcache.adapter 導入 openai 模塊,這樣會自動配置數據管理器以便於精確地匹配和檢索緩存數據。有關如何構建和定製您自己的緩存系統的更多信息,請參考 GPTCache 的構建指南。
當您向 ChatGPT 提出兩個完全相同的問題時,GPTCache 將確保第二個問題的答案直接從緩存中獲取,避免了對 ChatGPT 的重複請求,從而提高了響應速度和效率。實現代碼如下所示:
import time from gptcache import cache from gptcache.adapter import openai # 初始化 GPTCache cache.init() cache.set_openai_key() def get_response_text(response): return response['choices'][0]['message']['content'] print("Cache loading.....") question = "what's github" for _ in range(2): start_time = time.time() response = openai.ChatCompletion.create( model='gpt-4-0125-preview', messages=[ {'role': 'user', 'content': question} ] ) print(f'Question: {question}') print(f"Time consuming: {time.time() - start_time:.2f}s") print(f'Answer: {get_response_text(response)}\n')
3.相似搜索
爲了配置 GPTCache 以提高效率和性能,您需要定義幾個關鍵組件:embedding_func 用於生成文本的嵌入表示,data_manager 負責管理緩存中的數據,以及 similarity_evaluation 用於評估不同文本之間的相似性。這些組件的具體設置和優化方法,詳見“構建您的緩存”部分的詳細指南。
當您使用 ChatGPT 回答一系列相關的問題後,GPTCache 能夠根據之前的交互從緩存中提取答案,這樣對於後續的相似問題,就無需再次向 ChatGPT 發起請求,從而減少了延遲並提高了響應速度。實現代碼如下所示:
import time from gptcache import cache, get_data_manager from gptcache.adapter import openai from gptcache.embedding import Onnx from gptcache.similarity_evaluation.distance import SearchDistanceEvaluation from gptcache.manager import CacheBase, VectorBase # 初始化 GPTCache onnx = Onnx() data_manager = get_data_manager(CacheBase("sqlite"), VectorBase("faiss", dimension=onnx.dimension)) cache.init( embedding_func=onnx.to_embeddings, data_manager=data_manager, similarity_evaluation=SearchDistanceEvaluation() ) cache.set_openai_key() def get_response_text(response): return response['choices'][0]['message']['content'] print("Cache loading.....") questions = [ "what's github", "can you explain what GitHub is", "can you tell me more about GitHub", "what is the purpose of GitHub" ] for question in questions: start_time = time.time() response = openai.ChatCompletion.create( model='gpt-4-0125-preview', messages=[{'role': 'user', 'content': question}] ) print(f'Question: {question}') print(f"Time consuming: {time.time() - start_time:.2f}s") print(f'Answer: {get_response_text(response)}\n')
4.GPTCache server
GPTCache 目前具備了構建服務器的能力,該服務器不僅支持緩存功能,還能進行對話交互。通過簡單的幾行代碼,用戶便能夠啓動一個個性化的 GPTCache 服務實例。以下是一個簡潔的示例,演示瞭如何搭建 GPTCache 服務器以及如何與其進行交互操作。
# 安裝和啓動服務 $ gptcache_server -s 127.0.0.1 -p 8000 # 用doker啓動服務 $ docker pull zilliz/gptcache:latest $ docker run -p 8000:8000 -it zilliz/gptcache:latest
1.命令行交互
# 寫數據到 GPTCache curl -X 'POST' \ 'http://localhost:8000/put' \ -H 'accept: application/json' \ -H 'Content-Type: application/json' \ -d '{ "prompt": "Hi", "answer": "Hi welcome" }'
# 從 GPTCache 中讀數據 curl -X 'POST' \ 'http://localhost:8000/get' \ -H 'accept: application/json' \ -H 'Content-Type: application/json' \ -d '{ "prompt": "Hi" }'
2.Python實現
>>> from gptcache.client import Client >>> client = Client(uri="http://localhost:8000") >>> client.put("Hi", "Hi welcome") 200 >>> client.get("Hi") 'Hi welcome'
5.總結
GPTCache 是一個爲基於 GPT 的應用程序設計的高性能緩存解決方案,它利用語義緩存技術來存儲和快速檢索語言模型的輸出。通過模塊化設計,GPTCache 支持個性化配置,允許用戶根據需求選擇嵌入函數、相似性評估方法和數據存儲選項。它不僅提高了響應速度,減少了對原始數據源的請求,還通過智能緩存機制優化了服務器負載。此外,GPTCache 支持構建對話服務器,簡化了與大型語言模型的集成和交互,爲用戶提供了更加流暢和智能的體驗。