Compartir a través de

备份和恢复业务流程工作流模型

在 Azure 门户中创建语言资源时,需要指定要在其中创建它的区域。 此后,资源及其相关的所有操作都发生在指定的 Azure 服务器区域中。 有时我们会遇到影响整个区域的网络问题,这种情况比较罕见,但也不是没有可能。 如果你的解决方案需要始终可用,则应将其设计为故障转移到另一个区域。 此过程需要不同区域中的两个 Azure 语言资源,并且能够跨区域同步业务流程工作流模型。

如果应用或业务依赖于业务流程工作流模型的使用,建议将项目副本创建到另一个受支持的区域。 这样,如果发生区域性中断,则可以在复制项目的其他故障转移区域中访问模型。

复制项目意味着要导出项目元数据和资产,并将其导入到新项目中。 此步骤仅复制项目设置、意图和语句。 在使用运行时 API查询模型之前,仍需要训练部署模型。

本文介绍如何使用导出和导入 API 将项目从一个资源复制到其他受支持的地理区域中的现有资源。

先决条件

  • 不同 Azure 区域中的两个语言资源,每个资源位于不同的区域中。

获取资源密钥终结点

执行以下步骤获取主要资源和辅助资源的密钥与终结点。

Azure 门户中,转到资源概述页面。 在左侧菜单中,选择"密钥和终结点”。 你将为 API 请求使用终结点和密钥。

显示 Azure 门户中的“密钥和终结点”页的屏幕截图。

小窍门

请记下主要资源和辅助资源的密钥和终结点。 使用这些值替换以下占位符: {PRIMARY-ENDPOINT}{PRIMARY-RESOURCE-KEY}{SECONDARY-ENDPOINT}{SECONDARY-RESOURCE-KEY}。 另请记下项目名称、模型名称和部署名称。 使用这些值替换以下占位符: {PROJECT-NAME}{MODEL-NAME}{DEPLOYMENT-NAME}

导出主要项目资产

首先,从主要资源中的项目导出项目资产。

提交导出作业

将以下请求中的占位符替换为在第一步中获取的 {PRIMARY-ENDPOINT}{PRIMARY-RESOURCE-KEY}

使用以下 URL、标头和 JSON 正文创建 POST 请求,以导出项目

请求的 URL

创建 API 请求时,请使用以下 URL。 将占位符中的值替换为您自己的值。

{ENDPOINT}/language/authoring/analyze-conversations/projects/{PROJECT-NAME}/:export?stringIndexType=Utf16CodeUnit&api-version={API-VERSION}
Placeholder 价值 Example
{ENDPOINT} 用于对 API 请求进行身份验证的终结点。 https://<your-custom-subdomain>.cognitiveservices.azure.cn
{PROJECT-NAME} 项目名称。 此值区分大小写。 EmailApp
{API-VERSION} 要调用的 API 的版本 2023-04-01

Headers

使用以下标头对请求进行身份验证。

Key 价值
Ocp-Apim-Subscription-Key 资源的键。 用于对 API 请求进行身份验证。

发送 API 请求后,会收到指示 202 成功的响应。 在响应标头中,提取 operation-location 格式如下的值:

{ENDPOINT}/language/authoring/analyze-conversations/projects/{PROJECT-NAME}/jobs/{JOB-ID}?api-version={API-VERSION}

JOB-ID 用于标识请求,因为此操作是异步操作。 使用此 URL 可以通过相同的身份验证方法获取导出的项目 JSON。

获取导出作业状态

将以下请求中的占位符替换为在第一步中获取的 {PRIMARY-ENDPOINT}{PRIMARY-RESOURCE-KEY}

使用以下 GET 请求来查询导出作业的状态。 可以使用在上一步中收到的 URL,或者将占位符值替换为自己的值。

{ENDPOINT}/language/authoring/analyze-conversations/projects/{PROJECT-NAME}/export/jobs/{JOB-ID}?api-version={API-VERSION}
Placeholder 价值 Example
{ENDPOINT} 用于对 API 请求进行身份验证的终结点。 https://<your-custom-subdomain>.cognitiveservices.azure.cn
{PROJECT-NAME} 项目名称。 此值区分大小写。 myProject
{JOB-ID} 用于查找导出作业状态的 ID。 它位于 location 上一步收到的标头值中。 xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxx
{API-VERSION} 要调用的 API 的版本 2023-04-01

Headers

使用以下标头对请求进行身份验证。

Key Description 价值
Ocp-Apim-Subscription-Key 资源的键。 用于对 API 请求进行身份验证。 {YOUR-PRIMARY-RESOURCE-KEY}

响应体

{
  "resultUrl": "{Endpoint}/language/authoring/analyze-conversations/projects/{PROJECT-NAME}/export/jobs/xxxxxx-xxxxx-xxxxx-xx/result?api-version={API-VERSION}",
  "jobId": "xxxx-xxxxx-xxxxx-xxx",
  "createdDateTime": "2022-04-18T15:23:07Z",
  "lastUpdatedDateTime": "2022-04-18T15:23:08Z",
  "expirationDateTime": "2022-04-25T15:23:07Z",
  "status": "succeeded"
}

使用 resultUrl 密钥中的 URL 来查看此作业中导出的资源。

获取导出结果

使用你从上一步骤收到的 提交 GET 请求,以查看导出作业的结果{RESULT-URL}

Headers

使用以下标头对请求进行身份验证。

Key Description 价值
Ocp-Apim-Subscription-Key 资源的键。 用于对 API 请求进行身份验证。 {PRIMARY-RESOURCE-KEY}

复制响应正文以用作下一个导入作业的正文。

导入到新项目

现在继续,在次要区域的新项目中导入已导出的项目资产,以便可以复制该资产。

提交导入作业

将以下请求中的占位符替换为你的 {SECONDARY-ENDPOINT} 和你在第一步中获取的 {SECONDARY-RESOURCE-KEY}

使用以下 URL、标头和 JSON 正文提交 POST 请求,以导入项目

请求的 URL

创建 API 请求时,请使用以下 URL。 将占位符中的值替换为您自己的值。

{ENDPOINT}/language/authoring/analyze-conversations/projects/{PROJECT-NAME}/:import?api-version={API-VERSION}
Placeholder 价值 Example
{ENDPOINT} 用于对 API 请求进行身份验证的终结点。 https://<your-custom-subdomain>.cognitiveservices.azure.cn
{PROJECT-NAME} 项目名称。 此值区分大小写。 myProject
{API-VERSION} 要调用的 API 的版本 2023-04-01

Headers

使用以下标头对请求进行身份验证。

Key 价值
Ocp-Apim-Subscription-Key 资源的键。 用于对 API 请求进行身份验证。

Body

注释

每个意向只能是一种类型(CLU、LUIS 和 qna 中的一种)

使用以下示例 JSON 作为正文。

{
  "projectFileVersion": "{API-VERSION}",
  "stringIndexType": "Utf16CodeUnit",
  "metadata": {
    "projectKind": "Orchestration",
    "settings": {
      "confidenceThreshold": 0
    },
    "projectName": "{PROJECT-NAME}",
    "description": "Project description",
    "language": "{LANGUAGE-CODE}"
  },
  "assets": {
    "projectKind": "Orchestration",
    "intents": [
      {
        "category": "string",
        "orchestration": {
          "kind": "luis",
          "luisOrchestration": {
            "appId": "00001111-aaaa-2222-bbbb-3333cccc4444",
            "appVersion": "string",
            "slotName": "string"
          },
          "cluOrchestration": {
            "projectName": "string",
            "deploymentName": "string"
          },
          "qnaOrchestration": {
            "projectName": "string"
          }
        }
      }
    ],
    "utterances": [
      {
        "text": "Trying orchestration",
        "language": "{LANGUAGE-CODE}",
        "intent": "string"
      }
    ]
  }
}

Key Placeholder 价值 Example
api-version {API-VERSION} 要调用的 API 的版本。 此处使用的版本必须与 URL 中的 API 版本相同。 2022-03-01-preview
projectName {PROJECT-NAME} 项目名称。 此值区分大小写。 EmailApp
language {LANGUAGE-CODE} 指定项目中所用语句的语言代码的字符串。 如果您的项目是多语言项目,请为大多数话语选择语言代码 en-us

获取导入作业状态

将以下请求中的占位符替换为你的 {SECONDARY-ENDPOINT} 和你在第一步中获取的 {SECONDARY-RESOURCE-KEY}

使用以下 GET 请求来查询导入作业的状态。 可以使用在上一步中收到的 URL,或者将占位符值替换为自己的值。

{ENDPOINT}/language/authoring/analyze-conversations/projects/{PROJECT-NAME}/import/jobs/{JOB-ID}?api-version={API-VERSION}
Placeholder 价值 Example
{ENDPOINT} 用于对 API 请求进行身份验证的终结点。 https://<your-custom-subdomain>.cognitiveservices.azure.cn
{PROJECT-NAME} 项目名称。 此值区分大小写。 myProject
{JOB-ID} 用于查找导出作业状态的 ID。 它位于 location 上一步收到的标头值中。 xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxx
{API-VERSION} 要调用的 API 的版本 2023-04-01

Headers

使用以下标头对请求进行身份验证。

Key Description 价值
Ocp-Apim-Subscription-Key 资源的键。 用于对 API 请求进行身份验证。 {YOUR-PRIMARY-RESOURCE-KEY}

响应体

发送请求后,会收到以下响应。 继续轮询此终结点,直到“状态”参数变为“已成功”。

{
  "jobId": "xxxxx-xxxxx-xxxx-xxxxx",
  "createdDateTime": "2022-04-18T15:17:20Z",
  "lastUpdatedDateTime": "2022-04-18T15:17:22Z",
  "expirationDateTime": "2022-04-25T15:17:20Z",
  "status": "succeeded"
}

训练模型

导入项目后,仅复制了项目的资产和元数据和资产。 你仍然需要训练你的模型,这会在你的帐户上产生消耗。

提交训练作业

将以下请求中的占位符替换为你的 {SECONDARY-ENDPOINT} 和你在第一步中获取的 {SECONDARY-RESOURCE-KEY}

使用以下 URL、标头和 JSON 正文创建 POST 请求以提交训练作业。

请求的 URL

创建 API 请求时,请使用以下 URL。 将占位符中的值替换为您自己的值。

{ENDPOINT}/language/authoring/analyze-conversations/projects/{PROJECT-NAME}/:train?api-version={API-VERSION}
Placeholder 价值 Example
{ENDPOINT} 用于对 API 请求进行身份验证的终结点。 https://<your-custom-subdomain>.cognitiveservices.azure.cn
{PROJECT-NAME} 项目名称。 此值区分大小写。 EmailApp
{API-VERSION} 要调用的 API 的版本 2023-04-01

Headers

使用以下标头对请求进行身份验证。

Key 价值
Ocp-Apim-Subscription-Key 资源的键。 用于对 API 请求进行身份验证。

请求主体

在请求中使用以下对象。 完成训练后,该模型将被命名为 MyModel

{
  "modelLabel": "{MODEL-NAME}",
  "trainingMode": "standard",
  "trainingConfigVersion": "{CONFIG-VERSION}",
  "evaluationOptions": {
    "kind": "percentage",
    "testingSplitPercentage": 20,
    "trainingSplitPercentage": 80
  }
}
Key Placeholder 价值 Example
modelLabel {MODEL-NAME} 模型名称。 Model1
trainingMode standard 训练模式。 业务流程中只有一种可用的训练模式,即 standard standard
trainingConfigVersion {CONFIG-VERSION} 训练配置模型版本。 默认情况下将使用最新的模型版本 2022-05-01
kind percentage 拆分方法。 可能的值为 percentagemanual。 有关详细信息,请参阅如何训练模型 percentage
trainingSplitPercentage 80 要包含在训练集中的已标记数据的百分比。 建议的值为 80 80
testingSplitPercentage 20 要包含在测试集中的已标记数据的百分比。 建议的值为 20 20

注释

仅当 trainingSplitPercentage 设置为 testingSplitPercentageKindpercentage 才是必需的,并且两个百分比的总和应等于 100。

发送 API 请求后,会收到指示 202 成功的响应。 在响应标头中,提取 operation-location 格式如下的值:

{ENDPOINT}/language/authoring/analyze-conversations/projects/{PROJECT-NAME}/train/jobs/{JOB-ID}?api-version={API-VERSION}

可以使用此 URL 获取训练作业状态。

获取定型状态

将以下请求中的占位符替换为你的 {SECONDARY-ENDPOINT} 和你在第一步中获取的 {SECONDARY-RESOURCE-KEY}

使用以下 GET 请求来获取模型在训练过程中的状态。 将占位符中的值替换为您自己的值。

请求的 URL

{ENDPOINT}/language/authoring/analyze-conversations/projects/{PROJECT-NAME}/train/jobs/{JOB-ID}?api-version={API-VERSION}
Placeholder 价值 Example
{YOUR-ENDPOINT} 用于对 API 请求进行身份验证的终结点。 https://<your-custom-subdomain>.cognitiveservices.azure.cn
{PROJECT-NAME} 项目名称。 此值区分大小写。 EmailApp
{JOB-ID} 用于查找模型训练状态的 ID。 它位于 location 提交训练作业时收到的标头值中。 xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxx
{API-VERSION} 要调用的 API 的版本 2023-04-01

Headers

使用以下标头对请求进行身份验证。

Key 价值
Ocp-Apim-Subscription-Key 资源的键。 用于对 API 请求进行身份验证。

响应正文

发送请求后,会收到以下响应。 继续轮询该端点,直到状态参数变为“已成功”。

{
  "result": {
    "modelLabel": "{MODEL-LABEL}",
    "trainingConfigVersion": "{TRAINING-CONFIG-VERSION}",
    "estimatedEndDateTime": "2022-04-18T15:47:58.8190649Z",
    "trainingStatus": {
      "percentComplete": 3,
      "startDateTime": "2022-04-18T15:45:06.8190649Z",
      "status": "running"
    },
    "evaluationStatus": {
      "percentComplete": 0,
      "status": "notStarted"
    }
  },
  "jobId": "xxxxxx-xxxxx-xxxxxx-xxxxxx",
  "createdDateTime": "2022-04-18T15:44:44Z",
  "lastUpdatedDateTime": "2022-04-18T15:45:48Z",
  "expirationDateTime": "2022-04-25T15:44:44Z",
  "status": "running"
}
Key 价值 Example
modelLabel 模型名称 Model1
trainingConfigVersion 训练配置版本。 默认使用最新版本 2022-05-01
startDateTime 开始训练的时间 2022-04-14T10:23:04.2598544Z
status 训练作业的状态 running
estimatedEndDateTime 预计的训练作业完成时间 2022-04-14T10:29:38.2598544Z
jobId 训练作业 ID xxxxx-xxxx-xxxx-xxxx-xxxxxxxxx
createdDateTime 训练作业创建日期和时间 2022-04-14T10:22:42Z
lastUpdatedDateTime 训练作业上次更新日期和时间 2022-04-14T10:23:45Z
expirationDateTime 训练作业过期日期和时间 2022-04-14T10:22:42Z

部署你的模型

此步骤通过 运行时预测 API 使训练的模型可供使用。

小窍门

使用与主要项目相同的部署名称,以便更轻松地进行维护以及对系统进行最少的更改,从而处理重定向流量。

提交部署作业

将以下请求中的占位符替换为你的 {SECONDARY-ENDPOINT} 和你在第一步中获取的 {SECONDARY-RESOURCE-KEY}

使用以下 URL、标头和 JSON 正文创建 PUT 请求,开始部署业务流程工作流模型

请求的 URL

{ENDPOINT}/language/authoring/analyze-conversations/projects/{PROJECT-NAME}/deployments/{DEPLOYMENT-NAME}?api-version={API-VERSION}
Placeholder 价值 Example
{ENDPOINT} 用于对 API 请求进行身份验证的终结点。 https://<your-custom-subdomain>.cognitiveservices.azure.cn
{PROJECT-NAME} 项目名称。 此值区分大小写。 myProject
{DEPLOYMENT-NAME} 部署名称。 此值区分大小写。 staging
{API-VERSION} 要调用的 API 的版本 2023-04-01

Headers

使用以下标头对请求进行身份验证。

Key 价值
Ocp-Apim-Subscription-Key 资源的键。 用于对 API 请求进行身份验证。

请求主体

{
  "trainedModelLabel": "{MODEL-NAME}",
}
Key Placeholder 价值 Example
trainedModelLabel {MODEL-NAME} 分配给您部署的模型名称。 只能分配已成功训练的模型。 此值区分大小写。 myModel

发送 API 请求后,会收到指示 202 成功的响应。 在响应标头中,提取 operation-location 格式如下的值:

{ENDPOINT}/language/authoring/analyze-conversations/projects/{PROJECT-NAME}/deployments/{DEPLOYMENT-NAME}/jobs/{JOB-ID}?api-version={API-VERSION}

可使用此 URL 获取部署作业状态。

获取部署状态

将以下请求中的占位符替换为你的 {SECONDARY-ENDPOINT} 和你在第一步中获取的 {SECONDARY-RESOURCE-KEY}

使用以下 GET 请求来获取部署作业的状态。 将占位符中的值替换为您自己的值。

请求的 URL

{ENDPOINT}/language/authoring/analyze-conversations/projects/{PROJECT-NAME}/deployments/{DEPLOYMENT-NAME}/jobs/{JOB-ID}?api-version={API-VERSION}
Placeholder 价值 Example
{ENDPOINT} 用于对 API 请求进行身份验证的终结点。 https://<your-custom-subdomain>.cognitiveservices.azure.cn
{PROJECT-NAME} 项目名称。 此值区分大小写。 myProject
{DEPLOYMENT-NAME} 部署名称。 此值区分大小写。 staging
{JOB-ID} 用于查找模型训练状态的 ID。 它位于 location 头信息中,这是您从 API 收到的响应,针对您的模型部署请求而提供。 xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxx
{API-VERSION} 要调用的 API 的版本 2023-04-01

Headers

使用以下标头对请求进行身份验证。

Key 价值
Ocp-Apim-Subscription-Key 资源的键。 用于对 API 请求进行身份验证。

响应正文

发送请求后,会收到以下响应。 继续轮询该端点,直到状态参数变为“已成功”。

{
    "jobId":"{JOB-ID}",
    "createdDateTime":"{CREATED-TIME}",
    "lastUpdatedDateTime":"{UPDATED-TIME}",
    "expirationDateTime":"{EXPIRATION-TIME}",
    "status":"running"
}

调用运行时方面的更改

在系统中,在调用 运行时 API 时检查提交的任务 API 返回的响应代码。 如果在提交请求时观察到持续的失败,这可能表示您的主要区域发生了中断。 一次故障并不意味着就是中断,可能只是暂时性问题。 通过创建的辅助资源重试提交作业。 对于第二个请求,使用你的{YOUR-SECONDARY-ENDPOINT}密钥和辅助密钥,如果你按照步骤操作,{PROJECT-NAME}{DEPLOYMENT-NAME}会相同,因此不需要对请求正文进行更改。

如果还原为使用辅助资源,可能会发现延迟略有增加,因为部署模型的区域存在差异。

检查项目是否不同步

这两个项目保持同步是过程的重要一环。 你需要经常检查主要项目是否进行了任何更新,以便将它们移动到辅助项目。 这样一来,如果主要区域发生故障并且你迁移到了次要区域,你应该会预料到模型性能类似,因为它已包含最新更新。 设置针对项目是否同步的检查频率是个重要选择,建议每天进行此检查,以确保辅助模型中数据的同步刷新。

获取项目详细信息

使用以下 URL 获取项目详细信息,正文中返回的键之一表示项目的最后修改日期。 对主项目重复以下步骤两次,对辅助项目重复一次。 比较两个返回的时间戳,以检查它们是否不同步。

使用以下 GET 请求获取项目详细信息。 可以使用在上一步中收到的 URL,或者将占位符值替换为自己的值。

{ENDPOINT}/language/authoring/analyze-conversations/projects/{PROJECT-NAME}?api-version={API-VERSION}
Placeholder 价值 Example
{ENDPOINT} 用于对 API 请求进行身份验证的终结点。 https://<your-custom-subdomain>.cognitiveservices.azure.cn
{PROJECT-NAME} 项目名称。 此值区分大小写。 myProject
{API-VERSION} 要调用的 API 的版本 2023-04-01

Headers

使用以下标头对请求进行身份验证。

Key Description 价值
Ocp-Apim-Subscription-Key 资源的键。 用于对 API 请求进行身份验证。 {YOUR-PRIMARY-RESOURCE-KEY}

响应体

{
  "createdDateTime": "2022-04-18T13:53:03Z",
  "lastModifiedDateTime": "2022-04-18T13:53:03Z",
  "lastTrainedDateTime": "2022-04-18T14:14:28Z",
  "lastDeployedDateTime": "2022-04-18T14:49:01Z",
  "projectKind": "Orchestration",
  "projectName": "{PROJECT-NAME}",
  "description": "This is a sample Orchestration project.",
  "language": "{LANGUAGE-CODE}"
}

将相同的步骤应用于你的复制项目,使用{SECONDARY-ENDPOINT}{SECONDARY-RESOURCE-KEY}。 比较从两个项目返回的 lastModifiedDateTime。 如果主要项目修改时间早于辅助项目,则需要重复 导出导入训练部署 模型的步骤。

后续步骤

本文介绍了如何使用导出和导入 API 将项目复制到其他区域中的辅助语言资源。 接下来请浏览 API 参考文档,以了解“创作 API”的其他作用。