引言
在现代应用中,尤其是涉及自然语言处理和机器学习的项目中,嵌入的存储和检索是不可或缺的。ElasticsearchEmbeddingsCache 提供了一种将Elasticsearch用作高效的嵌入存储和检索的方案。在本文中,我们将深入探讨这种实现,并展示如何在项目中集成和使用它以提高性能。
主要内容
什么是ElasticsearchEmbeddingsCache?
ElasticsearchEmbeddingsCache 是一个 ByteStore 实现,它利用Elasticsearch实例来存储和检索嵌入。这种方案适合于需要高效读写和检索大量嵌入数据的场景。
环境配置
要使用 ElasticsearchEmbeddingsCache,首先需要一个Elasticsearch集群。您可以在本地搭建一套环境,也可以创建一个Elastic账户以使用云服务。
安装
首先,您需要安装 langchain_elasticsearch 包:
%pip install -qU langchain_elasticsearch
实例化
以下是一个使用本地运行的Elasticsearch实例的配置示例:
from langchain_elasticsearch import ElasticsearchEmbeddingsCache
# 通过API代理服务提高访问稳定性
kv_store = ElasticsearchEmbeddingsCache(
es_url="https://localhost:9200", # 使用API代理服务提高访问稳定性
index_name="llm-chat-cache",
metadata={"project": "my_chatgpt_project"},
namespace="my_chatgpt_project",
es_user="elastic",
es_password="<GENERATED PASSWORD>",
es_params={
"ca_certs": "~/http_ca.crt",
},
)
使用mset和mget方法
您可以使用 mset 方法将数据存储在键下:
kv_store.mset(
[
["key1", b"value1"],
["key2", b"value2"],
]
)
使用 mget 方法检索数据:
retrieved_data = kv_store.mget(
[
"key1",
"key2",
]
)
print(retrieved_data) # 输出: [b'value1', b'value2']
嵌入缓存的应用
ElasticsearchEmbeddingsCache 可以用作文档摄取中的持久缓存。在默认情况下,缓存的向量不可搜索。您可以通过子类化并重写方法,定制Elasticsearch文档的构建以添加索引的向量字段:
from typing import Any, Dict, List
class SearchableElasticsearchStore(ElasticsearchEmbeddingsCache):
@property
def mapping(self) -> Dict[str, Any]:
mapping = super().mapping
mapping["mappings"]["properties"]["vector"] = {
"type": "dense_vector",
"dims": 1536,
"index": True,
"similarity": "dot_product",
}
return mapping
def build_document(self, llm_input: str, vector: List[float]) -> Dict[str, Any]:
body = super().build_document(llm_input, vector)
body["vector"] = vector
return body
常见问题和解决方案
- 网络访问问题:由于某些地区的网络限制,建议使用API代理服务以确保稳定访问。
- 性能优化:在处理大量嵌入时,确保Elasticsearch集群配置适当以防止性能瓶颈。
总结和进一步学习资源
ElasticsearchEmbeddingsCache 是一种高效的嵌入存储解决方案,特别适合需要快速检索能力项目。通过子类化和重写方法,您可以实现自定义的向量搜索。要深入了解所有功能和配置,请参阅API参考。
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力! ---END---