我312美元Anthropic账单的60%源于一个缺失的模式:补偿性操作

发布日期:2026-06-24 10:03:21   浏览量 :4
发布日期:2026-06-24 10:03:21  
4

上个月,安思罗皮克(Anthropic)的账单为 312 美元。在进行一次架构调整后,五月的费用降至 156 美元——恰好减半。问题根源并非提示词冗长或模型选择不当,而是我的多步骤智能体工作流中缺乏补偿性操作。

这种模式普遍得令人尴尬:一个五步流水线在第四步失败,于是你从头重新开始。每次重启都会重新执行失败点之前的所有大语言模型调用。我的广告分析软件即服务产品使用克劳德·索内特(Claude Sonnet)在第二步中汇总原始数据。该步骤平均每位广告主消耗约 8000 个输入令牌。以每百万令牌 3 美元的价格(索内特 3.7 版),单次重启成本为 0.024 美元——单独看微不足道,但我有 200 多位广告主,且该流水线在四月反复失败。仅第二步就因重复调用烧掉了 40 至 50 美元。

更深层的问题在于:我完全没有回滚机制。当第五步(向广告主门户发送 Slack 网络钩子请求)因冷启动工作器返回 503 错误而失败时,R2 中已存在文件,D1 中已存在日志行。重启流水线导致了重复文件和重复数据库行的产生,还有一位广告主询问为何收到两份相同的报告。我曾假设“重启等于安全”,但这一假设是错误的。

解决方案包含两部分。首先,我在每次运行开始时写入一行 pipeline_runs 记录,并在每个步骤成功后更新该记录,添加 step_completed 检查点以及 step_output_ref(实际的 R2 键名或 D1 行 ID)。其次,在失败时,rollbackPipelineRun() 函数读取这些引用并删除已写入的内容——移除 R2 文件,删除 D1 行,并将状态翻转为 rolled_back。在重试时,智能体会检查是否存在正在进行的运行,并完全跳过已完成的步骤:

if (existingRun && existingRun.step_completed >= 2) {
  summary = existingRun.cached_summary; // 无需调用克劳德
} else {
  summary = await callClaude(data);
}

幂等键在此处无法解决的一个问题是:它们能防止重复的副作用,但不能防止在相同的大语言模型调用上重新消耗令牌。你需要两者兼备——存储写入操作的幂等性以及推理步骤的检查点缓存。

目前仍存在一些粗糙之处:当同一广告主的两个运行同时启动时会出现竞态条件(D1 不能完全保证 SELECT 和 INSERT 之间的可串行化隔离),并且对于已发送电子邮件或已处理支付等真正不可逆的操作,尚无完美的解决方案。

我在 riversealab.com 上撰写了完整的分析文章——包括我尚未修复的竞态条件,以及为何持久化对象可能是解决方案。

阅读全文 →

免责声明:本文内容来自互联网,该文观点不代表本站观点。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请到页面底部单击反馈,一经查实,本站将立刻删除。

关于我们
热门推荐
合作伙伴
免责声明:本站部分资讯来源于网络,如有侵权请及时联系客服,我们将尽快处理
Copyright © 2025-2027 ToB产业网址导航 公安备案 浙公网安备33010602013138号 浙ICP备16025413号-9
支持 反馈 关注 数据