使用外部托管的机器学习模型进行批量提取
2.15 版引入
如果要提取多个文档并通过调用外部托管模型生成嵌入,可以使用批量提取来提高性能。
当使用 批量 API 提取文档时,支持批量提取的处理器会将文档拆分为批次,并通过单个请求将每个批次的文档发送到外部托管模型。
text_embedding
和 sparse_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" }