利用缓存提升Embeddings生成效率

老铁们,今天咱们聊聊如何通过缓存技术来提升Embeddings的生成效率。说白了,我们的目标就是减少重复计算的工作量,让系统运行得更丝滑。特别是在处理大批量文本数据的时候,缓存显得尤为重要。

技术背景介绍

在自然语言处理和机器学习的任务中,Embeddings是将文本转换为数值向量以便于机器理解的关键环节。有时候,我们需要对相同的文本多次生成Embeddings,如果每次都重新计算,会浪费大量的计算资源。这时候,使用缓存技术就能显著提升效率。

原理深度解析

我们可以借助于CacheBackedEmbeddings来实现Embeddings的缓存。它是一个包装类,内置了一个键-值存储(Key-Value Store)来缓存结果。其原理很简单:把要处理的文本做个哈希处理,然后根据这个哈希值去缓存中查找是否已存在对应的Embeddings,如果存在就读取缓存,否则才进行计算。

实战代码演示

下面我就通过一个实战例子来演示如何使用这个技术。我们会用CacheBackedEmbeddings结合一个本地文件系统的向量存储机制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
)

在加载文档和生成向量存储之前,缓存是空的:

list(store.yield_keys())
# Output: []

加载文档、拆分、嵌入并存储:

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)

查看缓存的部分内容:

list(store.yield_keys())[:5]

优化建议分享

这里有个小建议,建议大家设置namespace参数以避免与其他模型的缓存冲突。此外,如果你需要缓存查询的Embeddings,也记得配置query_embedding_cache

补充说明和总结

对于需要简易内存缓存的情况,可以使用InMemoryByteStore替代:

from langchain.embeddings import CacheBackedEmbeddings
from langchain.storage import InMemoryByteStore

store = InMemoryByteStore()

cached_embedder = CacheBackedEmbeddings.from_bytes_store(
    underlying_embeddings, store, namespace=underlying_embeddings.model
)

今天的技术分享就到这里,希望对大家有帮助。开发过程中遇到问题也可以在评论区交流~

—END—

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值