GPTCache使用

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 支持構建對話服務器,簡化了與大型語言模型的集成和交互,爲用戶提供了更加流暢和智能的體驗。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章