prompt-token-guardrail · ZH · 2026-10-23

逮住那条悄悄涨了五倍的提示词:在一把 key 上做发送前的 token 预算检查

本文介绍如何在本地为 LLM 请求添加 token 计数护栏,在调用聚合站前估算提示词长度,通过预检查避免因上下文膨胀导致的意外扣费。内容涵盖估算方法、阈值告警与集成示例,适用于使用多模型 API 的开发者。

为什么需要发送前的 token 检查

在调用 LLM API 时,计费通常基于实际消耗的 token 数量。如果你在代码中拼接上下文、历史对话或检索结果,很容易在不知不觉中让提示词长度膨胀。当请求发往聚合站后,账单会按 token 数乘以倍率扣费;如果上下文失控,可能产生意外成本。本地 token 检查就像一道护栏,在请求发出前估算长度,让你在扣费发生前发现问题。

估算 token 的实用方法

不同模型的分词器不同,精确计数需要对应模型的分词库。但在本地预检查阶段,你可以使用近似估算:

  • 按字符数估算:对于英文,约 4 个字符 ≈ 1 token;对于中文,约 1.5-2 个字符 ≈ 1 token。这是一种快速但粗略的方法。
  • 使用通用分词器:如 tiktoken(针对 OpenAI 模型)或 transformers 的 tokenizer,选择与你目标模型接近的分词器进行估算。
  • 保留安全边际:由于估算误差,建议在阈值上留出 10%-20% 的缓冲。

关键不是追求绝对精确,而是在请求发出前获得一个可靠的量级判断。

实现一个简单的预检查函数

以下是一个 Python 示例,使用字符数估算和阈值告警:

def estimate_tokens(text, lang="en"):
    if lang == "zh":
        return len(text) / 1.8
    return len(text) / 4

def check_prompt_budget(prompt, max_tokens=8000, lang="en"):
    estimated = estimate_tokens(prompt, lang)
    if estimated > max_tokens:
        raise ValueError(f"提示词估计 {estimated:.0f} tokens,超过预算 {max_tokens}")
    if estimated > max_tokens * 0.8:
        print(f"警告:提示词估计 {estimated:.0f} tokens,接近预算上限")
    return estimated

在每次构造请求时调用 checkpromptbudget,如果超出阈值就阻止发送或记录日志。

与聚合站调用集成

聚合站通常提供兼容 OpenAI 的接口。你可以在构造请求体之前插入检查:

import openai

def call_llm(messages, model="gpt-4"):
    full_prompt = "\n".join(m["content"] for m in messages)
    check_prompt_budget(full_prompt, max_tokens=8000)
    response = openai.ChatCompletion.create(
        model=model,
        messages=messages,
        api_key="YOUR_API_KEY",
        base_url="https://api.example.com/v1"
    )
    return response

这样,任何因上下文拼接导致的异常长度都会在本地被拦截,而不是等到账单出来才发现。

动态调整与告警策略

固定阈值可能不适用于所有场景。你可以根据模型上下文窗口和预算动态设置阈值:

  • 对于长上下文模型,可以放宽阈值,但仍需设置上限。
  • 将估算值记录到日志或监控系统,观察趋势。
  • 当接近阈值时,除了告警,还可以自动截断历史消息或摘要上下文。

总结

在提示词发往聚合站前加入一层本地 token 计数护栏,是一种低成本、高收益的实践。它帮助你及早发现上下文膨胀,避免因疏忽导致的额外扣费。结合近似估算与阈值告警,你可以在不牺牲开发效率的前提下,更好地控制 API 成本。