机器学习自定义技能

已完成

使用机器学习自定义技能的工作方式与将任何其他自定义技能添加到搜索索引相同。

在这里,你将了解如何使用 AmlSkill 自定义技能,并探讨如何有效地使用它的注意事项。

自定义 Azure 机器学习技能架构

使用 Azure 机器学习 (AML) 自定义技能扩充搜索索引时,扩充将在文档级别进行。 文档索引器使用的技能组需要包含一个 AmlSkill。 此技能的架构为:

{
      "@odata.type": "#Microsoft.Skills.Custom.AmlSkill",
      "name": "AML name",
      "description": "AML description",
      "context": "/document",
      "uri": "https://[Your AML endpoint]",
      "key": "Your AML endpoint key",
      "resourceId": null,
      "region": null,
      "timeout": "PT30S",
      "degreeOfParallelism": 1,
      "inputs": [
        {
          "name": "field name in the AML model",
          "source": "field from the document in the index"
        },
        {
          "name": "field name in the AML model",
          "source": "field from the document in the index"
        },

      ],
      "outputs": [
        {
          "name": "result field from the AML model",
          "targetName": "result field in the document"
        }
      ]
    }

重要

URI 必须使用 HTTPS 终结点。 这可以是 Microsoft 提供的托管自定义 URL 地址,也可以是你自己的域名和证书。

请注意,自定义技能不包含 batchSize 的设置,因为 AML 模型一次只会处理一个文档。 控制技能性能的其余设置是 timeoutdegreeOfParallelism。 上述架构已将 30 秒设置为超时值。 并行度应从 1 开始。 根据基础结构,可以增加此数字。

管理 AML 技能效率的最佳方法是适当地纵向扩展 Kubernetes 推理群集以管理工作负荷。

文档的索引需要一个字段来存储 AML 模型的结果。 然后,添加输出字段映射,用于将自定义技能组的结果存储在索引中文档上的字段。

要执行此输出字段映射的 JSON 为:

"outputFieldMappings": [
    {
      "sourceFieldName": "/result field in the document",
      "targetFieldName": "result field from the AML model"
    }
  ]

使用 Python SDK、REST API 或 Azure CLI 等开发人员工具创建 Azure 机器学习模型。 另一种方法是利用 Azure AI 机器学习工作室,这是一个图形用户界面,使你无需编写任何代码即可创建、训练和部署模型。

该图显示了使用 Azure AI 机器学习工作室模型扩充搜索索引的步骤。

创建模型后,可以更改评分代码调用模型的方式,以允许自定义搜索技能使用它。

最后一步是创建 Kubernetes 群集来托管模型的终结点。

创建 AML 工作区

创建 AML 工作区时,Azure 还将创建存储帐户、密钥存储和 Application Insights 资源。 “AML 工作区概述”窗格提供启动 Azure AI 机器学习工作室的链接。

在 Azure 机器学习工作室中创建和训练模型

使用 Azure AI 机器学习工作室,可以使用设计器通过拖放来创建可创建和训练模型的管道。 使用预生成模板创建模型的方法更加简单。

Azure AI 机器学习工作室中所有预生成组件的屏幕截图。

无论选择如何创建模型,它们都需要在 Azure AI 机器学习工作室中注册,以便可以将模型部署到 web 服务。

更改模型的工作原理,以允许 AML 自定义技能调用它

你训练的模型通常使用许多数据示例。 数据集将包含许多行,并被拆分,用于训练和测试模型。 处理此数据并将其传递给模型的代码需要进行更改以便能够处理单行。

来自模型的 JSON 响应也应只包含输出预测。

例如,如果数据是 JSON 对象数组:

[ 
    {
        "attribute-1": null,
        "attribute-2": null
    },
    {
        "attribute-1": null,
        "attribute-2": null
    },
    {
        "attribute-1": null,
        "attribute-2": null
    }
]

Python 评分代码必须一次处理一行的数据:

data = json.loads(data)
for row in data:
    for key, val in row.items():
        input_entry[key].append(decode_nan(val))

将输入数据集更改为单个记录:

{
    "attribute-1": null,
    "attribute-2": null
}

python 代码需要更改为:

data = json.loads(data)
for key, val in data.items():
    input_entry[key].append(decode_nan(val))

对于来自评分代码的响应,默认代码返回整个 JSON 文档:

return json.dumps({"result": result.data_frame.values.tolist()})

自定义技能需要能够映射来自模型的单个响应。 因此,代码应该返回仅是最后一个属性的 JSON。

output = result.data_frame.values.tolist()
# return the last column of the the first row of the dataframe
return {
    "predicted_outcome": output[0][-1]
}

为模型创建要使用的终结点

该模型部署到终结点。 Azure AI 机器学习工作室支持将模型部署到实时终结点、批处理终结点或 Web 服务。 目前,Azure AI 搜索中的自定义 AmlSkill 技能仅支持 Web 服务终结点。

另一个限制是终结点必须是 Azure Kubernetes 服务 (AKS) 群集。 不支持容器实例。

如果在创建和管理 AKS 群集方面有经验,可以在 Azure 门户手动创建群集,并在创建终结点时引用它们。 但是,一个更简单的选项是让 Azure AI 机器学习工作室为你创建和管理群集。

如果导航到工作室的计算部分,则可以创建推理群集。 然后,AML 工作室将指导你选择群集的大小,甚至启用 HTTPS 并为你创建域名。 它将采用 ___location.cloudapp.azure.com:443 格式。

将 AML 自定义技能连接到终结点

完成上述所有操作后,需要更新 Azure AI 搜索服务。 操作步骤与本模块中显示的示例类似,因此我们不会在此处详述细节,但会列出要遵循的步骤。

  1. 首先,若要扩充搜索索引,需要向索引添加新字段,以包含模型的输出。
  2. 然后,你将更新索引技能集并添加 #Microsoft.Skills.Custom.AmlSkill 自定义技能。
  3. 接下来,将索引器更改为将自定义技能的输出映射到在索引上创建的字段。
  4. 最后一步是重新运行索引器以使用 AML 模型扩充索引。