Перейти к содержимому
Tutorial

Подсчет токенов для GPT, Claude и Llama в одном API

| 7 min read

Подсчитывайте и усекайте токены в 15 моделях LLM с помощью одного запроса POST. Предотвращайте переполнение контекстных окон и оценивайте затраты перед каждым вызовом API.

AI model comparison dashboard
Photo by Possessed Photography on Unsplash

Вы отправляете запрос на GPT-4o, и ответ обрывается на полуслове. Вы проверяете свой счет и обнаруживаете пакетное задание сожгло 40 долларов, потому что входные данные оказались в 3 раза больше, чем вы ожидали. Вы вставляете длинный документ в Клод и получаю ошибку: превышено окно контекста. Каждая из этих проблем связана вернемся к той же первопричине; вы не знали, сколько токенов содержало ваше сообщение, прежде чем отправить его.

Подсчет токенов — это предполетная проверка, необходимая для каждой интеграции LLM. Подсчет символов вам не поможет. Подсчет слов дает вам приблизительный результат, но токенизаторы разделяют текст по-разному в зависимости от модели. Вам нужно точное количество для модели, которую вы вызываете.

Почему количество символов не является количеством токенов

LLM не обрабатывают необработанные символы. Они разбивают текст на токены с помощью токенизатора, который представляет собой словарь подслов, обученный на большом корпусе. Сопоставление текста с токенами неочевидны и зависят от модели.

Несколько примеров, показывающих, почему подсчет символов вводит вас в заблуждение:

  • «Я не могу» разбивается на 3 токена в GPT-4: I, can, 't. Это 7 символов, но 3 жетона.
  • «антидезистэблишментарианство» одно слово, но 6-8 токенов в зависимости от модель. Токенизатор разбивает его на распознаваемые подслова.
  • "Привет" это 1 жетон. " Привет" (с ведущими пробелами) может быть 2 токена, потому что пробел получает свой собственный токен.
  • Фрагменты кода токенизировать иначе, чем прозу. Фигурные скобки, точки с запятой и каждый отступ потребляет токены. Функция длиной 500 символов может легко стоить более 200 токенов.

В моделях GPT используется BPE (кодирование парами байтов) со словарем cl100k_base или o200k_base. Клод использует аналогичный, но отличный токенизатор BPE. Лама использует SentencePiece. Один и тот же абзац порождает разные токен учитывается во всех трех.

Подсчет токенов с помощью одного вызова API

Отправьте свое сообщение на botoi /v1/token/count конечная точка с целевой моделью. API возвращает предполагаемое количество токенов, а также количество символов и слов.

curl -X POST https://api.botoi.com/v1/token/count \\
  -H "Content-Type: application/json" \\
  -d '{
    "text": "The quick brown fox jumps over the lazy dog. This sentence is used to test tokenizers across different language models.",
    "model": "gpt-4o"
  }'

Ответ:

{
  "success": true,
  "data": {
    "tokens": 24,
    "model": "gpt-4o",
    "method": "estimated",
    "characters": 116,
    "words": 20
  }
}

В ответе сообщается, что это предложение из 20 слов стоит 24 токена в GPT-4o. Вы также получаете characters и words для быстрого ознакомления. method поле указывает используемый метод подсчета.

Количество токенов по модели

Один и тот же текст создает разное количество токенов в зависимости от целевой модели. model Параметр принимает 15 моделей основных семейств. Вот как они сравниваются для того же ввода:

Модель токенизатор Контекстное окно Токены (тот же текст)
gpt-4o o200k_base (БПЭ) 128 тыс. 24
gpt-3.5-турбо cl100k_base (БПЭ) 16К 24
Клод-3.5-сонет Клод БПЭ 200 тыс. 25
закрыть-4-работа Клод БПЭ 200 тыс. 25
лама-3.2 ПредложениеЧасть 128 тыс. 24
Близнецы-2.0-вспышка ПредложениеЧасть 24
мистраль Часть предложения (BPE) 32К 24

Различия невелики для коротких английских предложений, но увеличиваются по мере увеличения длины ввода. Неанглийский текст, код и структурированные данные (JSON, XML) могут иметь большие различия. Всегда считайте жетоны с конкретную модель, которую вы планируете назвать.

Обрезать текст до лимита токенов

Если ваше приглашение выходит за пределы контекстного окна, вам необходимо обрезать его, не разрывая середину слова. /v1/token/truncate конечная точка обрезает текст до целевого количества токенов на границе слова.

curl -X POST https://api.botoi.com/v1/token/truncate \\
  -H "Content-Type: application/json" \\
  -d '{
    "text": "You are a helpful assistant. Summarize the following document in three bullet points. The document discusses the impact of renewable energy adoption on global carbon emissions over the past decade, with specific focus on solar and wind installations in Europe and Southeast Asia.",
    "max_tokens": 20,
    "model": "claude-3.5-sonnet"
  }'

Ответ:

{
  "success": true,
  "data": {
    "truncated": "You are a helpful assistant. Summarize the following document in three bullet points. The",
    "tokens": 18,
    "was_truncated": true,
    "model": "claude-3.5-sonnet",
    "max_tokens": 20,
    "original_tokens": 48
  }
}

В исходной подсказке было 48 жетонов. API сократил его до 18 токенов (в рамках бюджета в 20 токенов). на чистой границе слова. was_truncated Флаг сообщает вам, был ли текст изменен. original_tokens Поле показывает, сколько токенов содержится в полном тексте.

Это полезно для адаптации системных подсказок к ограниченному бюджету токенов, обрезки истории чата, чтобы сохранить ее. в контекстном окне и разбиение документов на фрагменты перед отправкой их в API внедрения.

Создайте предполетную проверку для звонков LLM

Интеграция с наивысшей ценностью: функция, которая подсчитывает токены и сравнивает их с контекстом модели. окно и усекается, если приглашение слишком длинное. Это предотвращает как автоматическое усечение, так и ошибки API.

const MODEL_LIMITS = {
  "gpt-4o": 128000,
  "gpt-4o-mini": 128000,
  "claude-3.5-sonnet": 200000,
  "claude-4-sonnet": 200000,
  "llama-3.2": 128000,
};

async function countTokens(text, model = "gpt-4o") {
  const res = await fetch("https://api.botoi.com/v1/token/count", {
    method: "POST",
    headers: { "Content-Type": "application/json" },
    body: JSON.stringify({ text, model }),
  });
  const { data } = await res.json();
  return data.tokens;
}

async function truncateText(text, maxTokens, model = "gpt-4o") {
  const res = await fetch("https://api.botoi.com/v1/token/truncate", {
    method: "POST",
    headers: { "Content-Type": "application/json" },
    body: JSON.stringify({ text, max_tokens: maxTokens, model }),
  });
  const { data } = await res.json();
  return data;
}

async function preflightCheck(prompt, model = "gpt-4o") {
  const limit = MODEL_LIMITS[model];
  if (!limit) throw new Error("Unknown model: " + model);

  const tokens = await countTokens(prompt, model);

  // Reserve 20% of the context window for the model's response
  const inputBudget = Math.floor(limit * 0.8);

  if (tokens <= inputBudget) {
    return { safe: true, tokens, limit, model };
  }

  // Truncate to fit within the input budget
  const result = await truncateText(prompt, inputBudget, model);

  return {
    safe: false,
    original_tokens: tokens,
    truncated_tokens: result.tokens,
    truncated_text: result.truncated,
    limit,
    model,
  };
}

// Usage
const prompt = buildPromptFromChatHistory(messages);
const check = await preflightCheck(prompt, "claude-3.5-sonnet");

if (!check.safe) {
  console.log(
    "Prompt truncated from " +
    check.original_tokens + " to " +
    check.truncated_tokens + " tokens"
  );
  prompt = check.truncated_text;
}

const response = await callLLM(prompt, "claude-3.5-sonnet");

Функция резервирует 20% контекстного окна для ответа модели. Если входные данные подходят, это проходит без изменений. Если он слишком велик, он усекается до входного бюджета. Ты всегда точно знать, сколько токенов вы отправляете.

Оберните это вокруг каждого звонка LLM в вашем приложении. Он добавляет один HTTP-запрос (два, если усечение необходимо) и устраняет целый класс производственных отказов.

Реальные варианты использования

  • Оценка стоимости перед вызовами API. Подсчитайте токены в пакете подсказок, умножьте по цене за токен модели и узнайте общую стоимость перед совершением сделки. Эта функция Node.js делает это в несколько строк:
async function estimateCost(text, model = "gpt-4o") {
  const tokens = await countTokens(text, model);

  // Price per 1M input tokens (March 2026 pricing)
  const rates = {
    "gpt-4o": 2.50,
    "gpt-4o-mini": 0.15,
    "claude-3.5-sonnet": 3.00,
    "claude-4-sonnet": 4.00,
    "llama-3.2": 0.00,  // self-hosted
  };

  const rate = rates[model] || 0;
  const cost = (tokens / 1_000_000) * rate;

  return {
    tokens,
    model,
    estimated_cost_usd: cost.toFixed(6),
  };
}

// Check cost before sending a large document
const estimate = await estimateCost(longDocument, "gpt-4o");
console.log(estimate);
// { tokens: 14320, model: "gpt-4o", estimated_cost_usd: "0.035800" }
  • Оперативная проверка размера. Отклонять или обрезать отправленные пользователем запросы, которые превышают ваши бюджет токенов приложения. Не позволяйте одному длинному вводу использовать весь ваш лимит скорости.
  • Разбиение документов на части для вложений. Разделите длинные документы на подходящие фрагменты в пределах лимита токенов вашей модели внедрения (обычно 512 или 8192 токенов). Считать жетоны за chunk, чтобы гарантировать, что никто не превысит лимит.
  • Управление историей чата. По мере роста разговоров старые сообщения увеличивают общее количество количество токенов за пределами контекстного окна. Подсчитайте совокупное количество жетонов после каждого сообщения и удалять самые старые сообщения при приближении к пределу.
  • Охранники конвейера CI/CD. Добавьте шаг подсчета токенов в конвейер развертывания. Если шаблон запроса превышает определенный порог, сборка завершается неудачей до того, как она достигнет рабочей среды.

Ключевые моменты

  • Количество токенов зависит от модели. GPT, Claude и Llama токенизируют один и тот же текст. по-другому. При подсчете всегда указывайте целевую модель.
  • Две конечные точки охватывают весь рабочий процесс. /v1/token/count говорит тебе размер. /v1/token/truncate обрезки по размеру. Оба поддерживают 15 моделей.
  • Предполетные проверки предотвращают производственные сбои. Считайте токены перед каждым LLM позвоните, чтобы избежать усеченных ответов, ошибок контекстного окна и неожиданных затрат.
  • Никакой учетной записи не требуется. Уровень бесплатного пользования допускает 5 запросов в минуту без регистрации. Получите ключ API для большего объема на botoi.com/api.

The полная документация по API охватывают полный список поддерживаемых моделей и дополнительных конечных точек утилиты разработчика.

FAQ

Сколько знаков в слове?
В среднем одно английское слово равно примерно 1,3 токена. Короткие общие слова, такие как «the» или «is», являются одним из символов. Более длинные или необычные слова, такие как «аутентификация», делятся на 2–4 подслова. Точное количество зависит от токенизатора модели.
Что такое токен в GPT?
Токен — это фрагмент текста, который модель обрабатывает как единое целое. В моделях GPT используется токенизатор кодирования пар байтов (BPE), который разбивает текст на части подслов. Обычные слова остаются целыми, а редкие или длинные слова распадаются на более мелкие фрагменты. Пунктуация и пробелы также маркируются.
Как подсчитать токены перед вызовом API?
Отправьте свой текст на POST https://api.botoi.com/v1/token/count с дополнительным параметром модели (gpt-4o, claude-3.5-sonnet, llama-3 и т. д.). API возвращает примерное количество токенов, слов и символов в одном ответе.
Разные LLM токенизируют текст одинаково?
Нет. В моделях GPT используется кодировка cl100k_base или o200k_base. Клод использует аналогичный, но отличный токенизатор BPE. Лама использует SentencePiece. Одно и то же предложение создает разное количество токенов в разных моделях. Всегда считайте токены конкретной модели, которую вы планируете вызвать.
Что произойдет, если вы превысите контекстное окно модели?
Большинство API-интерфейсов LLM возвращают ошибку, когда ввод превышает окно контекста. Некоторые молча обрезают ввод, что может привести к отключению важных инструкций или контекста. Предварительная проверка количества токенов и их усечение по размеру предотвращает оба режима сбоя.

Начните разработку с botoi

150+ API-эндпоинтов для поиска, обработки текста, генерации изображений и утилит для разработчиков. Бесплатный тариф, без банковской карты.