🦜️🔗LangChain : モジュール : 検索 – テキスト埋め込みモデル : キャッシュ (翻訳/解説)
翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 09/05/2023
* 本ページは、LangChain の以下のドキュメントを翻訳した上で適宜、補足説明したものです:
* サンプルコードの動作確認はしておりますが、必要な場合には適宜、追加改変しています。
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。
- 人工知能研究開発支援
- 人工知能研修サービス(経営者層向けオンサイト研修)
- テクニカルコンサルティングサービス
- 実証実験(プロトタイプ構築)
- アプリケーションへの実装
- 人工知能研修サービス
- PoC(概念実証)を失敗させないための支援
- お住まいの地域に関係なく Web ブラウザからご参加頂けます。事前登録 が必要ですのでご注意ください。
◆ お問合せ : 本件に関するお問い合わせ先は下記までお願いいたします。
- 株式会社クラスキャット セールス・マーケティング本部 セールス・インフォメーション
- sales-info@classcat.com ; Web: www.classcat.com ; ClassCatJP
🦜️🔗 LangChain : モジュール : 検索 – テキスト埋め込みモデル : キャッシュ
埋め込みは、それらを再計算する必要性を避けるためにストアしたり一時的にキャッシュすることができます。
埋め込みのキャッシュは CacheBackedEmbeddings を使用して行なうことができます。キャッシュ backed embedder は embedder のラッパーで、キーバリュー・ストアに埋め込みをキャッシュします。テキストはハッシュ化され、ハッシュはキャッシュのキーとして使用されます。
CacheBackedEmbeddings を初期化するためにサポートされる主要な方法は from_bytes_store です。これは以下のパラメータを受け取ります :
- underlying_embedder: 埋め込みのために使用する embedder。
- document_embedding_cache: ドキュメント埋め込みをストアするために使用するキャッシュ。
- namespace: (オプション, デフォルトは “”) ドキュメントのキャッシュに使用する名前空間。この名前空間は他のキャッシュとの衝突を回避するために使用されます。例えば、それを使用される埋め込みモデルの名前に設定します。
Attention: 別の埋め込みモデルを使用して埋め込まれた同じテキストの衝突を回避するために namespace パラメータを必ず設定してください。
from langchain.storage import InMemoryStore, LocalFileStore, RedisStore
from langchain.embeddings import OpenAIEmbeddings, CacheBackedEmbeddings
API リファレンス :
ベクトルストアで使用する
最初に、埋め込みをストアするためにローカルのファイルシステムを使用して、検索取得に 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 リファレンス :
underlying_embeddings = OpenAIEmbeddings()
fs = LocalFileStore("./cache/")
cached_embedder = CacheBackedEmbeddings.from_bytes_store(
underlying_embeddings, fs, namespace=underlying_embeddings.model
)
キャッシュは埋め込みの前は空です :
list(fs.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)
ベクトルストアを作成します :
db = FAISS.from_documents(documents, cached_embedder)
CPU times: user 608 ms, sys: 58.9 ms, total: 667 ms Wall time: 1.3 s
ベクトルストアを再度作成しようとすると、それは埋め込みを再計算する必要がないので遥かに高速です。
db2 = FAISS.from_documents(documents, cached_embedder)
CPU times: user 33.6 ms, sys: 3.96 ms, total: 37.6 ms Wall time: 36.8 ms
And here are some of the embeddings that got created:
list(fs.yield_keys())[:5]
['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']
In Memory
このセクションは埋め込みのためにインメモリ・キャッシュをセットアップする方法を紹介します。このタイプのキャッシュはユニットテストやプロトタイピングのために主として役立ちます。実際に埋め込みをストアする必要がある場合にはこのキャッシュは使用しないでください。
store = InMemoryStore()
underlying_embeddings = OpenAIEmbeddings()
embedder = CacheBackedEmbeddings.from_bytes_store(
underlying_embeddings, store, namespace=underlying_embeddings.model
)
embeddings = embedder.embed_documents(["hello", "goodbye"])
CPU times: user 10.9 ms, sys: 916 µs, total: 11.8 ms Wall time: 159 ms
2 回目に埋め込もうとすると埋め込み時間はわずか 2 ms です、埋め込みはキャッシュ内で検索されるからです。
embeddings_from_cache = embedder.embed_documents(["hello", "goodbye"])
CPU times: user 1.67 ms, sys: 342 µs, total: 2.01 ms Wall time: 2.01 ms
embeddings == embeddings_from_cache
True
ファイルシステム
このセクションはファイルシステム・ストアを使用する方法をカバーします。
fs = LocalFileStore("./test_cache/")
embedder2 = CacheBackedEmbeddings.from_bytes_store(
underlying_embeddings, fs, namespace=underlying_embeddings.model
)
embeddings = embedder2.embed_documents(["hello", "goodbye"])
CPU times: user 6.89 ms, sys: 4.89 ms, total: 11.8 ms Wall time: 184 ms
embeddings = embedder2.embed_documents(["hello", "goodbye"])
CPU times: user 0 ns, sys: 3.24 ms, total: 3.24 ms Wall time: 2.84 ms
ここにディレクトリ ./test_cache に永続化された埋め込みがあります。
embedder は namespace パラメータを受け取ることに注意してください。
list(fs.yield_keys())
['text-embedding-ada-002e885db5b-c0bd-5fbc-88b1-4d1da6020aa5', 'text-embedding-ada-0026ba52e44-59c9-5cc9-a084-284061b13c80']
Redis ストア
from langchain.storage import RedisStore
API リファレンス :
# 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"])
CPU times: user 3.99 ms, sys: 0 ns, total: 3.99 ms Wall time: 3.5 ms
embeddings = embedder.embed_documents(["hello", "goodbye"])
CPU times: user 2.47 ms, sys: 767 µs, total: 3.24 ms Wall time: 2.75 ms
list(store.yield_keys())
['text-embedding-ada-002e885db5b-c0bd-5fbc-88b1-4d1da6020aa5', 'text-embedding-ada-0026ba52e44-59c9-5cc9-a084-284061b13c80']
list(store.client.scan_iter())
[b'embedding_caches/text-embedding-ada-002e885db5b-c0bd-5fbc-88b1-4d1da6020aa5', b'embedding_caches/text-embedding-ada-0026ba52e44-59c9-5cc9-a084-284061b13c80']
以上