Link Search Menu Expand Document Documentation Menu

使用外部托管的机器学习模型进行批量提取

2.15 版引入

如果要提取多个文档并通过调用外部托管模型生成嵌入,可以使用批量提取来提高性能。

当使用 批量 API 提取文档时,支持批量提取的处理器会将文档拆分为批次,并通过单个请求将每个批次的文档发送到外部托管模型。

text_embeddingsparse_encoding 处理器目前支持批量提取。

步骤 1:注册模型组

您可以通过两种方式注册模型

  • 您可以使用 model_group_id 将模型版本注册到现有模型组。
  • 如果您不使用 model_group_id,那么 ML Commons 会创建一个具有新模型组的模型。

要注册模型组,请发送以下请求:

POST /_plugins/_ml/model_groups/_register
{
  "name": "remote_model_group",
  "description": "A model group for external models"
}

响应包含模型组 ID,您将使用它向此模型组注册模型。

{
 "model_group_id": "wlcnb4kBJ1eYAeTMHlV6",
 "status": "CREATED"
}

要了解有关模型组的更多信息,请参阅模型访问控制

第 2 步:创建连接器

您可以创建一个独立连接器,该连接器可用于多个模型。或者,您可以在创建模型时指定连接器,使其仅用于该模型。有关更多信息和连接器示例,请参阅连接器

连接器创建 API(/_plugins/_ml/connectors/_create)用于创建连接器,以方便在 OpenSearch 中注册和部署外部模型。使用 endpoint 参数,您可以通过其特定的 API 端点将 ML Commons 连接到任何受支持的 ML 工具。例如,您可以通过 api.openai.com 端点连接到 ChatGPT 模型。

POST /_plugins/_ml/connectors/_create
{
    "name": "OpenAI Chat Connector",
    "description": "The connector to public OpenAI model service for GPT 3.5",
    "version": 1,
    "protocol": "http",
    "parameters": {
        "endpoint": "api.openai.com",
        "model": "gpt-3.5-turbo",
        "input_docs_processed_step_size": 100
    },
    "credential": {
        "openAI_key": "..."
    },
    "actions": [
        {
            "action_type": "predict",
            "method": "POST",
            "url": "https://${parameters.endpoint}/v1/chat/completions",
            "headers": {
                "Authorization": "Bearer ${credential.openAI_key}"
            },
            "request_body": "{ \"model\": \"${parameters.model}\", \"messages\": ${parameters.messages} }"
        }
    ]
}

parameters.input_docs_processed_step_size 参数用于设置发送到远程服务器的文档的最大批处理大小。您可以将此参数设置为远程服务器支持的最大批处理大小,或设置为较小的值以获得最佳性能。

响应包含新创建连接器的连接器 ID。

{
  "connector_id": "a1eMb4kBJ1eYAeTMAljY"
}

第 3 步:注册外部托管模型

要将外部托管模型注册到第 1 步中创建的模型组,请在以下请求中提供第 1 步中的模型组 ID 和第 2 步中的连接器 ID。您必须将 function_name 指定为 remote

POST /_plugins/_ml/models/_register
{
    "name": "openAI-gpt-3.5-turbo",
    "function_name": "remote",
    "model_group_id": "wlcnb4kBJ1eYAeTMHlV6",
    "description": "test model",
    "connector_id": "a1eMb4kBJ1eYAeTMAljY"
}

OpenSearch 返回注册操作的任务 ID。

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

要检查操作状态,请将任务 ID 提供给任务 API

GET /_plugins/_ml/tasks/cVeMb4kBJ1eYAeTMFFgj

操作完成后,状态将变为 COMPLETED

{
  "model_id": "cleMb4kBJ1eYAeTMFFg4",
  "task_type": "REGISTER_MODEL",
  "function_name": "REMOTE",
  "state": "COMPLETED",
  "worker_node": [
    "XPcXLV7RQoi5m8NI_jEOVQ"
  ],
  "create_time": 1689793598499,
  "last_update_time": 1689793598530,
  "is_async": false
}

记下返回的 model_id,因为部署模型时需要它。

第 4 步:部署模型

从 OpenSearch 2.13 版本开始,外部托管模型在您第一次发送预测 API 请求时会自动部署。要禁用外部托管模型的自动部署,请将 plugins.ml_commons.model_auto_deploy.enable 设置为 false

PUT _cluster/settings
{
  "persistent": {
    "plugins.ml_commons.model_auto_deploy.enable" : "false"
  }
}

要取消部署模型,请使用取消部署 API

POST /_plugins/_ml/models/cleMb4kBJ1eYAeTMFFg4/_deploy

响应包含任务 ID,您可以使用该 ID 检查部署操作的状态

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

与上一步一样,通过调用任务 API 检查操作状态

GET /_plugins/_ml/tasks/vVePb4kBJ1eYAeTM7ljG

操作完成后,状态将变为 COMPLETED

{
  "model_id": "cleMb4kBJ1eYAeTMFFg4",
  "task_type": "DEPLOY_MODEL",
  "function_name": "REMOTE",
  "state": "COMPLETED",
  "worker_node": [
    "n-72khvBTBi3bnIIR8FTTw"
  ],
  "create_time": 1689793851077,
  "last_update_time": 1689793851101,
  "is_async": true
}

第 5 步:创建摄取管道

以下示例请求使用 text_embedding 处理器创建了一个摄取管道。该处理器将 passage_text 字段中的文本转换为文本嵌入,并将嵌入存储在 passage_embedding

PUT /_ingest/pipeline/nlp-ingest-pipeline
{
  "description": "A text embedding pipeline",
  "processors": [
    {
      "text_embedding": {
        "model_id": "cleMb4kBJ1eYAeTMFFg4",
        "field_map": {
          "passage_text": "passage_embedding"
        },
        "batch_size": 5
      }
    }
  ]
}

第 6 步:执行批量索引

要批量摄取文档,请调用批量 API 并提供 pipeline 参数。如果您不提供 pipeline 参数,则将使用索引的默认摄取管道进行摄取

POST _bulk?batch_size=5&pipeline=nlp-ingest-pipeline
{ "create": { "_index": "testindex1", "_id": "2" } }
{ "passage_text": "hello world" }
{ "create": { "_index": "testindex1", "_id": "3" } }
{ "passage_text": "big apple" }
{ "create": { "_index": "testindex1", "_id": "4" } }
{ "passage_text": "golden gate bridge" }
{ "create": { "_index": "testindex1", "_id": "5" } }
{ "passage_text": "fine tune" }
{ "create": { "_index": "testindex1", "_id": "6" } }
{ "passage_text": "random test" }
{ "create": { "_index": "testindex1", "_id": "7" } }
{ "passage_text": "sun and moon" }
{ "create": { "_index": "testindex1", "_id": "8" } }
{ "passage_text": "windy" }
{ "create": { "_index": "testindex1", "_id": "9" } }
{ "passage_text": "new york" }
{ "create": { "_index": "testindex1", "_id": "10" } }
{ "passage_text": "fantastic" }