Link Search Menu Expand Document Documentation Menu

多模态搜索

2.11 版引入

使用多模态嵌入模型搜索文本和图像数据。

先决条件
在使用文本搜索之前,必须设置多模态嵌入模型。有关更多信息,请参阅选择模型

有两种方法可以配置多模态搜索

  • 自动化工作流(推荐用于快速设置):以最少配置自动创建摄取管道和索引。
  • 手动设置(推荐用于自定义配置):手动配置每个组件以获得更大的灵活性和控制。

自动化工作流

OpenSearch 提供了一个工作流模板,它会自动创建摄取管道和索引。创建工作流时,您必须提供已配置模型的模型 ID。查看多模态搜索工作流模板的默认设置,以确定是否需要更新任何参数。例如,如果模型维度与默认值 (1024) 不同,请在output_dimension参数中指定模型的维度。要创建默认的多模态搜索工作流,请发送以下请求

POST /_plugins/_flow_framework/workflow?use_case=multimodal_search&provision=true
{
"create_ingest_pipeline.model_id": "mBGzipQB2gmRjlv_dOoB"
}

OpenSearch 会为创建的工作流返回一个工作流 ID:

{
  "workflow_id" : "U_nMXJUBq_4FYQzMOS4B"
}

要检查工作流状态,请发送以下请求:

GET /_plugins/_flow_framework/workflow/U_nMXJUBq_4FYQzMOS4B/_status

工作流完成后,state 将变为 COMPLETED。该工作流创建以下组件

  • 一个名为 nlp-ingest-pipeline 的摄入管道
  • 一个名为 my-nlp-index 的索引

您现在可以继续步骤 3 和 4,将文档摄取到索引中并搜索索引。

手动设置

要手动配置带有文本和图像嵌入的多模态搜索,请按照以下步骤操作

  1. 创建摄入管道.
  2. 创建用于摄取的索引.
  3. 将文档摄取到索引中.
  4. 搜索索引.

步骤 1:创建摄入管道

为了生成向量嵌入,您需要创建一个包含text_image_embedding 处理器摄取管道,该处理器会将文档字段中的文本或图像转换为向量嵌入。处理器的field_map决定了从哪些文本和图像字段生成向量嵌入以及将嵌入存储到哪个输出向量字段中。

以下示例请求创建了一个摄取管道,其中image_description中的文本和image_binary中的图像将被转换为文本嵌入,并且这些嵌入将存储在vector_embedding

PUT /_ingest/pipeline/nlp-ingest-pipeline
{
  "description": "A text/image embedding pipeline",
  "processors": [
    {
      "text_image_embedding": {
        "model_id": "-fYQAosBQkdnhhBsK593",
        "embedding": "vector_embedding",
        "field_map": {
          "text": "image_description",
          "image": "image_binary"
        }
      }
    }
  ]
}

步骤 2:创建用于摄取的索引

为了使用管道中定义的文本嵌入处理器,请创建一个向量索引,并将上一步中创建的管道添加为默认管道。确保在field_map中定义的字段映射为正确的类型。继续示例,vector_embedding字段必须映射为 k-NN 向量,其维度与模型维度匹配。同样,image_description字段应映射为textimage_binary字段应映射为binary

以下示例请求创建了一个设置了默认摄入管道的向量索引

PUT /my-nlp-index
{
  "settings": {
    "index.knn": true,
    "default_pipeline": "nlp-ingest-pipeline",
    "number_of_shards": 2
  },
  "mappings": {
    "properties": {
      "vector_embedding": {
        "type": "knn_vector",
        "dimension": 1024,
        "method": {
          "name": "hnsw",
          "engine": "lucene",
          "parameters": {}
        }
      },
      "image_description": {
        "type": "text"
      },
      "image_binary": {
        "type": "binary"
      }
    }
  }
}

有关创建向量索引及其支持方法的更多信息,请参阅创建向量索引

步骤 3:将文档摄取到索引中

要将文档摄取到上一步创建的索引中,请发送以下请求

PUT /nlp-index/_doc/1
{
 "image_description": "Orange table",
 "image_binary": "iVBORw0KGgoAAAANSUI..."
}

在文档摄取到索引之前,摄取管道会在文档上运行text_image_embedding处理器,为image_descriptionimage_binary字段生成向量嵌入。除了原始的image_descriptionimage_binary字段外,索引文档还包括vector_embedding字段,其中包含组合的向量嵌入。

步骤 4:搜索索引

要对索引执行向量搜索,请在搜索模型 API查询 DSL查询中使用neural查询子句。您可以使用向量搜索过滤器来细化结果。您可以按文本、图像或同时按文本和图像进行搜索。

以下示例请求使用神经查询搜索文本和图像

GET /my-nlp-index/_search
{
  "size": 10,
  "query": {
    "neural": {
      "vector_embedding": {
        "query_text": "Orange table",
        "query_image": "iVBORw0KGgoAAAANSUI...",
        "model_id": "-fYQAosBQkdnhhBsK593",
        "k": 5
      }
    }
  }
}

为了避免在每次神经查询请求中传递模型 ID,您可以在向量索引或字段上设置默认模型。要了解更多信息,请参阅在索引或字段上设置默认模型

后续步骤

  • 浏览我们的教程,了解如何构建 AI 搜索应用程序。