02. Cache Penyematan (CacheBackedEmbeddings)

CacheBackedEmbeddings

Sematan(embeddings) dapat disimpan atau di-cache sementara untuk menghindari penghitungan ulang.

Penyematan dalam cache dapat dilakukan dengan menggunakan CacheBackedEmbeddings. Penyemat yang didukung cache adalah pembungkus di sekitar penyemat yang menyimpan penyematan di dalam penyimpanan pasangan kunci-nilai (key-value). Teks akan di-hash dan hash ini digunakan sebagai kunci dalam cache.

Metode utama yang didukung untuk menginisialisasi CacheBackedEmbeddings adalah from_bytes_store, yang mengambil parameter berikut

  • underlying_embeddings: Penyemat yang digunakan untuk penyematan.

  • document_embedding_cache: Salah satu ByteStores untuk menyimpan penyematan dokumen.

  • namespace: (opsional, standarnya "") namespace yang digunakan untuk menyimpan dokumen dalam cache. namespace ini digunakan untuk menghindari konflik dengan cache lain. Misalnya, setel ke nama model penyematan yang digunakan.

Perhatian: Penting untuk mengatur parameter namespace untuk menghindari konflik saat teks yang sama disematkan menggunakan model penyematan yang berbeda.

Menggunakan penyematan di LocalFileStore (penyimpanan persisten)

Pertama, mari kita lihat contoh menyimpan penyematan menggunakan sistem file lokal dan mengambilnya menggunakan penyimpanan vektor FAISS.

from langchain.storage import LocalFileStore
from langchain_openai import OpenAIEmbeddings
from langchain.embeddings import CacheBackedEmbeddings

# Menggunakan embedding OpenAI untuk membuat pengaturan embedding dasar
embedding = OpenAIEmbeddings()

# Mengatur penyimpanan file lokal
store = LocalFileStore("./cache/")

# Membuat embedding yang didukung cache
cached_embedder = CacheBackedEmbeddings.from_bytes_store(
    underlying_embeddings=embedding,
    document_embedding_cache=store,
    namespace=embedding.model,  # Membuat embedding yang didukung cache menggunakan embedding dasar dan penyimpanan
)
# Ambil kunci secara berurutan dari penyimpanan.
list(store.yield_keys())
['text-embedding-ada-0022951784e-56dc-528d-8d81-be4e65af7c64']

Muat dokumen, pisahkan menjadi beberapa bagian, lalu sematkan setiap bagian dan muat ke dalam penyimpanan vektor.

from langchain.document_loaders import TextLoader
from langchain_text_splitters import CharacterTextSplitter

# Memuat dokumen
raw_documents = TextLoader("./data/appendix-keywords.txt").load()
# Mengatur pemisahan teks berdasarkan karakter
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
# Memisahkan dokumen
documents = text_splitter.split_documents(raw_documents)
# Mengukur waktu eksekusi kode.
%time db = FAISS.from_documents(documents, cached_embedder)  # Membuat database FAISS dari dokumen
Time taken: 0.0960 seconds

Apabila Anda mencoba membuat ulang penyimpanan vektor, ini jauh lebih cepat, karena Anda tidak perlu menghitung ulang penyematan.

# Membuat database FAISS menggunakan embedding yang di-cache
%time db2 = FAISS.from_documents(documents, cached_embedder)
Time taken: 0.0016 seconds

Menggunakan InmemoryByteStore (tidak permanen)

Jika Anda ingin menggunakan ByteStore yang berbeda, Anda bisa menggunakan ByteStore tersebut saat membuat CacheBackedEmbeddings.

Di bawah ini, kami menunjukkan contoh penggunaan InMemoryByteStore yang tidak permanen untuk menghasilkan objek penyematan yang di-cache yang sama.

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

store = InMemoryByteStore() # Membuat penyimpanan byte dalam memori

# Membuat embedding yang didukung cache
cache_embedder = CacheBackedEmbeddings.from_bytes_store(
    embedding, store, namespace=embedding.model
)

Last updated