Link Search Menu Expand Document Documentation Menu

自动生成嵌入

您可以在 OpenSearch 中在摄入期间动态生成嵌入。这种方法通过自动将数据转换为向量来提供简化的工作流。

OpenSearch 可以使用两种方法从您的文本数据中自动生成嵌入:

  • 手动设置(推荐用于自定义配置):单独配置每个组件,以完全控制实现。
  • 自动化工作流(推荐用于快速设置):使用默认值和工作流以最少的配置快速实现。

先决条件

对于此简单设置,您将使用 OpenSearch 提供的机器学习 (ML) 模型和没有专用 ML 节点的集群。为了确保此基本的本地设置能够运行,请发送以下请求来更新 ML 相关的集群设置:

PUT _cluster/settings
{
  "persistent": {
    "plugins.ml_commons.only_run_on_ml_node": "false",
    "plugins.ml_commons.native_memory_threshold": "99"
  }
}

选择一个机器学习模型

自动生成嵌入需要在摄入时和查询时配置一个将文本转换为嵌入的语言模型。

选择模型时,您有以下选项:

在此示例中,您将使用 Hugging Face 的 DistilBERT 模型,它是 OpenSearch 中可用的预训练模型之一。更多信息请参见集成机器学习模型

请注意模型的维度,因为在设置向量索引时会用到它。

手动设置

为了更好地控制配置,您可以使用以下步骤手动设置每个组件。

步骤 1:注册和部署模型

要注册和部署模型,请发送以下请求:

POST /_plugins/_ml/models/_register?deploy=true
{
  "name": "huggingface/sentence-transformers/msmarco-distilbert-base-tas-b",
  "version": "1.0.3",
  "model_format": "TORCH_SCRIPT"
}

注册模型是一个异步任务。OpenSearch 会为此任务返回一个任务 ID。

{
  "task_id": "aFeif4oB5Vm0Tdw8yoN7",
  "status": "CREATED"
}

您可以使用任务 API 检查任务状态。

GET /_plugins/_ml/tasks/aFeif4oB5Vm0Tdw8yoN7

任务完成后,任务状态将变为 COMPLETED,并且任务 API 响应将包含已注册模型的模型 ID。

{
  "model_id": "aVeif4oB5Vm0Tdw8zYO2",
  "task_type": "REGISTER_MODEL",
  "function_name": "TEXT_EMBEDDING",
  "state": "COMPLETED",
  "worker_node": [
    "4p6FVOmJRtu3wehDD74hzQ"
  ],
  "create_time": 1694358489722,
  "last_update_time": 1694358499139,
  "is_async": true
}

您将需要模型 ID,以便在接下来的几个步骤中使用此模型。

步骤 2:创建摄取管道

首先,您需要创建一个摄入管道,其中包含一个处理器:一个在文档摄入到索引之前转换文档字段的任务。您将设置一个text_embedding处理器,该处理器从文本创建向量嵌入。您将需要上一节中设置的模型的model_id以及一个field_map,它指定从中获取文本的字段名称(text)和记录嵌入的字段名称(passage_embedding)。

PUT /_ingest/pipeline/nlp-ingest-pipeline
{
  "description": "An NLP ingest pipeline",
  "processors": [
    {
      "text_embedding": {
        "model_id": "aVeif4oB5Vm0Tdw8zYO2",
        "field_map": {
          "text": "passage_embedding"
        }
      }
    }
  ]
}

步骤 3:创建向量索引

现在,您将通过将index.knn设置为true来创建一个向量索引。在该索引中,名为text的字段包含图像描述,而名为passage_embeddingknn_vector字段包含文本的向量嵌入。向量字段的dimension必须与您在步骤 2 中配置的模型维度相匹配。此外,将默认摄入管道设置为您在上一步中创建的nlp-ingest-pipeline

PUT /my-nlp-index
{
  "settings": {
    "index.knn": true,
    "default_pipeline": "nlp-ingest-pipeline"
  },
  "mappings": {
    "properties": {
      "passage_embedding": {
        "type": "knn_vector",
        "dimension": 768,
        "space_type": "l2"
      },
      "text": {
        "type": "text"
      }
    }
  }
}

设置向量索引允许您稍后在passage_embedding字段上执行向量搜索。

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

在此步骤中,您将摄入几个示例文档到索引中。示例数据取自Flickr 图像数据集。每个文档都包含一个与图像描述对应的text字段和一个与图像 ID 对应的id字段。

PUT /my-nlp-index/_doc/1
{
  "text": "A man who is riding a wild horse in the rodeo is very near to falling off ."
}

PUT /my-nlp-index/_doc/2
{
  "text": "A rodeo cowboy , wearing a cowboy hat , is being thrown off of a wild white horse ."
}

PUT /my-nlp-index/_doc/3
{
  "text": "People line the stands which advertise Freemont 's orthopedics , a cowboy rides a light brown bucking bronco ."
}

步骤 5:搜索数据

现在,您将使用语义搜索来搜索索引。要从查询文本自动生成向量嵌入,请使用neural查询并提供您之前设置的模型的模型 ID,以便查询文本的向量嵌入使用摄入时使用的模型生成。

GET /my-nlp-index/_search
{
  "_source": {
    "excludes": [
      "passage_embedding"
    ]
  },
  "query": {
    "neural": {
      "passage_embedding": {
        "query_text": "wild west",
        "model_id": "aVeif4oB5Vm0Tdw8zYO2",
        "k": 3
      }
    }
  }
}

响应包含匹配文档:

{
  "took": 127,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": {
      "value": 3,
      "relation": "eq"
    },
    "max_score": 0.015851952,
    "hits": [
      {
        "_index": "my-nlp-index",
        "_id": "1",
        "_score": 0.015851952,
        "_source": {
          "text": "A man who is riding a wild horse in the rodeo is very near to falling off ."
        }
      },
      {
        "_index": "my-nlp-index",
        "_id": "2",
        "_score": 0.015177963,
        "_source": {
          "text": "A rodeo cowboy , wearing a cowboy hat , is being thrown off of a wild white horse ."
        }
      },
      {
        "_index": "my-nlp-index",
        "_id": "3",
        "_score": 0.011347729,
        "_source": {
          "text": "People line the stands which advertise Freemont 's orthopedics , a cowboy rides a light brown bucking bronco ."
        }
      }
    ]
  }
}

使用自动化工作流

您可以使用自动化工作流快速设置自动嵌入生成。这种方法会自动创建和配置所有必要的资源。更多信息请参见工作流模板

您可以使用自动化工作流来创建和部署外部托管模型,并为各种 AI 搜索类型创建资源。在此示例中,您将创建与手动步骤中已创建的相同搜索。

步骤 1:注册和部署模型

要注册和部署模型,请为模型提供商选择内置工作流模板。更多信息请参见支持的工作流模板。或者,要配置自定义模型,请使用手动设置的步骤 1。请记下模型 ID;您将在下一步中使用它。

步骤 2:配置工作流

创建并配置一个语义搜索工作流。您必须提供上一步中部署的模型的模型 ID。查看您选择的工作流模板默认值,以确定是否需要更新任何参数。例如,如果模型维度与默认值(1024)不同,请在output_dimension参数中指定模型的维度。将工作流模板的默认文本字段从passage_text更改为text以匹配手动示例。

POST /_plugins/_flow_framework/workflow?use_case=semantic_search&provision=true
{
    "create_ingest_pipeline.model_id" : "aVeif4oB5Vm0Tdw8zYO2",
    "text_embedding.field_map.output.dimension": "768",
    "text_embedding.field_map.input": "text"
}

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

{
  "workflow_id" : "U_nMXJUBq_4FYQzMOS4B"
}

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

GET /_plugins/_flow_framework/workflow/U_nMXJUBq_4FYQzMOS4B/_status

工作流完成后,state将变为COMPLETED。工作流已创建一个摄入管道和一个名为my-nlp-index的索引。

{
  "workflow_id": "U_nMXJUBq_4FYQzMOS4B",
  "state": "COMPLETED",
  "resources_created": [
    {
      "workflow_step_id": "create_ingest_pipeline",
      "workflow_step_name": "create_ingest_pipeline",
      "resource_id": "nlp-ingest-pipeline",
      "resource_type": "pipeline_id"
    },
    {
      "workflow_step_name": "create_index",
      "workflow_step_id": "create_index",
      "resource_id": "my-nlp-index",
      "resource_type": "index_name"
    }
  ]
}

您现在可以继续步骤 4 和 5,将文档摄入索引并搜索索引。

后续步骤