Tokeny i rozliczenia API: szacowanie, odczyt, budżet i przykłady
Korzystanie z API dużego modelu jest jak korzystanie z prądu lub wody: bez licznika rachunek w końcu Cię zaskoczy; znając licznik, wiesz, ile zużywasz. Tutaj „licznikiem” jest licznik tokenów. Najpierw wyjaśnimy, czym są tokeny i jak szacować ich liczbę w języku chińskim i angielskim, potem pokażemy, jak odczytać pole usage z odpowiedzi, jak zainstalować bramkę budżetową w kodzie i na trzech przykładach z jasno określonymi założeniami pokażemy, ile kosztują wejście ($0.25) i wyjście ($1.00) za milion tokenów w konkretnych scenariuszach.
Zaktualizowano
Kluczowe informacje
- Wzór rozliczeniowy: (tokeny wejściowe × $0.25) + (tokeny wyjściowe × $1.00) / 1 000 000.
- Szacunki są wstępne. Rzeczywiste zużycie podaje usage w odpowiedzi. W strumieniowaniu usage jest w ostatnim bloku.
- Koszt rozmów generuje historia. Ograniczaj ją, by oszczędzać.
- 3 kroki: ogranicz max_tokens, ogranicz historię, sumuj koszty w kodzie i ustaw dzienny limit.
Czym są tokeny i jak naliczane są koszty
Token to najmniejsza jednostka tekstu przetwarzana przez model. Nie jest to ani znak, ani słowo. Traktuj go jak podziałkę na liczniku: im więcej tokenów, tym szybciej rośnie rachunek. Koszty dzielą się na:
| Pozycja | Cena za mln tokenów | Co zawiera |
|---|---|---|
| Wejście | $0.25 | Wszystko z messages: system, historia, pytanie |
| Wyjście | $1.00 | Odpowiedź wygenerowana przez model |
Pamiętaj, że cena wyjścia jest czterokrotnie wyższa niż wejścia, więc często opłaca się skłonić model do „mówienia mniej” niż do „wysyłania mniejszego kontekstu”, choć w scenariuszach konwersacyjnych kontekst wejściowy rośnie wraz z historią, więc trzeba pilnować obu stron. Płatność odbywa się z salda przedpłaconego kredytu, nie z subskrypcji; saldo nie wygasa; nowe konto otrzymuje darmowy kredyt próbny w wysokości $0.50, ważny przez 7 dni.
Tokeny wyjściowe to liczba wygenerowanych tokenów, nie max_tokens. max_tokens to tylko limit. Jeśli model odpowie krótko, zapłacisz mniej. Przy szacowaniu budżetu użyj max_tokens, by zabezpieczyć się przed długimi odpowiedziami.
Szacowanie wstępne: jak szacować tokeny PL i EN
Przed wysłaniem zapytania można tylko oszacować. Poniższe wartości są przybliżone i mogą się różnić w zależności od treści:
| Tekst | Zasada szacowania | Przykład (założenie) |
|---|---|---|
| Chiński | Każdy znak to około 1 do 1.5 tokena | 3000 znaków to około 3000 do 4500 tokenów |
| Angielski | Ok. 1 token na 4 znaki lub 1,3 tokena na słowo | 1000 słów ≈ 1300 tokenów |
| mieszany tekst chińsko-angielski, kod | Szacuj według górnej granicy | JSON i symbole zużywają więcej |
Poprawne użycie szacowania to „określenie rzędu wielkości”: czy ten artykuł to około 10 000, czy 100 000 tokenów, czy nie przekroczy okna kontekstu 100 000 tokenów, ile kosztuje jedno zapytanie. Aby uzyskać precyzję, przeczytaj usage. Dobrą praktyką jest przeprowadzenie dziesiątek próbnych zapytań dla każdego scenariusza biznesowego, obliczenie średniej z usage i użycie jej zamiast wartości z doświadczenia.
Przykład łączący szacowanie z pomiarem: przetwarzasz partię 2000 znaków chińskiego tekstu. Szacujesz 1.3 tokena na znak, co daje 2600 tokenów + 200 tokenów na prompt = 2800 tokenów wejściowych. Uruchom 30 zapytań i odczytaj uśrednione usage. Jeśli średnia to 2500, zaktualizuj współczynnik do 1.15. Następnie oblicz budżet na partię z użyciem tego współczynnika. Podane wartości są przykładowe.
Odczyt usage: prawdziwy „licznik”
Każda udana odpowiedź zawiera usage z prompt_tokens, completion_tokens i total_tokens. W strumieniowaniu nie potrzebujesz dodatkowych parametrów – usage pojawi się w ostatnim bloku. Poniższy kod pokazuje, jak odczytać oba tryby i przeliczyć koszt na USD:
import os
from openai import OpenAI
client = OpenAI(base_url="https://api.apidamoxing.com/v1", api_key=os.environ["API_KEY"])
PRICE_IN, PRICE_OUT = 0.25, 1.00 # 美元 / 百万 token
def cost(u):
return (u.prompt_tokens * PRICE_IN + u.completion_tokens * PRICE_OUT) / 1_000_000
# 非流式:usage 在响应对象上
r = client.chat.completions.create(
model="uncensored", max_tokens=200,
messages=[{"role": "user", "content": "用三句话解释什么是通货膨胀。"}],
)
print(r.usage.prompt_tokens, r.usage.completion_tokens, f"${cost(r.usage):.6f}")
# 流式:最后一个数据块带 usage,其余块的 usage 为空
usage_last = None
stream = client.chat.completions.create(
model="uncensored", max_tokens=200, stream=True,
messages=[{"role": "user", "content": "再用三句话解释什么是通货紧缩。"}],
)
for chunk in stream:
if chunk.usage:
usage_last = chunk.usage
if chunk.choices and chunk.choices[0].delta.content:
print(chunk.choices[0].delta.content, end="", flush=True)
print()
if usage_last:
print(usage_last.prompt_tokens, usage_last.completion_tokens, f"${cost(usage_last):.6f}")W strumieniowaniu usage jest tylko w ostatnim bloku. Użyj if chunk.usage, by sprawdzić. Zapisuj wyniki w logach lub bazie danych. Dzięki temu będziesz mógł rozliczać się na koniec miesiąca, wykrywać anomalie i liczyć koszt na użytkownika.
Dodatkowa rada: oznaczaj funkcje w kodzie. Zapisuj koszty osobno dla „podsumowań”, „obsługi klienta” czy „tłumaczeń”. Na koniec miesiąca zobaczysz, która funkcja generuje największe koszty. Dzięki temu podejmiesz decyzję: zoptymalizować prompt, skrócić historię czy zmniejszyć max_tokens. Bez etykiet nie wiesz, co optymalizować.
Trzy przykłady (założenia podano wprost)
Przykład 1: Obsługa klienta
Założenie: każde zapytanie ma 800 tokenów wejściowych (w tym system i fragmenty wiedzy) i 200 tokenów wyjściowych; 10 000 zapytań dziennie.
Koszt pojedynczego zapytania: 800 × 0,25 ÷ 1 000 000 = $0,0002; wyjście 200 × 1,00 ÷ 1 000 000 = $0,0002; razem $0,0004. Dziennie $4,00, 30 dni to $120. Przy takim tempie darmowy kredyt próbny $0,50 wystarczy na około 1250 takich wywołań.
Przykład 2: Streszczenie długich artykułów
Założenie: każdy artykuł ma 20 000 tokenów wejściowych, a streszczenie 600 tokenów wyjściowych; łącznie 500 artykułów.
Pojedynczy artykuł: 20 000 × 0.25 / 1 000 000 = $0.005 + 600 × 1.00 / 1 000 000 = $0.0006, razem $0.0056. Za 500 artykułów zapłacisz łącznie $2.80. Zadania z długim wejściem i krótkim wyjściem są bardzo tanie.
Przykład 3: Czaty wieloetapowe i przycinanie historii
Założenie: system 100 tokenów; każda tura ma 60 tokenów wejściowych od użytkownika i 150 tokenów wyjściowych; jedna rozmowa ma 20 tur.
| Rozwiązanie | Łączna liczba tokenów wejściowych | Łączna liczba tokenów wyjściowych | Całkowity koszt |
|---|---|---|---|
| Zawsze z pełną historią | 43,100 | 3,000 | Około $0,0138 |
| Tylko ostatnie 3 tury | 14,540 | 3,000 | Około $0,0066 |
Wejście dla pełnej historii: 20 × (100 + 60) + 210 × (0 + 1 + … + 19) = 3 200 + 39 900 = 43 100. Przy cięciu: 160, 370, 580 w pierwszych trzech rundach, a 790 w rundach 4–20, razem 14 540. Koszty różnią się około dwukrotnie; im więcej rund, tym większa różnica, bo pełna historia rośnie kwadratowo.
Z tych trzech przykładów można wyprowadzić wzór: koszt zależy głównie od „liczby zapytań × wielkości wejścia i wyjścia na zapytanie”, a w wielkości wejścia największy wpływ mają historia i dołączone materiały. W obsłudze klienta skracasz fragmenty wiedzy, w czacie przycinasz historię, a przy streszczeniach dzielisz zadania i wykonujesz je równolegle — to ten sam schemat: nie płać za zbędne tokeny. Warto podkreślić, że liczby w tych przykładach pochodzą wyłącznie z podanych wyżej założeń; Twoje rzeczywiste zużycie sprawdź w polu usage.
Spójrzmy na odwrót: jeśli Twój miesięczny budżet to $30, a chcesz wiedzieć, ile 20-turowych rozmów obsłuży Twój produkt czatowy w miesiącu. Przy rozwiązaniu „tylko ostatnie 3 tury” z przykładu 3 koszt jednej rozmowy to około $0,0066, więc $30 ÷ 0,0066 daje około 4545 rozmów. Przy tym samym budżencie, ale przy rozwiązaniu z pełną historią (koszt $0,0138 za rozmowę), starczy Ci tylko na około 2174 rozmów. To realna różnica, jaką daje przycinanie historii.
Kontrola budżetu: zainstaluj zawór w swoim programie
Szacunki to tylko prognoza, zawór to ubezpieczenie. Poniżej przedstawiamy klasę do rozliczania dziennego budżetu w dolarach: przed zapytaniem przewiduj „najgorszy przypadek” (wyjście wykorzystuje max_tokens w pełni), a po zapytaniu rozliczaj się na podstawie rzeczywistego usage.
class Budget:
"""按美元计的日预算。超出时拒绝新请求。"""
def __init__(self, daily_usd):
self.limit = daily_usd
self.spent = 0.0
def check(self, est_prompt_tokens, max_tokens):
# 最坏情况:输出用满 max_tokens
worst = (est_prompt_tokens * 0.25 + max_tokens * 1.00) / 1_000_000
if self.spent + worst > self.limit:
raise RuntimeError(f"预算不足:已用 ${self.spent:.4f},本次最坏 ${worst:.4f},上限 ${self.limit}")
def record(self, usage):
self.spent += (usage.prompt_tokens * 0.25 + usage.completion_tokens * 1.00) / 1_000_000
budget = Budget(daily_usd=5.0)
budget.check(est_prompt_tokens=1200, max_tokens=500) # 请求前
# ……发请求……
# budget.record(response.usage) # 请求后Poza zaworem w kodzie masz trzy narzędzia na poziomie konfiguracji:
- Ustaw max_tokens adekwatnie do zadania, nie zawsze na maksimum; domyślnie 2048, maksymalnie 32 000;
- Ustaw limit długości historii czatu, zgodnie z praktykami opisanymi w Budowanie bota czatu;
- Doładuj na koncie tylko kwotę, którą planujesz zużyć; doładowuj po wyczerpaniu. Model prepaid to naturalny, twardy limit górny.
Ceny i zasady dotyczące salda są zgodne z Stroną cen, szczegóły interfejsu znajdziesz w Szczegóły parametrów.
Podsumowujemy wszystko na liście kontrolnej: przed — oszacuj skalę, ustaw max_tokens, sprawdź długość historii; w trakcie — przy strumieniowaniu zwracaj uwagę na usage w ostatnim bloku; po — rozlicz się i pogrupuj koszty według funkcji, porównaj z budżetem. Po tych trzech krokach Twoje wydatki będą jasne.
Najczęściej zadawane pytania
Czy za tokeny wejściowe i wyjściowe płacisz osobno?
Tak. Wejście kosztuje $0,25 za milion tokenów, wyjście $1,00 za milion tokenów; rozliczenie odbywa się na podstawie prompt_tokens i completion_tokens z pola usage.
Czy mogę obliczyć dokładny koszt z góry?
Możesz oszacować skalę. Dokładna kwota zależy od usage w odpowiedzi; zalecamy pobranie średniej z próbek dla każdego scenariusza i użycie jej do prognozowania.
Czy saldo wygasa?
Saldo z doładowania prepaid nie wygasa. Darmowy kredyt próbny $0,50 dla nowego konta ważny jest przez 7 dni.
Jak uniknąć drążenia portfela w trakcie rozmowy?
Ogranicz długość historii; zachowaj tylko kilka ostatnich tur lub skompresuj starsze treści w streszczenie. Ustaw też adekwatny max_tokens dla danego zadania.
Wypełnij formularz, aby uzyskać klucz
Utwórz konto, skopiuj klucz i zmień Base URL. Konfiguracja jest prosta.