高效重用:通过缓存嵌入提升AI应用性能
在深度学习和自然语言处理的应用中,嵌入(Embeddings)扮演着至关重要的角色。然而,重新计算嵌入可能会耗费大量的计算资源和时间。这篇文章将向您介绍如何利用 CacheBackedEmbeddings 来缓存嵌入,从而提高AI应用的性能和效率。
引言
嵌入是对数据(如文本、图像等)的低维度表示形式,常用于机器学习模型的输入。为了提高嵌入的重用性和访问速度,我们可以将其存储或暂时缓存。这不仅减少了算力消耗,还提升了模型的响应能力。
缓存嵌入的基础
CacheBackedEmbeddings 是一款方便的工具,它将嵌入缓存到键值存储中,从而避免重复计算。文本被哈希处理并用作缓存中的键。
初始化参数
underlying_embedder: 用于生成嵌入的底层工具。document_embedding_cache: 用于缓存文档嵌入的ByteStore。batch_size: (可选,默认None)在更新存储之间嵌入的文档数。namespace: (可选,默认"")用于文档缓存的命名空间。它避免了不同嵌入模型的缓存冲突。query_embedding_cache: (可选,不缓存或使用document_embedding_cache)为查询嵌入提供缓存。
代码示例
下面的示例展示了如何使用本地文件系统存储嵌入,并利用 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)
# 创建向量存储
%%time
db = FAISS.from_documents(documents, cached_embedder)
# 再次创建向量存储会更快
%%time
db2 = FAISS.from_documents(documents, cached_embedder)
# 显示创建的嵌入
print(list(store.yield_keys())[:5])
常见问题和解决方案
- 命名空间冲突: 设置不同的
namespace参数以避免嵌入模型之间的缓存冲突。 - 查询嵌入未缓存: 默认情况下,
CacheBackedEmbeddings不缓存查询;需手动指定query_embedding_cache。
总结和进一步学习资源
通过缓存嵌入,我们能有效减少重复计算,提高系统性能。可以探索以下资源以获得更多理解:
参考资料
- Langchain Documentation
- OpenAI Documentation
- FAISS Documentation
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---