Elasticsearch 是一个分布式、基于 REST 的搜索和分析引擎,能够执行向量搜索和词性搜索。它构建在 Apache Lucene 库之上。本笔记本展示了如何使用与
Elasticsearch 向量存储相关的功能。
设置
要使用Elasticsearch 向量搜索,您必须安装 langchain-elasticsearch 包。
凭证
设置用于与elastic-start-local 一起使用的 Elasticsearch 实例有两种主要方法:
- Elastic Cloud:Elastic Cloud 是一个托管的 Elasticsearch 服务。注册 免费试用。
- 本地安装 Elasticsearch:通过在本地运行 Elasticsearch 来开始使用。最简单的方法是使用官方的 Elasticsearch Docker 镜像。有关更多信息,请参阅 Elasticsearch Docker 文档。
本地运行 Elasticsearch
本地开发测试运行 Elasticsearch 最简单的方法是使用 start-local 脚本。此脚本使用 Docker 设置 Elasticsearch(可选地 Kibana)通过一行简单的命令。elastic-start-local 文件夹。要启动 Elasticsearch:
http://localhost:9200 上可用。elastic 用户的密码和 API 密钥将自动生成并存储在 elastic-start-local 文件夹中的 .env 文件中。
如果您只需要 Elasticsearch 而不需要 Kibana,可以使用 --esonly 选项:
start-local 设置仅用于本地测试,不应在生产环境中使用。有关生产安装,请参阅官方的 Elasticsearch 文档。
带认证运行
在生产环境中,我们建议您启用安全功能。要使用登录凭证连接,您可以使用es_api_key 或 es_user 和 es_password。
如何获取默认 “elastic” 用户的密码?
要获取默认 “elastic” 用户的 Elastic Cloud 密码:- 登录到 cloud.elastic.co 上的 Elastic Cloud 控制台
- 转到 “Security” > “Users”
- 找到 “elastic” 用户并点击 “Edit”
- 点击 “Reset password”
- 按照提示重置密码
如何获取 API 密钥?
要获取 API 密钥:- 登录到 cloud.elastic.co 上的 Elastic Cloud 控制台
- 打开 Kibana 并转到 Stack Management > API Keys
- 点击 “Create API key”
- 为 API 密钥输入一个名称并点击 “Create”
- 复制 API 密钥并将其粘贴到
api_key参数中
Elastic Cloud
要连接到 Elastic Cloud 上的 Elasticsearch 实例,您可以使用es_cloud_id 参数或 es_url。
初始化
Elasticsearch 正在本地通过 docker 在 localhost:9200 上运行。有关如何从 Elastic Cloud 连接到 Elasticsearch 的更多详细信息,请参阅上面 connecting with authentication 的内容。管理向量存储
向向量存储添加项目
从向量存储删除项目
查询向量存储
一旦您的向量存储创建完成,并且相关文档已添加,您很可能希望在链或智能体运行期间查询它。这些示例还展示了如何在搜索时使用过滤。直接查询
相似度搜索
执行简单的相似度搜索并在元数据上使用过滤可以按以下方式完成:带分数的相似度搜索
如果您想执行相似度搜索并接收相应的分数,可以运行:转换为检索器查询
您还可以将向量存储转换为检索器,以便在链中更轻松地使用。距离相似度算法
Elasticsearch 支持以下向量距离相似度算法:- cosine
- euclidean
- dot_product
检索策略
Elasticsearch 在其他仅向量数据库方面具有巨大优势,因为它支持广泛的检索策略。在本笔记本中,我们将配置ElasticsearchStore 以支持一些最常见的检索策略。
默认情况下,ElasticsearchStore 使用 DenseVectorStrategy(在 0.2.0 版本之前称为 ApproxRetrievalStrategy)。
DenseVectorStrategy
这将返回与查询向量最相似的 top k 个向量。k 参数在 ElasticsearchStore 初始化时设置。默认值是 10。
示例:使用密集向量和关键字搜索的混合检索
此示例将展示如何配置 ElasticsearchStore 以执行混合检索,使用近似语义搜索和基于关键字的搜索的组合。 我们使用 RRF 来平衡来自不同检索方法的两个分数。 要启用混合检索,我们需要在DenseVectorStrategy 构造函数中设置 hybrid=True。
示例:在 Elasticsearch 中使用嵌入模型进行密集向量搜索
此示例将展示如何配置ElasticsearchStore 以使用部署在 Elasticsearch 中的嵌入模型进行密集向量检索。
要使用此功能,请通过 query_model_id 参数在 DenseVectorStrategy 构造函数中指定 model_id。
注意:这要求模型已在 Elasticsearch ML 节点中部署并运行。有关如何使用 eland 部署模型的说明,请参阅 notebook 示例。
稀疏向量策略 (ELSER)
此策略使用 Elasticsearch 的稀疏向量检索来获取前 k 个结果。目前我们仅支持自己的 “ELSER” 嵌入模型。 注意:这要求 ELSER 模型已在 Elasticsearch ml 节点中部署并运行。 要使用此策略,请在ElasticsearchStore 构造函数中指定 SparseVectorStrategy(在 0.2.0 版本之前称为 SparseVectorRetrievalStrategy)。您需要提供一个模型 ID。
密集向量脚本评分策略
此策略使用 Elasticsearch 的脚本评分查询来执行精确向量检索(也称为暴力搜索)以获取前 k 个结果。(此策略在 0.2.0 版本之前称为ExactRetrievalStrategy。)
要使用此策略,请在 ElasticsearchStore 构造函数中指定 DenseVectorScriptScoreStrategy。
BM25 策略
最后,您可以使用全文关键词搜索。 要使用此策略,请在ElasticsearchStore 构造函数中指定 BM25Strategy。
BM25 检索策略
此策略允许用户使用纯 BM25 进行搜索,而无需向量搜索。 要使用此策略,请在ElasticsearchStore 构造函数中指定 BM25RetrievalStrategy。
请注意,在下面的示例中,未指定嵌入选项,这意味着搜索未使用嵌入进行。
自定义查询
通过搜索参数custom_query,您可以调整用于从 Elasticsearch 检索文档的查询。如果您想使用更复杂的查询或支持字段的线性加权,这很有用。
自定义文档构建器
通过搜索参数doc_builder,您可以调整使用从 Elasticsearch 检索的数据构建 Document 的方式。如果您有未使用 LangChain 创建的索引,这尤其有用。
检索增强生成 (RAG) 的使用
有关如何使用此向量存储进行检索增强生成 (RAG) 的指南,请参阅以下部分:常见问题解答
问题:我在将文档索引到 Elasticsearch 时遇到超时错误。如何解决?
一个可能的问题是您的文档可能需要更长时间才能索引到 Elasticsearch。ElasticsearchStore 使用 Elasticsearch 批量 API,该 API 具有一些默认值,您可以调整这些默认值以减少超时错误的机会。 当您使用 SparseVectorRetrievalStrategy 时,这也是一个好主意。 默认值是:chunk_size: 500max_chunk_bytes: 100MB
chunk_size 和 max_chunk_bytes 参数传递给 ElasticsearchStore 的 add_texts 方法。
升级到 ElasticsearchStore
如果您已经在基于 langchain 的项目中使用 Elasticsearch,您可能正在使用旧的实现:ElasticVectorSearch 和 ElasticKNNSearch,这些实现现已弃用。我们引入了一个新的实现称为 ElasticsearchStore,它更灵活且易于使用。此笔记本将指导您完成升级到新实现的过程。
新功能
新的实现现在是一个名为ElasticsearchStore 的类,可以通过策略用于近似密集向量、精确密集向量、稀疏向量 (ELSER)、BM25 检索和混合检索。
我正在使用 ElasticKNNSearch
我正在使用 ElasticVectorSearch
API 参考
有关所有ElasticSearchStore 功能和配置的详细文档,请访问 @[API 参考][ElasticSearchStore]。
官方原文:src/oss/python/integrations/vectorstores/elasticsearch.mdx · 非官方翻译,译文由 AI 生成,以英文原文为准。