有效地横向扩展自定义技能

自定义技能是实现特定接口的 Web API。 可以在任何可公开寻址的资源上实现自定义技能。 最常见的自定义技能实现包括:

  • 用于自定义逻辑技能的 Azure Functions
  • 适用于简单容器化 AI 技能的 Azure Web 应用
  • 用于更复杂或更大技能的 Azure Kubernetes 服务。

技能集配置

自定义技能上的以下属性可用于缩放。 查看自定义技能接口,其中介绍了自定义技能应该实现的输入和输出。

  1. 设置自定义技能的 batchSize,以配置在一次调用技能时发送到该技能的记录数。

  2. 设置 degreeOfParallelism 以校准索引器向你的技能发出的并发请求数。

  3. timeout 设置为技能足以做出有效响应的值。

  4. indexer 定义中,将 batchSize 设置为应从数据源读取并同时扩充的文档数。

注意事项

普遍适用的建议是不存在的。 你应该计划测试不同的配置,以达到最佳结果。 纵向扩展策略基于较少的大型请求或许多小型请求。

  • 技能调用基数:确保知道自定义技能是针对每个文档(/document/content)执行一次,还是会对每个文档执行多次(/document/reviews_text/pages/*)。 如果每个文档执行多次,请保持在 batchSizedegreeOfParallelism 的较低一侧以减少改动,并尝试将索引器批大小设置为增量更高的值,以扩大规模。

  • 协调自定义技能和 batchSize 和索引器 batchSize,并确保不会制造瓶颈。 例如,如果索引器批大小为 5,并且技能批大小为 50,则需要 10 个索引器批才能填充自定义技能请求。 理想情况下,技能批大小应小于或等于索引器批大小。

  • 对于 degreeOfParallelism,可使用索引器批处理可以生成的平均请求数来指导你决定如何设置此值。 如果托管技能的基础结构(例如 Azure 函数)无法支持高级别的并发,请考虑降低并行度。 可以使用一些文档测试配置,以验证你对平均请求数的理解。

  • 尽管你的对象是大规模并且支持高容量,但使用较小的文档示例进行测试有助于量化不同的执行阶段。 例如,可以评估相对于执行文档子集所用总时间的技能执行时间。 这有助于回答问题:索引器是否在生成批或等待技能的响应方面使用了更多时间?

  • 请考虑并行度的上游含义。 如果自定义技能的输入是先前技能的输出,则是否有效横向扩展了技能组中的所有技能以最大程度地减少延迟?

自定义技能中的错误处理

技能成功完成后,自定义技能应返回成功状态代码 HTTP 200。 如果批中的一个或多个记录导致错误,请考虑返回多状态代码 207。 记录的错误或警告列表应包含相应的消息。

批中的任何项目出错都将导致相应文档失败。 如果需要文档成功,则返回警告。

超过 299 的任何状态代码都将视为错误,并且所有扩充操作均失败,从而导致文档失败。

常见错误消息

  • Could not execute skill because it did not execute within the time limit '00:00:30'. This is likely transient. Please try again later. For custom skills, consider increasing the 'timeout' parameter on your skill in the skillset. 在技能上设置超时参数,以允许更长的执行时间。

  • Could not execute skill because Web Api skill response is invalid. 指示技能未以自定义技能响应格式返回消息。 这可能是因为技能中出现未捕获的异常。

  • Could not execute skill because the Web Api request failed. 很可能是由授权错误或异常引起的。

  • Could not execute skill. 通常是因为技能响应映射到文档层次结构中的现有属性。

测试自定义技能

首先用 REST API 客户端测试自定义技能,以验证:

  • 技能为请求和响应实现自定义技能接口

  • 技能返回 application/JSON MIME 类型的有效 JSON

  • 返回有效的 HTTP 状态代码

创建一个调试会话,将你的技能添加到技能集中,并确保它生成有效的扩充。 虽然调试会话不允许你调整技能的性能,但通过该会话可确保使用有效值配置技能并返回预期的扩充对象。

最佳做法

  • 尽管技能可以接受和返回更大的有效负载,但在返回 JSON 时,请考虑将响应限制为 150 MB 或更低。

  • 请考虑在索引器和技能上设置批大小,以确保每个数据源批为你的技能生成一个完整的有效负载。

  • 对于长期任务,请将超时设置为足够大的值,以确保索引器不会在并发处理文档时出错。

  • 优化索引器批大小、技能批大小和技能并行度,以生成技能期望的负载模式(较少的大型请求或多个小型请求)。

  • 使用详细的故障日志监视自定义技能,因为你可能会遇到由于数据可变性导致特定请求不断失败的情况。