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
- 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? - 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ả.