成本优化
LLM 是 Agent 业务的最大成本。本页 6 个套路把成本降到原来的 1/3-1/10 而不损失太多质量。
套路 1:按任务路由模型
import { llm as openai, llm as anthropic, llm as haiku } from "./llm";
async function smartComplete(task: string, messages: any[]): Promise<string> { // 简单分类 / 摘要 → cheap model if (task === "classify" || task === "summarize_short") { return haiku.complete(messages); // Claude Haiku 4.5 } // 推理 / 长上下文 → strong model if (task === "reason" || task === "code") { return anthropic.complete(messages); // Claude Sonnet 4.6 } // 默认 cheap return openai.complete(messages, { model: "gpt-4o-mini" });}节省:把简单任务(80% volume)切到 cheap model → 总成本降 60-80%。
套路 2:Prompt 缓存(Anthropic / OpenAI 都已支持)
固定的 system prompt + 知识库放在请求开头标记 cache_control —
provider 自动 cache,下次调用同 prefix 时 90% 折扣。
const messages = [ { role: "system", content: [ { type: "text", text: KNOWLEDGE_BASE, // 50KB 知识库 cache_control: { type: "ephemeral" }, // ← 标缓存 }, ], }, { role: "user", content: question },];节省:高频问答场景(每用户每天 100 次同 system)→ 90% input token 折扣。
套路 3:用 Batch API 做异步任务
OpenAI Batch API + Anthropic Message Batches 都是 50% 折扣 + 24h 完成。
// 当晚生成所有用户的"明日推送"时,用 batch 提交,明早处理const batch = await openai.batches.create({ input_file_id: uploadedJsonl, endpoint: "/v1/chat/completions", completion_window: "24h",});适合:非实时任务(每日报告 / 离线分析 / 训练数据生成)。
套路 4:Token budgeting
import { encoding_for_model } from "tiktoken";
const enc = encoding_for_model("gpt-4o-mini");
function fitToBudget(messages: any[], budget: number): any[] { let total = 0; const kept: any[] = []; // system 不能砍 kept.push(messages[0]); total += enc.encode(messages[0].content).length; // 历史从最新往回加 for (let i = messages.length - 1; i >= 1; i--) { const cost = enc.encode(messages[i].content).length; if (total + cost > budget) break; kept.unshift(messages[i]); total += cost; } return kept;}
// 用法:限制 input 在 4000 token 内const fitted = fitToBudget(allMessages, 4000);const reply = await openai.chat.completions.create({ model: "gpt-4o-mini", messages: fitted });套路 5:summarize-and-prune 长对话
见 Agent 记忆设计 方案 C — 把 20+ 轮 对话摘要成 800 字段,input 从 10k token 降到 1k token。
套路 6:缓存确定性回复
import { createHash } from "node:crypto";import { Pool } from "pg";
const db = new Pool({ connectionString: process.env.DATABASE_URL });
async function cachedComplete(question: string): Promise<string> { const hash = createHash("sha256").update(question.toLowerCase().trim()).digest("hex"); const cached = await db.query( "SELECT reply FROM llm_cache WHERE prompt_hash = $1 AND created_at > NOW() - INTERVAL '7 days'", [hash], ); if (cached.rows.length > 0) return cached.rows[0].reply;
const reply = await openai.complete([/* ... */]); await db.query( "INSERT INTO llm_cache (prompt_hash, prompt, reply, created_at) VALUES ($1, $2, $3, NOW()) ON CONFLICT DO NOTHING", [hash, question, reply], ); return reply;}适合:常见 FAQ;不适合个性化对话。
真实数字(参考)
| 优化 | Before | After | 节省 |
|---|---|---|---|
| 模型路由(简单任务用 mini) | $1000/月 | $200/月 | 80% |
| Prompt 缓存(高频系统 prompt) | $500/月 | $50/月 | 90% (cache hits) |
| Batch API(非实时任务) | $300/月 | $150/月 | 50% |
| Token budgeting | $400/月 | $250/月 | 38% |
| 摘要式记忆 | $600/月 | $200/月 | 67% |
| FAQ 缓存(70% hit rate) | $400/月 | $120/月 | 70% |
监控成本
agent.addMessageHandler(async (msg) => { const start = Date.now(); const reply = await openai.complete([/* ... */]); const latency = Date.now() - start;
// 算 token + 成本(按当前价目) const inputTokens = countTokens(messages); const outputTokens = countTokens(reply); const inputCost = (inputTokens / 1_000_000) * 0.15; const outputCost = (outputTokens / 1_000_000) * 0.60;
await db.query( `INSERT INTO llm_calls (user_id, model, input_tokens, output_tokens, cost_usd, latency_ms, ts) VALUES ($1, $2, $3, $4, $5, $6, NOW())`, [msg.sender_id, "gpt-4o-mini", inputTokens, outputTokens, inputCost + outputCost, latency], );});每天 / 每用户 / 每模型成本能精确归因。
相关页面
- 切换 LLM Provider — 多 provider 抽象
- Agent 记忆设计 — 摘要式记忆降本
- Production Checklist — 监控