Compartilhar via

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

自定义技能是实现特定接口的 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 或更低。

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

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

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

  • 使用详细的故障日志监视自定义技能,因为数据可变性可能导致特定请求一致失败。