in ,

Cách đếm token trước khi gửi yêu cầu API của OpenAI

Khi làm việc với các mô hình của OpenAI, chẳng hạn như GPT-3.5 hoặc GPT-4, mỗi mô hình có một độ dài ngữ cảnh nhất định (ví dụ: GPT-3.5 có độ dài ngữ cảnh tối đa là 4096 token). Điều này có nghĩa là bạn cần kiểm soát số lượng token mà bạn sử dụng cho yêu cầu, bao gồm cả phần prompt và đầu ra của mô hình.

Một vấn đề phổ biến là làm thế nào để đếm số lượng token trong prompt trước khi gửi yêu cầu đến API. Việc này rất quan trọng để đảm bảo bạn không vượt quá giới hạn số token của mô hình.

Câu hỏi đặt ra

  1. Làm thế nào để đếm số lượng token trong Python API trước khi gửi yêu cầu để có thể điều chỉnh tham số max_tokens một cách phù hợp?
  2. Có cách nào để đặt max_tokens sao cho phù hợp mà không cần phải tự đếm số lượng token trong prompt không?

Giải pháp

OpenAI cung cấp một thư viện có tên tiktoken để giúp bạn dễ dàng đếm số token trong chuỗi văn bản của mình. Thư viện này cho phép bạn chia nhỏ văn bản thành các token theo cách mà các mô hình GPT hiểu và xử lý.

1. Cài đặt thư viện tiktoken

Để sử dụng tiktoken, bạn cần cài đặt thư viện này bằng lệnh:

pip install --upgrade tiktoken

2. Đếm token bằng tiktoken

Bạn có thể đếm số lượng token trong một chuỗi văn bản bằng cách sử dụng đoạn mã sau:

import tiktoken

def num_tokens_from_string(string: str, model: str) -> int:
    # Lấy encoding cho mô hình được chọn
    encoding = tiktoken.encoding_for_model(model)
    # Đếm số token trong chuỗi
    num_tokens = len(encoding.encode(string))
    return num_tokens

# Ví dụ đếm token trong chuỗi văn bản cho mô hình GPT-3.5 Turbo
string = "Hello, đây là ví dụ về cách đếm token trong Python."
model = "gpt-3.5-turbo"
print(f"Số lượng token: {num_tokens_from_string(string, model)}")

3. Đếm token trong yêu cầu chat completion

Để đếm số lượng token trong một yêu cầu chat với nhiều tin nhắn (message), bạn có thể sử dụng một đoạn mã phức tạp hơn:

def num_tokens_from_messages(messages, model="gpt-3.5-turbo"):
    encoding = tiktoken.encoding_for_model(model)
    tokens_per_message = 3  # Số token mỗi tin nhắn
    tokens_per_name = 1      # Số token nếu có "name" trong tin nhắn
    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  # Mỗi phản hồi đều được chuẩn bị với <|start|>assistant<|message|>
    return num_tokens

# Ví dụ đếm token trong một yêu cầu chat completion
messages = [
    {"role": "system", "content": "Bạn là một trợ lý thông minh."},
    {"role": "user", "content": "Hãy giải thích khái niệm AI cho tôi."},
]

model = "gpt-3.5-turbo"
print(f"Số lượng token trong yêu cầu: {num_tokens_from_messages(messages, model)}")

4. Đặt max_tokens phù hợp

Để tính toán và đặt max_tokens sao cho vừa vặn với giới hạn ngữ cảnh của mô hình, bạn có thể sử dụng một hàm như sau:

def calculate_max_tokens(messages, model):
    input_tokens = num_tokens_from_messages(messages, model)
    context_length = get_context_length(model)
    return context_length - input_tokens

def get_context_length(model):
    if model == "gpt-3.5-turbo":
        return 4096
    elif model == "gpt-4":
        return 8192
    else:
        raise ValueError(f"Không có thông tin về độ dài ngữ cảnh cho mô hình: {model}")

# Ví dụ tính toán max_tokens
messages = [
    {"role": "system", "content": "Bạn là một trợ lý thông minh."},
    {"role": "user", "content": "Hãy giải thích khái niệm AI cho tôi."},
]

model = "gpt-3.5-turbo"
max_tokens = calculate_max_tokens(messages, model)
print(f"Số lượng max_tokens có thể sử dụng: {max_tokens}")

Theo mình thì việc đếm token trước khi gửi yêu cầu API của OpenAI là rất quan trọng để đảm bảo bạn không vượt quá giới hạn ngữ cảnh của mô hình và tránh các lỗi không cần thiết. Sử dụng thư viện tiktoken, bạn có thể dễ dàng đếm số token trong prompt của mình và tính toán max_tokens một cách hiệu quả.

Written by Linh Nguyễn

0 0 votes
Article Rating
Subscribe
Notify of
guest

0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments