我如何在不改动任何代码的情况下将我的 AI 应用成本削减 52%
Source: Dev.to
请提供您希望翻译的文章正文内容,我将为您翻译成简体中文并保留原有的格式、Markdown 语法以及技术术语。谢谢!
问题:对实际费用缺乏可见性
- 技术栈: Next.js 前端 → Node 后端 → 直接调用 OpenAI
chat/completions - 痛点: 我可以看到 OpenAI 的总账单和请求次数,但我 不知道哪些功能导致了费用。
- 是邮件摘要吗?
- 是建议回复生成吗?
- 是对每条消息进行情感分析吗?
没有每个功能的费用数据,我无法对优化进行优先级排序。
我最初尝试的办法(未成功)
| 尝试 | 我的做法 | 结果 |
|---|---|---|
| 1. 手动日志记录 | 在每次 LLM 调用周围添加日志,以跟踪 token 使用情况。 | 漏掉了输出 token,流式响应直到结束才暴露 token 数量 → 数据不可靠。 |
| 2. 使用更便宜的模型 | 将“简单”任务从 GPT‑4 切换到 GPT‑3.5‑Turbo。 | 仅约 15 % 的节省;质量明显下降,用户投诉。 |
| 3. 提示词优化 | 缩短提示词,删除示例,精简系统消息。 | 大约 10 % 的 token 减少,但导致模型误解指令的 bug。工程投入不值得。 |
然后我找到了 Bifrost
我在寻找一个 LLM 可观测性工具时,看到 Bifrost 被描述为 “LLM 网关”。我觉得它功能有点过剩——我的需求只是成本可视化——但它的部署看起来很简单,于是我就尝试了一下。
单行代码更改
之前
const openai = new OpenAI({
apiKey: process.env.OPENAI_API_KEY
});
之后
const openai = new OpenAI({
baseURL: "http://localhost:8080/openai",
apiKey: "bifrost-key"
});
Bifrost 现在位于我的应用和 OpenAI 之间;其余代码保持不变。
我在第一周学到的东西
Bifrost 的仪表盘显示 每个端点、每位用户、每个模型 的成本。最终得到的数据令人震惊:
- Email summarization = 61 % of total costs – it ran on every incoming email, even on one‑sentence queries where GPT‑4 was overkill.
- One customer accounted for 18 % of the monthly bill – they were hammering the API; I had no rate‑limiting in place.
- Sentiment analysis was both useless and expensive – the score was never used. Removing the feature saved ≈ $800/mo.
我所做的更改(以及结果)
-
将邮件摘要切换至 GPT‑3.5‑Turbo
- 仅针对字数 ≤ 100 词的邮件;更长的邮件仍使用 GPT‑4。
- 此功能的成本下降 42 %,且质量没有下降。
-
新增按客户限流
- Bifrost 为每个虚拟密钥提供限流。
- 创建了分层密钥(免费、付费、企业)。
- 那个占用预算 18 % 的“免费层”客户现在被限制为 100 次请求/天;他们已升级至付费计划。
-
启用语义缓存
- Bifrost 基于向量相似度缓存请求,即使表述不同,只要语义相同也能命中缓存。
- 示例缓存命中:
- “How do I reset my password?”
- “I forgot my password, what should I do?”
- “Can’t log in, need password reset”
- 实现了 ≈ 47 % 的缓存命中率,几乎消除了半数的 LLM 调用。
-
设置成本警报
- 为每个密钥设定预算上限,并在月预算的 80 % 时触发警报。
- 现在我能在成本激增的数小时内收到警告。
60 天后的结果
| 期间 | LLM 成本 |
|---|---|
| 第1个月(pre‑Bifrost) | $6,200 |
| 第2个月(post‑changes) | $2,950 |
总体降幅: ≈ 52 %,功能和质量保持不变,仅更改了一行端点。
节省细目
| 来源 | 约每月节省 |
|---|---|
| 语义缓存 | $1,800 |
| 更智能的模型选择 | $900 |
| 限制滥用使用的速率 | $400 |
| 移除无用功能(情感) | $800 |
Source: …
我未预料到的次要收益
- 自动故障转移 – Bifrost 可以路由到多个提供商。我添加了 Anthropic(Claude)作为备份;在上个月 OpenAI 发生 4 小时宕机期间,流量自动切换到 Claude,用户毫无感知。
- 统一可观测性 – 所有 LLM 流量(包括未来的提供商)现在都在同一个仪表盘中可见,简化了后续的扩展决策。
TL;DR
一个简单的“网关”层(Bifrost)让我获得了所需的可视性,以便:
- 识别浪费的功能。
- 应用模型层面的成本优化。
- 强制执行每位客户的使用上限。
- 利用语义缓存。
结果:在 LLM 开支上 每月节省 3.2 千美元,利润更健康,可靠性更佳——只需一次代码改动。
新 – 我查看了仪表盘,看到流量已切换。
在使用 Bifrost 之前,这次宕机将意味着我的产品 整整 4 小时 完全不可用。
更好的调试
Bifrost 中的请求日志会显示每次调用的完整提示、响应、令牌计数和延迟。当用户报告问题时,我可以搜索他们的对话,准确查看 LLM 收到的内容以及返回的内容。
这远比我之前通过在应用日志中 grep 并希望记录了正确信息的做法要好得多。
无供应商锁定
因为 Bifrost 抽象了提供商,我可以在不更改代码的情况下测试不同的模型。我已经进行实验,将 10 % 的流量路由到 Claude,以比较质量。如果 OpenAI 的定价发生变化,我可以在配置中切换提供商——而不是在代码库中更改。
我会做的不同之处
如果让我重新开始,我会在第 1 天就部署 Bifrost,而不是等到六个月后。
- 仅仅是可见性就已经值得。
- 即使你还没有在优化成本,了解钱花在哪里也能帮助你做出更好的产品决策。
我还会立即启用语义缓存。当前我看到的 47 % 缓存命中率意味着我在前六个月的重复请求上浪费了 ≈ $3,000。
技术设置(给好奇的你)
- 基础设施 – Bifrost 自托管在
t3.smallEC2 实例上($15 / 月)。 - 负载 – 每月处理 15 000 请求,零问题。
- 内存 – 大约 120 MB。
- 语义缓存 – 使用 Weaviate 进行向量存储(免费自托管版)。
LLM 网关的总基础设施成本:$15 / 月。
成本节省在第一周就已收回。
这仅仅是为了成本优化吗?
不。这段关于成本的故事吸引了我,但 Bifrost 成为了我的 LLM 基础设施层。它能够处理:
| 功能 | 描述 |
|---|---|
| 路由 | 大多数请求使用 OpenAI,较长上下文使用 Claude |
| 缓存 | 语义相似度 |
| 速率限制 | 按客户层级 |
| 故障转移 | 自动备份到 Claude |
| 可观测性 | 请求日志、成本跟踪、延迟 |
| 治理 | 预算限制、使用警报 |
全部实现而无需在我的应用代码中增加复杂性。我的后端仍然只调用 openai.chat.completions.create(),其他一切都透明地完成。
结论
我在不更改产品、不降低质量,也不花数周时间进行优化的情况下,将 AI 成本 削减了一半。
关键在于能够看到实际昂贵的部分,然后进行有针对性的改动,而不是盲目猜测。
如果你在生产环境中运行基于 LLM 的功能,却没有对每个端点进行成本跟踪,那就是在盲目飞行。Bifrost 为我提供了停止浪费金钱所需的数据。
设置
- GitHub:
- Docs:
大约 10 分钟 就能在本地启动运行。
对所有使用 LLM 的开发者来说:在需要之前就加入可观测性。等账单来了,未来的你会感谢现在的决定。