Skip to main content
Elasticsearch 是一个分布式、RESTful 的搜索和分析引擎,能够执行向量搜索和词法搜索。它构建在 Apache Lucene 库之上。
本笔记本展示了如何使用与 Elasticsearch 向量存储相关的功能。

设置

要使用 Elasticsearch 向量搜索,您必须安装 langchain-elasticsearch 包。

凭证

设置 Elasticsearch 实例以供使用主要有两种方式:
  1. Elastic Cloud:Elastic Cloud 是一个托管的 Elasticsearch 服务。注册 免费试用 要连接到一个不需要登录凭证的 Elasticsearch 实例(使用启用安全性的 docker 实例启动),请将 Elasticsearch URL 和索引名称以及嵌入对象传递给构造函数。
  2. 本地安装 Elasticsearch:通过在本地运行 Elasticsearch 来开始使用。最简单的方法是使用官方 Elasticsearch Docker 镜像。更多信息请参阅 Elasticsearch Docker 文档

在本地运行 Elasticsearch

在本地运行 Elasticsearch 进行开发和测试的最简单方法是使用 start-local 脚本。此脚本使用 Docker 通过一个简单的命令设置 Elasticsearch(以及可选的 Kibana)。
这将创建一个 elastic-start-local 文件夹,其中包含配置文件和启动脚本。要启动 Elasticsearch:
Elasticsearch 将在 http://localhost:9200 上可用。elastic 用户的密码和 API 密钥会自动生成并存储在 elastic-start-local 文件夹中的 .env 文件中。 如果您只需要 Elasticsearch 而不需要 Kibana,可以使用 --esonly 选项:
start-local 设置仅用于本地测试,不应在生产环境中使用。有关生产安装,请参阅官方 Elasticsearch 文档

使用身份验证运行

对于生产环境,我们建议您启用安全性运行。要使用登录凭证连接,您可以使用参数 es_api_keyes_useres_password

如何获取默认 “elastic” 用户的密码?

要获取 Elastic Cloud 上默认 “elastic” 用户的密码:
  1. 登录 Elastic Cloud 控制台 cloud.elastic.co
  2. 转到 “Security” > “Users”
  3. 找到 “elastic” 用户并点击 “Edit”
  4. 点击 “Reset password”
  5. 按照提示重置密码

如何获取 API 密钥?

要获取 API 密钥:
  1. 登录 Elastic Cloud 控制台 cloud.elastic.co
  2. 打开 Kibana 并转到 Stack Management > API Keys
  3. 点击 “Create API key”
  4. 输入 API 密钥的名称并点击 “Create”
  5. 复制 API 密钥并将其粘贴到 api_key 参数中

Elastic cloud

要连接到 Elastic Cloud 上的 Elasticsearch 实例,您可以使用 es_cloud_id 参数或 es_url
如果您想获得一流的模型调用自动跟踪,您也可以通过取消注释以下内容来设置您的 LangSmith API 密钥:

初始化

Elasticsearch 正在本地主机 localhost:9200 上通过 docker 运行。有关如何从 Elastic Cloud 连接到 Elasticsearch 的更多详细信息,请参阅上面的 使用身份验证连接

管理向量存储

向向量存储添加项目

从向量存储中删除项目

查询向量存储

一旦您的向量存储已创建并且相关文档已添加,您很可能希望在链或代理运行期间对其进行查询。这些示例还展示了如何在搜索时使用过滤。

直接查询

相似性搜索

执行带有元数据过滤的简单相似性搜索可以这样做:

带分数的相似性搜索

如果您想执行相似性搜索并接收相应的分数,您可以运行:

通过转换为检索器进行查询

您也可以将向量存储转换为检索器,以便在您的链中更轻松地使用。

距离相似性算法

Elasticsearch 支持以下向量距离相似性算法:
  • cosine
  • euclidean
  • dot_product
余弦相似性算法是默认值。 您可以通过 similarity 参数指定所需的相似性算法。 注意:根据检索策略,相似性算法无法在查询时更改。它需要在为字段创建索引映射时设置。如果您需要更改相似性算法,则需要删除索引并使用正确的 distance_strategy 重新创建它。

检索策略

Elasticsearch 相较于其他纯向量数据库的一个巨大优势在于其支持广泛的检索策略。在本笔记本中,我们将配置 ElasticsearchStore 以支持一些最常见的检索策略。 默认情况下,ElasticsearchStore 使用 DenseVectorStrategy(在 0.2.0 版本之前称为 ApproxRetrievalStrategy)。

DenseVectorStrategy

这将返回与查询向量最相似的前 k 个向量。k 参数在初始化 ElasticsearchStore 时设置。默认值为 10。

示例:使用稠密向量和关键词搜索的混合检索

此示例将展示如何配置 ElasticsearchStore 以执行混合检索,结合使用近似语义搜索和基于关键词的搜索。 我们使用 RRF 来平衡来自不同检索方法的两个分数。 要启用混合检索,我们需要在 DenseVectorStrategy 构造函数中设置 hybrid=True
当启用混合时,执行的查询将是近似语义搜索和基于关键词搜索的组合。 它将使用 rrf(倒数排名融合)来平衡来自不同检索方法的两个分数。 注意:RRF 需要 Elasticsearch 8.9.0 或更高版本。

示例:使用 Elasticsearch 中嵌入模型的稠密向量搜索

此示例将展示如何配置 ElasticsearchStore 以使用部署在 Elasticsearch 中的嵌入模型进行稠密向量检索。 要使用此功能,请在 DenseVectorStrategy 构造函数中通过 query_model_id 参数指定 model_id。 注意:这需要模型部署并运行在 Elasticsearch ML 节点中。有关如何使用 eland 部署模型,请参阅 笔记本示例

SparseVectorStrategy (ELSER)

此策略使用 Elasticsearch 的稀疏向量检索来检索前 k 个结果。目前我们只支持我们自己的 “ELSER” 嵌入模型。 注意:这需要 ELSER 模型部署并运行在 Elasticsearch ml 节点中。 要使用此功能,请在 ElasticsearchStore 构造函数中指定 SparseVectorStrategy(在 0.2.0 版本之前称为 SparseVectorRetrievalStrategy)。您需要提供一个模型 ID。

DenseVectorScriptScoreStrategy

此策略使用 Elasticsearch 的脚本分数查询来执行精确向量检索(也称为暴力检索)以检索前 k 个结果。(此策略在 0.2.0 版本之前称为 ExactRetrievalStrategy。) 要使用此功能,请在 ElasticsearchStore 构造函数中指定 DenseVectorScriptScoreStrategy

BM25Strategy

最后,您可以使用全文关键词搜索。 要使用此功能,请在 ElasticsearchStore 构造函数中指定 BM25Strategy

BM25RetrievalStrategy

此策略允许用户使用纯 BM25 进行搜索,而不使用向量搜索。 要使用此功能,请在 ElasticsearchStore 构造函数中指定 BM25RetrievalStrategy 请注意,在下面的示例中,未指定嵌入选项,表示搜索是在不使用嵌入的情况下进行的。

自定义查询

通过搜索时的 custom_query 参数,您可以调整用于从 Elasticsearch 检索文档的查询。如果您想使用更复杂的查询,例如支持字段的线性提升,这将非常有用。

自定义文档构建器

通过搜索时的 doc_builder 参数,您可以调整如何使用从 Elasticsearch 检索的数据构建 Document。如果您有未使用 LangChain 创建的索引,这将特别有用。

用于检索增强生成的用法

有关如何将此向量存储用于检索增强生成 (RAG) 的指南,请参阅以下部分:

常见问题解答

问题:将文档索引到 Elasticsearch 时出现超时错误。如何解决?

一个可能的问题是您的文档可能需要更长的时间才能索引到 Elasticsearch 中。ElasticsearchStore 使用 Elasticsearch 批量 API,该 API 有一些默认值,您可以调整这些值以减少超时错误的可能性。 当您使用 SparseVectorRetrievalStrategy 时,这也是一个好主意。 默认值为:
  • chunk_size:500
  • max_chunk_bytes:100MB
要调整这些值,您可以将 chunk_sizemax_chunk_bytes 参数传递给 ElasticsearchStore 的 add_texts 方法。

升级到 ElasticsearchStore

如果您已经在基于 langchain 的项目中使用 Elasticsearch,您可能正在使用旧的实现:ElasticVectorSearchElasticKNNSearch,它们现在已被弃用。我们引入了一个新的实现,称为 ElasticsearchStore,它更灵活且更易于使用。本笔记本将指导您完成升级到新实现的过程。

有什么新功能?

新的实现现在是一个名为 ElasticsearchStore 的类,可以通过策略用于近似稠密向量、精确稠密向量、稀疏向量 (ELSER)、BM25 检索和混合检索。

我正在使用 ElasticKNNSearch

旧实现:
新实现:

我正在使用 ElasticVectorSearch

旧实现:
新实现:

API 参考

有关所有 ElasticSearchStore 功能和配置的详细文档,请访问 API 参考