缓存嵌入:提升文本处理效率的实用策略

81 阅读2分钟

缓存嵌入:提升文本处理效率的实用策略

在大规模文本处理和自然语言处理应用中,嵌入(embeddings)是一个关键的组成部分。计算嵌入通常需要大量的计算资源,因此频繁重复计算相同数据的嵌入会导致效率低下。这篇文章将探讨如何通过缓存嵌入来提高效率,并详细介绍如何使用CacheBackedEmbeddings来实现这一点。

缓存嵌入的原理

缓存嵌入的基本概念是将计算得到的嵌入结果存储在一个键值存储中,以避免重复计算。CacheBackedEmbeddings是一个包装器,用于缓存这些嵌入,并通过哈希文本作为键在缓存中进行存取。

初始化CacheBackedEmbeddings

创建一个CacheBackedEmbeddings对象可以通过from_bytes_store方法实现,参数包括:

  • underlying_embedder:用于生成嵌入的具体嵌入器。
  • document_embedding_cache:用于缓存文档嵌入的ByteStore
  • batch_size:批量处理文档的大小。
  • namespace:用于文档缓存的命名空间,避免与其他缓存冲突。
  • query_embedding_cache:用于缓存查询嵌入的ByteStore

重要注意事项:设置namespace参数以避免相同文本使用不同嵌入模型产生的冲突。

使用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
)

# 查看缓存中的键(初始为空)
print(list(store.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)

# 再次创建向量存储(此时速度应更快)
db2 = FAISS.from_documents(documents, cached_embedder)

# 查看一些已创建的嵌入
print(list(store.yield_keys())[:5])

常见问题和解决方案

  1. 缓存命名空间冲突:确保每种嵌入模型都有独立的namespace以避免冲突。
  2. 查询嵌入不缓存:默认情况下不缓存查询嵌入,需要显式设置query_embedding_cache

总结和进一步学习资源

缓存嵌入可以显著提升文本处理应用中的性能,尤其是在反复处理相同数据集时。了解并正确使用CacheBackedEmbeddings可以帮助你更高效地管理嵌入缓存。

参考资料

如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力! ---END---