老铁们,今天咱们聊聊如何通过缓存技术来提升Embeddings的生成效率。说白了,我们的目标就是减少重复计算的工作量,让系统运行得更丝滑。特别是在处理大批量文本数据的时候,缓存显得尤为重要。
技术背景介绍
在自然语言处理和机器学习的任务中,Embeddings是将文本转换为数值向量以便于机器理解的关键环节。有时候,我们需要对相同的文本多次生成Embeddings,如果每次都重新计算,会浪费大量的计算资源。这时候,使用缓存技术就能显著提升效率。
原理深度解析
我们可以借助于CacheBackedEmbeddings来实现Embeddings的缓存。它是一个包装类,内置了一个键-值存储(Key-Value Store)来缓存结果。其原理很简单:把要处理的文本做个哈希处理,然后根据这个哈希值去缓存中查找是否已存在对应的Embeddings,如果存在就读取缓存,否则才进行计算。
实战代码演示
下面我就通过一个实战例子来演示如何使用这个技术。我们会用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())
# Output: []
加载文档、拆分、嵌入并存储:
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)
再次创建时,速度更快:
%%time
db2 = FAISS.from_documents(documents, cached_embedder)
查看缓存的部分内容:
list(store.yield_keys())[:5]
优化建议分享
这里有个小建议,建议大家设置namespace参数以避免与其他模型的缓存冲突。此外,如果你需要缓存查询的Embeddings,也记得配置query_embedding_cache。
补充说明和总结
对于需要简易内存缓存的情况,可以使用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
)
今天的技术分享就到这里,希望对大家有帮助。开发过程中遇到问题也可以在评论区交流~
—END—
32

被折叠的 条评论
为什么被折叠?



