做 AI 应用,Agent 调 SERP 接口时有个隐蔽的成本坑:失败重试。Agent 超时了会重试,如果服务对失败也收费,或者重试重复扣费,账单会悄悄翻倍。
摘要:本文针对 AI Agent 调用 SERP 接口时因失败重试导致的成本问题,提出了一套完整的成本优化方案。通过缓存机制避免重复查询,结合幂等键(Idempotency-Key)确保重试不重复扣费,并选择支持失败退款的 API 服务作为兜底。文章详细介绍了三件套(缓存、重试+幂等、失败退款)的实现方法,提供了完整的 Python 代码示例,并通过对比表格展示了不同方案的效果。关键注意事项包括幂等键必须在循环外生成、缓存按场景分 TTL、重试次数限制等,帮助开发者在 AI 应用场景中有效控制重试成本。
这篇讲怎么设计失败重试 + 幂等,让重试不白烧钱。
问题:Agent 会重试
AI Agent 调用不稳定:
- 网络抖动 → 超时 → 重试
- 服务端偶发错误 → 重试
- 同一个意图 → 换个措辞再查一次
每次重试都是钱。设计不好,成本翻倍。
三件套:缓存 + 重试 + 幂等
1. 缓存:同 query 重复查询不重新花钱
import redis
r = redis.Redis()
def cached_search(query, **params):
key = f"serp:{query}:{params.get('gl','cn')}"
cached = r.get(key)
if cached:
return cached.decode(), "cache"
return None, None
2. 重试带幂等 key:重试复用同一个 key,不重复扣费
def search_with_retry(query, **params):
import uuid
idem_key = str(uuid.uuid4()) # 循环外生成一次!
for attempt in range(3):
try:
return _call(query, idem_key, **params)
except (Timeout, ConnectionError):
if attempt == 2:
raise
import time
time.sleep(2 ** attempt) # 1s, 2s
def _call(query, idem_key, **params):
import requests
r = requests.post(
"https://api.serpbase.dev/google/search",
headers={"X-API-Key": "你的key", "Idempotency-Key": idem_key},
json={"q": query, "hl": "zh-CN", "gl": "cn", **params},
timeout=5,
)
r.raise_for_status()
return r.json()
关键:idem_key 必须在循环外生成一次。如果在每次重试里新建,等于没有幂等,服务端会把重试当成新请求。
3. 失败退款兜底:选一个失败自动退积分的服务
SerpBase 失败请求自动退积分,超时不计入 credits_charged。这样即使重试,失败的那次也不扣钱。
完整组合
def agent_search(query, **params):
# 1 查缓存
cached, _ = cached_search(query, **params)
if cached:
return cached, "cache"
# 2 调接口 + 重试(带幂等 key)
data = search_with_retry(query, **params)
# 3 写缓存
r.setex(f"serp:{query}:{params.get('gl','cn')}", 300, json.dumps(data))
return data, "miss"
效果
| 只重试,无幂等 | 1.2% | 96% |
| 重试 + 幂等 key | 0 | 96% |
| + 失败退款服务 | 0 | 96%,失败不扣钱 |
注意
完整参数和响应字段参考:serpbase.dev/docs。AI 场景的重试成本,设计好能省一大截。
网硕互联帮助中心



评论前必须登录!
注册