在上一章中,您已经了解了如何使用dense_vector 字段扩展 Elasticsearch 索引,该字段由机器学习模型生成的嵌入式数据填充。模型安装在本地计算机上,嵌入是由 Python 代码生成的,并在插入索引之前添加到文档中。
本章将介绍另一种向量类型-- sparse_vector(稀疏 向量 ) ,它用于存储来自 Elastic Learned Sparse EncodeR 模型(ELSER) 的推论。该模型返回的嵌入信息是一系列标签(称为特征更为恰当),每个标签都有一个指定权重。
在本章中,你还将使用一种不同的方法来处理机器学习模型,即 Elasticsearch 服务本身运行模型,并通过管道将生成的嵌入结果添加到索引中。
sparse_vector
与前一章中使用的dense_vector 字段类型一样,sparse_vector 类型也可以存储机器学习模型返回的推论。稠密向量保存了描述源文本的固定长度数字数组,而稀疏向量则存储了特征到权重的映射。
让我们在索引中添加一个sparse_vector 字段。这是一种需要在索引映射中明确定义的类型。下面是create_index() 方法的更新版,其中新增了一个名为elser_embedding 的字段。
部署 ELSER 模型
如上所述,在本示例中,Elasticsearch 将掌握模型的所有权,并在插入文档和搜索时自动执行该模型以生成嵌入。
Elasticsearch 客户端提供一组 API 端点,用于管理机器学习模型及其管道。以下是search.py中的deploy_elser() 方法,它通过几个步骤下载和安装 ELSER v2 模型,并创建一个管道,用它来填充上文定义的elser_embedding 字段。
为我们配置 ELSER 需要几个步骤。首先,使用 Elasticsearch 的ml.put_trained_model() 方法下载 ELSER。model_id 参数用于确定要下载的模型和版本(ELSER v2 适用于 Elasticsearch 8.11 及以上版本)。input 字段是该模型所需的配置。
下载模型后,需要对其进行部署。为此,使用ml.start_trained_model_deployment() 方法,只需输入要部署模型的标识符即可。请注意,这是一个异步操作,因此模型将在很短时间后可供使用。
配置使用 ELSER 的最后一步是为其定义管道。管道用于告诉 Elasticsearch 如何使用模型。一个管道被赋予一个标识符和一个或多个要执行的处理任务。上面创建的管道名为elser-ingest-pipeline ,只有一个推理任务,这意味着每次添加文档时,模型都将在input_field 上运行,输出结果将添加到output_field 上的文档中。在本例中,summary 场用于生成嵌入,就像上一章中的密集向量嵌入一样。生成的嵌入结果将写入上一节创建的elser_embedding 稀疏向量场。
为了方便调用此方法,请在app.py 中的 Flask 应用程序中添加deploy-elser 命令:
现在,您可以使用以下命令在 Elasticsearch 服务中部署 ELSER:
最后一项配置任务是将索引与管道连接起来,以便在该索引上插入文档时自动执行模型。这是通过settings 选项在索引配置中实现的。下面是对create_index() 创建此链接方法的进一步更新:
有了这一改动,您现在可以重新生成完全支持 ELSER 推断的索引: