做 LLM 应用有四件事每次都要做对一次然后不再回头:日志、缓存、重试、估值。
日志:每一笔 token 都要记录
log.info("llm_call", extra={
"model": model,
"input_tokens": in_tok,
"output_tokens": out_tok,
"duration_ms": duration,
"prompt_id": prompt_hash,
"trace_id": trace_id,
})
只有当 trace_id 能从用户消息一路串联到 LLM 回复再到下游处理时,日志才有用。
缓存:避免在 token 计费上重复花钱
任何 temperature=0 或可重跑的请求都应该走 LRU 缓存。键通常是 prompt_hash + model + temperature。
@lru_cache(maxsize=2048)
def cached_llm(prompt_hash: str, model: str, temperature: float) -> str:
return real_llm_call(prompt_hash, model, temperature)
重试:错误的不是失败,是不知道失败
429 / 5xx 必须指数退避重试 3 次。4xx 不要重试(说明请求本身有问题)。
retries = 0
while retries < 3:
try:
return real_call()
except RateLimitError:
time.sleep(2 ** retries)
retries += 1
估算:每天跑之前先知道今天会花多少
最简单的做法:把单次平均成本记下来,乘以每日预期调用次数 + 一个3 倍缓冲,再分配到 tokens/dollar 而不是只盯着"额度"。