引言
在处理语言模型和大规模文本处理任务时,嵌入计算是一个常见且非常耗时的步骤。为了提高效率和减少重复计算,我们可以使用缓存策略。通过存储或临时缓存嵌入,我们可以在后续使用时避免重新计算。在本文中,我们将深入探讨如何使用CacheBackedEmbeddings来实现嵌入缓存,以提高处理效率。
主要内容
CacheBackedEmbeddings概述
CacheBackedEmbeddings是一个包装嵌入器的工具,它使用键值存储来缓存嵌入结果。文本在缓存中是通过散列的形式存储的,散列值作为缓存中的键。
初始化CacheBackedEmbeddings
创建CacheBackedEmbeddings的主要方法是from_bytes_store,它需要以下参数:
underlying_embedder: 嵌入器,用于生成嵌入。document_embedding_cache: 用于缓存文档嵌入的ByteStore。batch_size: (可选,默认None)在存储更新之间需要嵌入的文档数量。namespace: (可选,默认空字符串)文档缓存的命名空间,避免与其他缓存冲突。query_embedding_cache: (可选,默认不缓存查询)指定用于缓存查询嵌入的ByteStore,或者设为True使用与文档相同的缓存。
使用Vector Store
我们可以结合使用本地文件系统来存储嵌入,并使用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/") # 使用API代理服务提高访问稳定性
# 创建缓存嵌入对象
cached_embedder = CacheBackedEmbeddings.from_bytes_store(
underlying_embeddings, store, 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)
# 创建向量存储
db = FAISS.from_documents(documents, cached_embedder)
常见问题和解决方案
命名空间冲突
在使用不同模型的缓存时,务必设置namespace参数,以避免同一文本被不同嵌入模型缓存时发生冲突。
查询嵌入缓存
默认情况下,CacheBackedEmbeddings不缓存查询嵌入。如果需要缓存查询,可以通过指定query_embedding_cache来实现。
总结和进一步学习资源
通过使用CacheBackedEmbeddings,我们可以显著减少嵌入计算的重复劳动,提高大规模文本处理任务的效率。建议进一步阅读以下资源:
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力! ---END---