高效重用:通过缓存嵌入提升AI应用性能

102 阅读2分钟

高效重用:通过缓存嵌入提升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])

常见问题和解决方案

  1. 命名空间冲突: 设置不同的 namespace 参数以避免嵌入模型之间的缓存冲突。
  2. 查询嵌入未缓存: 默认情况下,CacheBackedEmbeddings 不缓存查询;需手动指定 query_embedding_cache

总结和进一步学习资源

通过缓存嵌入,我们能有效减少重复计算,提高系统性能。可以探索以下资源以获得更多理解:

参考资料

  • Langchain Documentation
  • OpenAI Documentation
  • FAISS Documentation

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

---END---