跳到主要內容
Open In ColabOpen on GitHub

快取

嵌入可以儲存或暫時快取,以避免需要重新計算。

快取嵌入可以使用 CacheBackedEmbeddings 完成。快取支援的嵌入器是嵌入器的包裝器,可在鍵值儲存中快取嵌入。文本經過雜湊處理,雜湊值用作快取中的鍵。

初始化 CacheBackedEmbeddings 的主要支援方法是 from_bytes_store。它採用以下參數

  • underlying_embedder:用於嵌入的嵌入器。
  • document_embedding_cache:任何用於快取文件嵌入的 ByteStore
  • batch_size:(可選,預設為 None)儲存更新之間要嵌入的文件數量。
  • namespace:(可選,預設為 "")用於文件快取的命名空間。此命名空間用於避免與其他快取衝突。例如,將其設定為所用嵌入模型的名稱。
  • query_embedding_cache:(可選,預設為 None 或不快取)用於快取查詢嵌入的 ByteStore,或 True 以使用與 document_embedding_cache 相同的儲存。

注意:

  • 請務必設定 namespace 參數,以避免使用不同嵌入模型嵌入的相同文本發生衝突。
  • CacheBackedEmbeddings 預設不快取查詢嵌入。要啟用查詢快取,需要指定 query_embedding_cache
from langchain.embeddings import CacheBackedEmbeddings
API 參考文件:CacheBackedEmbeddings

與向量儲存一起使用

首先,讓我們看一個範例,該範例使用本機檔案系統儲存嵌入,並使用 FAISS 向量儲存進行檢索。

%pip install --upgrade --quiet  langchain-openai faiss-cpu
from langchain.storage import LocalFileStore
from langchain_community.document_loaders import TextLoader
from langchain_community.vectorstores import FAISS
from langchain_openai import OpenAIEmbeddings
from langchain_text_splitters import CharacterTextSplitter

underlying_embeddings = OpenAIEmbeddings()

store = LocalFileStore("./cache/")

cached_embedder = CacheBackedEmbeddings.from_bytes_store(
underlying_embeddings, store, namespace=underlying_embeddings.model
)

快取在嵌入之前是空的

list(store.yield_keys())
[]

載入文件,將其分割成區塊,嵌入每個區塊並將其載入到向量儲存中。

raw_documents = TextLoader("state_of_the_union.txt").load()
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
documents = text_splitter.split_documents(raw_documents)

建立向量儲存

%%time
db = FAISS.from_documents(documents, cached_embedder)
CPU times: user 218 ms, sys: 29.7 ms, total: 248 ms
Wall time: 1.02 s

如果我們再次嘗試建立向量儲存,它會快得多,因為它不需要重新計算任何嵌入。

%%time
db2 = FAISS.from_documents(documents, cached_embedder)
CPU times: user 15.7 ms, sys: 2.22 ms, total: 18 ms
Wall time: 17.2 ms

以下是一些已建立的嵌入

list(store.yield_keys())[:5]
['text-embedding-ada-00217a6727d-8916-54eb-b196-ec9c9d6ca472',
'text-embedding-ada-0025fc0d904-bd80-52da-95c9-441015bfb438',
'text-embedding-ada-002e4ad20ef-dfaa-5916-9459-f90c6d8e8159',
'text-embedding-ada-002ed199159-c1cd-5597-9757-f80498e8f17b',
'text-embedding-ada-0021297d37a-2bc1-5e19-bf13-6c950f075062']

交換 ByteStore

為了使用不同的 ByteStore,只需在建立 CacheBackedEmbeddings 時使用它即可。下面,我們建立一個等效的快取嵌入物件,除了使用非持久性的 InMemoryByteStore 取代

from langchain.embeddings import CacheBackedEmbeddings
from langchain.storage import InMemoryByteStore

store = InMemoryByteStore()

cached_embedder = CacheBackedEmbeddings.from_bytes_store(
underlying_embeddings, store, namespace=underlying_embeddings.model
)

此頁面是否對您有幫助?