ELSER 模型

在上一章中,您已经了解了如何使用dense_vector 字段扩展 Elasticsearch 索引,该字段由机器学习模型生成的嵌入式数据填充。模型安装在本地计算机上,嵌入是由 Python 代码生成的,并在插入索引之前添加到文档中。

本章将介绍另一种向量类型-- sparse_vector(稀疏 向量 ,它用于存储来自 Elastic Learned Sparse EncodeR 模型(ELSER) 的推论。该模型返回的嵌入信息是一系列标签(称为特征更为恰当),每个标签都有一个指定权重

在本章中,你还将使用一种不同的方法来处理机器学习模型,即 Elasticsearch 服务本身运行模型,并通过管道将生成的嵌入结果添加到索引中。

sparse_vector 田野

与前一章中使用的dense_vector 字段类型一样,sparse_vector 类型也可以存储机器学习模型返回的推论。稠密向量保存了描述源文本的固定长度数字数组,而稀疏向量则存储了特征到权重的映射。

让我们在索引中添加一个sparse_vector 字段。这是一种需要在索引映射中明确定义的类型。下面是create_index() 方法的更新版,其中新增了一个名为elser_embedding 的字段。

class Search:
    # ...

    def create_index(self):
        self.es.indices.delete(index='my_documents', ignore_unavailable=True)
        self.es.indices.create(index='my_documents', mappings={
            'properties': {
                'embedding': {
                    'type': 'dense_vector',
                },
                'elser_embedding': {
                    'type': 'sparse_vector',
                },
            }
        })
    
    # ...

部署 ELSER 模型

如上所述,在本示例中,Elasticsearch 将掌握模型的所有权,并在插入文档和搜索时自动执行该模型以生成嵌入。

Elasticsearch 客户端提供一组 API 端点,用于管理机器学习模型及其管道。以下是search.py中的deploy_elser() 方法,它通过几个步骤下载和安装 ELSER v2 模型,并创建一个管道,用它来填充上文定义的elser_embedding 字段。

class Search:
    # ...

    def deploy_elser(self):
        # download ELSER v2
        self.es.ml.put_trained_model(model_id='.elser_model_2',
                                     input={'field_names': ['text_field']})
        
        # wait until ready
        while True:
            status = self.es.ml.get_trained_models(model_id='.elser_model_2',
                                                   include='definition_status')
            if status['trained_model_configs'][0]['fully_defined']:
                # model is ready
                break
            time.sleep(1)

        # deploy the model
        self.es.ml.start_trained_model_deployment(model_id='.elser_model_2')

        # define a pipeline
        self.es.ingest.put_pipeline(
            id='elser-ingest-pipeline',
            processors=[
                {
                    'inference': {
                        'model_id': '.elser_model_2',
                        'input_output': [
                            {
                                'input_field': 'summary',
                                'output_field': '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 命令:

@app.cli.command()
def deploy_elser():
    """Deploy the ELSER v2 model to Elasticsearch."""
    try:
        es.deploy_elser()
    except Exception as exc:
        print(f'Error: {exc}')
    else:
        print(f'ELSER model deployed.')

现在,您可以使用以下命令在 Elasticsearch 服务中部署 ELSER:

flask deploy-elser

最后一项配置任务是将索引与管道连接起来,以便在该索引上插入文档时自动执行模型。这是通过settings 选项在索引配置中实现的。下面是对create_index() 创建此链接方法的进一步更新:

class Search:
    # ...

    def create_index(self):
        self.es.indices.delete(index='my_documents', ignore_unavailable=True)
        self.es.indices.create(
            index='my_documents',
            mappings={
                'properties': {
                    'embedding': {
                        'type': 'dense_vector',
                    },
                    'elser_embedding': {
                        'type': 'sparse_vector',
                    },
                }
            },
            settings={
                'index': {
                    'default_pipeline': 'elser-ingest-pipeline'
                }
            }
        )

有了这一改动,您现在可以重新生成完全支持 ELSER 推断的索引:

flask reindex

准备好打造最先进的搜索体验了吗?

足够先进的搜索不是一个人的努力就能实现的。Elasticsearch 由数据科学家、ML 操作员、工程师以及更多和您一样对搜索充满热情的人提供支持。让我们联系起来,共同打造神奇的搜索体验,让您获得想要的结果。

亲自试用