跳至内容

重试与回退机制

TensorZero网关提供多种策略来处理错误并提高可靠性。

这些策略在三个层级上定义:模型(模型提供者路由)、变体(变体重试)和函数(变体回退)。您可以通过组合这些策略来定义复杂的回退行为。

模型供应商路由

我们可以通过模型的routing字段指定其在多个提供商上可用。 如果在列表中包含多个提供商,网关将依次尝试每个提供商,直到其中一个成功或全部失败。

在下面的示例中,网关将首先尝试OpenAI,如果失败,则会尝试Azure。

[models.gpt_4o_mini]
# Try the following providers in order:
# 1. `models.gpt_4o_mini.providers.openai`
# 2. `models.gpt_4o_mini.providers.azure`
routing = ["openai", "azure"]
[models.gpt_4o_mini.providers.openai]
type = "openai"
model_name = "gpt-4o-mini-2024-07-18"
[models.gpt_4o_mini.providers.azure]
type = "azure"
deployment_id = "gpt4o-mini-20240718"
endpoint = "https://your-azure-openai-endpoint.openai.azure.com"
[functions.extract_data]
type = "chat"
[functions.extract_data.variants.gpt_4o_mini]
type = "chat_completion"
model = "gpt_4o_mini"

变体重试

我们可以为变体添加一个retries字段,用于指定该变体失败时的重试次数。 重试策略采用带抖动的截断指数退避算法。

在下面的示例中,网关将重试该变体四次(即总共五次尝试),重试之间的最大延迟为10秒。

[functions.extract_data]
type = "chat"
[functions.extract_data.variants.claude_3_5_haiku]
type = "chat_completion"
model = "anthropic::claude-3-5-haiku-20241022"
# Retry the variant up to four times, with a maximum delay of 10 seconds between retries.
retries = { num_retries = 4, max_delay_s = 10 }

变体回退机制

如果我们为一个函数指定了多个变体,网关将尝试不同的变体,直到其中一个成功或全部失败。 采样行为取决于权重的指定方式:

  • 如果未为任何变体指定权重,网关将在它们之间均匀采样。
  • 如果某个变体的权重设置为零,除非在推理时显式使用variant_name进行固定,否则永远不会被采样。
  • 如果混合了带正权重和未指定权重的变体,网关会优先采样正权重变体,仅将未指定权重的变体作为备用选项。

在下面的示例中,网关将首先采样并尝试具有正权重的变体(gpt_4o_miniclaude_3_5_haiku)。 如果所有这些变体都失败,网关将采样并尝试未指定权重的变体(gemini_1_5_flash_8bministral_8b)。 网关永远不会采样权重为零的变体(ministral_8b),除非在推理时显式指定。

[functions.extract_data]
type = "chat"
[functions.extract_data.variants.gpt_4o_mini]
type = "chat_completion"
model = "openai::gpt-4o-mini-2024-07-18"
weight = 0.7
[functions.extract_data.variants.claude_3_5_haiku]
type = "chat_completion"
model = "anthropic::claude-3-5-haiku-20241022"
weight = 0.3
[functions.extract_data.variants.gemini_1_5_flash_8b]
type = "chat_completion"
model = "google_ai_studio_gemini::gemini-1.5-flash-8b"
[functions.extract_data.variants.grok_2]
type = "chat_completion"
model = "xai::grok-2-1212"
[functions.extract_data.variants.ministral_8b]
type = "chat_completion"
model = "mistral::ministral-8b-2410"
weight = 0

策略组合

我们可以组合多种策略来定义复杂的回退行为。

网关将按顺序尝试以下策略:

  1. 模型供应商路由
  2. 变体重试
  3. 变体回退机制

换句话说,网关将遵循类似以下伪代码的策略。

while variants:
# First sample variants with non-zero weight, then variants with zero weight
variant = sample_variant(variants) # sampling without replacement
for _ in range(num_retries):
for provider in variant.routing:
try:
return inference(variant, provider)
except:
continue

负载均衡

TensorZero目前没有提供明确的API密钥负载均衡策略,但您可以通过定义多个具有适当权重的变体来实现类似效果。 我们计划在未来添加一个简化的负载均衡策略。

在下面的示例中,网关将在两个变体(gpt_4o_mini_api_key_Agpt_4o_mini_api_key_B)之间分配流量。 每个变体都利用了使用不同API密钥(OPENAI_API_KEY_AOPENAI_API_KEY_B)的提供商模型。 有关凭证管理的更多详情,请参阅Credential Management

[models.gpt_4o_mini_api_key_A]
routing = ["openai"]
[models.gpt_4o_mini_api_key_A.providers.openai]
type = "openai"
model_name = "gpt-4o-mini-2024-07-18"
api_key_location = "env:OPENAI_API_KEY_A"
[models.gpt_4o_mini_api_key_B]
routing = ["openai"]
[models.gpt_4o_mini_api_key_B.providers.openai]
type = "openai"
model_name = "gpt-4o-mini-2024-07-18"
api_key_location = "env:OPENAI_API_KEY_B"
[functions.extract_data]
type = "chat"
[functions.extract_data.variants.gpt_4o_mini_api_key_A]
type = "chat_completion"
model = "openai::gpt-4o-mini-2024-07-18"
weight = 0.5
[functions.extract_data.variants.gpt_4o_mini_api_key_B]
type = "chat_completion"
model = "openai::gpt-4o-mini-2024-07-18"
weight = 0.5

技术说明

  • 对于需要多次模型推理的变体类型(例如N选一采样),routing回退机制会分别应用于每个独立的模型推理过程。