Caching¶
嵌入可以被儲存或臨時快取以避免需要重新計算它們。
Caching embeddings 可以使用 CacheBackedEmbeddings
來完成。支援快取的嵌入器是嵌入器的包裝器,它將嵌入緩存在鍵值儲存中。對文字進行哈希處理,並將哈希值用作快取中的鍵值(key)。
初始化 CacheBackedEmbeddings
的主要支援方式是 from_bytes_store
。這需要以下參數:
underlying_embedder
: 用於嵌入的嵌入器。document_embedding_cache
: 用於儲存文件嵌入的快取。namespace
: (optional,預設為""
)用於文件快取的命名空間。此命名空間用於避免與其他快取發生衝突。例如,將其設定為所使用的嵌入模型的名稱。
Tip
注意:請務必設定 namespace
參數,以避免使用不同嵌入模型嵌入的相同文字發生衝突。
from langchain.storage import InMemoryStore, LocalFileStore, RedisStore
from langchain.embeddings import OpenAIEmbeddings, CacheBackedEmbeddings
API Reference:
與 vector store 一起使用¶
首先,讓我們看一個使用本機檔案系統儲存嵌入並使用 FAISS 向量儲存進行檢索的範例。
from langchain.document_loaders import TextLoader
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.text_splitter import CharacterTextSplitter
from langchain.vectorstores import FAISS
API Reference:
underlying_embeddings = OpenAIEmbeddings()
fs = LocalFileStore("./cache/")
cached_embedder = CacheBackedEmbeddings.from_bytes_store(
underlying_embeddings, fs, namespace=underlying_embeddings.model
)
嵌入之前緩存為空:
結果:
載入文檔,將其分割成區塊,嵌入每個區塊並將其載入到向量儲存中。
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)
建立向量儲存:
結果:
如果我們嘗試再次建立向量存儲,它會快得多,因為它不需要重新計算任何嵌入。
結果:
以下是創建的一些嵌入(embeddings):
結果:
['text-embedding-ada-002614d7cf6-46f1-52fa-9d3a-740c39e7a20e',
'text-embedding-ada-0020fc1ede2-407a-5e14-8f8f-5642214263f5',
'text-embedding-ada-002e4ad20ef-dfaa-5916-9459-f90c6d8e8159',
'text-embedding-ada-002a5ef11e4-0474-5725-8d80-81c91943b37f',
'text-embedding-ada-00281426526-23fe-58be-9e84-6c7c72c8ca9a']
記憶體快取¶
本節介紹如何為嵌入設定記憶體快取。這種類型的快取主要用於單元測試或原型設計。如果您需要實際儲存嵌入,請勿使用此快取。
store = InMemoryStore()
underlying_embeddings = OpenAIEmbeddings()
embedder = CacheBackedEmbeddings.from_bytes_store(
underlying_embeddings, store, namespace=underlying_embeddings.model
)
embeddings = embedder.embed_documents(["hello", "goodbye"])
結果:
第二次我們嘗試嵌入時,嵌入時間僅為 2 毫秒,因為嵌入是在快取中尋找的。
結果:
結果:
檔案系統¶
本節介紹如何使用檔案系統儲存。
fs = LocalFileStore("./test_cache/")
embedder2 = CacheBackedEmbeddings.from_bytes_store(
underlying_embeddings, fs, namespace=underlying_embeddings.model
)
embeddings = embedder2.embed_documents(["hello", "goodbye"])
結果:
以下是已儲存到目錄 ./test_cache
的嵌入。
請注意,嵌入器採用 namespace
參數。
結果:
['text-embedding-ada-002e885db5b-c0bd-5fbc-88b1-4d1da6020aa5',
'text-embedding-ada-0026ba52e44-59c9-5cc9-a084-284061b13c80']
Redis Store¶
API Reference:
# For cache isolation can use a separate DB
# Or additional namepace
store = RedisStore(redis_url="redis://localhost:6379", client_kwargs={'db': 2}, namespace='embedding_caches')
underlying_embeddings = OpenAIEmbeddings()
embedder = CacheBackedEmbeddings.from_bytes_store(
underlying_embeddings, store, namespace=underlying_embeddings.model
)
embeddings = embedder.embed_documents(["hello", "goodbye"])
結果:
結果:
結果:
['text-embedding-ada-002e885db5b-c0bd-5fbc-88b1-4d1da6020aa5',
'text-embedding-ada-0026ba52e44-59c9-5cc9-a084-284061b13c80']
結果: