重试与回退机制
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_mini
或claude_3_5_haiku
)。
如果所有这些变体都失败,网关将采样并尝试未指定权重的变体(gemini_1_5_flash_8b
或ministral_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
策略组合
我们可以组合多种策略来定义复杂的回退行为。
网关将按顺序尝试以下策略:
- 模型供应商路由
- 变体重试
- 变体回退机制
换句话说,网关将遵循类似以下伪代码的策略。
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_A
和gpt_4o_mini_api_key_B
)之间分配流量。
每个变体都利用了使用不同API密钥(OPENAI_API_KEY_A
和OPENAI_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
回退机制会分别应用于每个独立的模型推理过程。