Estimasi Biaya Menggunakan TikToken

TikToken adalah library tokenizer yang disediakan oleh OpenAI. Berguna untuk mengubah teks menjadi token.

Untuk instalasi gunakan perintah berikut:

pip install tiktoken

Encoding

Hal yang perlu diperhatikan adalah encoding. Encodings menentukan bagaimana teks dikonversi menjadi token. Setiap model memiliki encoding berbeda.

Encoding nameOpenAI models
cl100k_base gpt-4, gpt-3.5-turbo, text-embedding-ada-002
p50k_base Codex models, text-davinci-002, text-davinci-003
r50k_base (or gpt2) GPT-3 models seperti davinci

Informasi lengkap bisa dilihat di OpenAI Tiktoken Cookbook.

Contoh Penggunaan Tiktoken

Berikut contoh menggunakan encoding p50k_base.

import tiktoken

enc = tiktoken.get_encoding("p50k_base")
enc.encode("Hello Skillplus")

# akan mengembalikan 3 token
# [15496, 16023, 9541]

Untuk mengetahui jumlah token, cukup gunakan perintah len().

len(enc.encode("Hello Skillplus")

#akan mengembalikan 3

Selain menggunakan perintah get_encoding, Anda juga bisa menggunakan perintah encoding_for_model(“nama_model”), contohnya:

enc = tiktoken.encoding_for_model("gpt-3.5-turbo")

Untuk mempermudah perhitungan token, Anda dapat buat fungsi helper seperti berikut:

def num_tokens_from_string(string: str, model_name: str) -> int :
    """Returns the number of tokens in a text string."""
    encoding = tiktoken.encoding_for_model(model_name)
    num_tokens = len(encoding.encode(string))
    return num_tokens

Untuk menghitung estimasi biaya, Anda tinggal kalikan dengan biaya model. Informasi biaya terbaru dapat dilihat di OpenAI Pricing.

Contoh perhitungan biaya untuk model gpt-3.5-turbo.

#price gpt-3.5-turbo
price_per_token = 0.002/1000

#hitung jumlah token, kemudian kalikan dengan price_per_token
num_tokens_from_string("Test skillplus", "gpt-3.5-turbo") * price_per_token

Sangat kecil sekali biayanya, yaitu $ 0.000006.

Sampai disini contoh yang dibahas diatas adalah untuk single teks prompt dari Completion API. Cara perhitungan agak sulit jika menggunakan ChatCompletion.

Tentu Anda masih ingat, bentuk messages dari ChatCompletion dimana terdapat role dan content. Hal tersebut diperhitungkan. Namun tidak perlu khawatir, OpenAI sudah menyediakan fungsi yang dapat digunakan.

Perhitungan token untuk Chat API

def num_tokens_from_messages(messages, model="gpt-3.5-turbo-0301"):
    """Returns the number of tokens used by a list of messages."""
    try:
        encoding = tiktoken.encoding_for_model(model)
    except KeyError:
        print("Warning: model not found. Using cl100k_base encoding.")
        encoding = tiktoken.get_encoding("cl100k_base")
    if model == "gpt-3.5-turbo":
        print("Warning: gpt-3.5-turbo may change over time. Returning num tokens assuming gpt-3.5-turbo-0301.")
        return num_tokens_from_messages(messages, model="gpt-3.5-turbo-0301")
    elif model == "gpt-4":
        print("Warning: gpt-4 may change over time. Returning num tokens assuming gpt-4-0314.")
        return num_tokens_from_messages(messages, model="gpt-4-0314")
    elif model == "gpt-3.5-turbo-0301":
        tokens_per_message = 4  # every message follows <|start|>{role/name}\n{content}<|end|>\n
        tokens_per_name = -1  # if there's a name, the role is omitted
    elif model == "gpt-4-0314":
        tokens_per_message = 3
        tokens_per_name = 1
    else:
        raise NotImplementedError(f"""num_tokens_from_messages() is not implemented for model {model}. See https://github.com/openai/openai-python/blob/main/chatml.md for information on how messages are converted to tokens.""")
    num_tokens = 0
    for message in messages:
        num_tokens += tokens_per_message
        for key, value in message.items():
            num_tokens += len(encoding.encode(value))
            if key == "name":
                num_tokens += tokens_per_name
    num_tokens += 3  # every reply is primed with <|start|>assistant<|message|>
    return num_tokens

Code berikut juga disediakan oleh OpenAI, untuk meverifikasi apakah fungsi yang disediakan diatas sesuai dengan jumlah token dari response ChatCompletion API.

import openai
from dotenv import dotenv_values

config = dotenv_values(".env")
openai.api_key = config["OPENAI_KEY"]

example_messages = [
    {
        "role": "system",
        "content": "You are a helpful, pattern-following assistant that translates corporate jargon into plain English.",
    },
    {
        "role": "system",
        "name": "example_user",
        "content": "New synergies will help drive top-line growth.",
    },
    {
        "role": "system",
        "name": "example_assistant",
        "content": "Things working well together will increase revenue.",
    },
    {
        "role": "system",
        "name": "example_user",
        "content": "Let's circle back when we have more bandwidth to touch base on opportunities for increased leverage.",
    },
    {
        "role": "system",
        "name": "example_assistant",
        "content": "Let's talk later when we're less busy about how to do better.",
    },
    {
        "role": "user",
        "content": "This late pivot means we don't have time to boil the ocean for the client deliverable.",
    },
]

for model in ["gpt-3.5-turbo"]:
    print(model)
    # example token count from the function defined above
    print(f"{num_tokens_from_messages(example_messages, model)} prompt tokens counted by num_tokens_from_messages().")
    # example token count from the OpenAI API
    response = openai.ChatCompletion.create(
        model=model,
        messages=example_messages,
        temperature=0,
        max_tokens=1  # we're only counting input tokens here, so let's not waste tokens on the output
    )
    print(f'{response["usage"]["prompt_tokens"]} prompt tokens counted by the OpenAI API.')
    print()

Jika dijalankan akan mengembalikan result seperti berikut:

gpt-3.5-turbo
Warning: gpt-3.5-turbo may change over time. Returning num tokens assuming gpt-3.5-turbo-0301.
127 prompt tokens counted by num_tokens_from_messages().
127 prompt tokens counted by the OpenAI API.

Sesuai ekspektasi, fungsi yang disediakan openAI berfungsi dengan baik.

Untuk informasi lebih lengkap lihat di OpenAI CookBook, pada bagian Counting tokens for chat API calls.

Sharing is caring: