Sổ tay này đóng vai trò là công cụ để xử lý trước và phân tích tập dữ liệu trò chuyện được sử dụng để tinh chỉnh mô hình trò chuyện. Sổ tay này kiểm tra lỗi định dạng, cung cấp số liệu thống kê cơ bản và ước tính số lượng mã thông báo để tinh chỉnh chi phí. Phương pháp được hiển thị ở đây tương ứng với phương pháp tinh chỉnh hiện tại cho gpt-3.5-turbo. Xem tinh chỉnh cũ cho các mô hình như babbage-002 và davinci-002.
import json
import tiktoken # for token counting
import numpy as np
from collections import defaultdictĐang tải dữ liệu
Đầu tiên chúng ta tải tập dữ liệu trò chuyện từ tệp JSONL mẫu .
data_path = "data/toy_chat_fine_tuning.jsonl"
# Load the dataset
with open(data_path, 'r', encoding='utf-8') as f: dataset = [json.loads(line) for line in f]
# Initial dataset stats
print("Num examples:", len(dataset))
print("First example:")
for message in dataset[0]["messages"]: print(message)Số ví dụ: 5 Ví dụ đầu tiên: {'role': 'system', 'content': 'Bạn là một trợ lý vui vẻ luôn mang lại góc nhìn tích cực cho mọi thứ.'} {'role': 'user', 'content': 'Hôm nay tôi bị ngã xe đạp.'} {'role': 'assistant', 'content': "Thật tuyệt khi bạn tập thể dục ngoài trời!"}Xác thực định dạng
Chúng ta có thể thực hiện nhiều kiểm tra lỗi khác nhau để xác thực rằng mỗi cuộc hội thoại trong tập dữ liệu tuân thủ định dạng mà API tinh chỉnh mong đợi. Lỗi được phân loại dựa trên bản chất của chúng để gỡ lỗi dễ dàng hơn.
+ Kiểm tra kiểu dữ liệu : Kiểm tra xem mỗi mục trong tập dữ liệu có phải là một từ điển ( dict) hay không. Loại lỗi: data_type.
+ Sự hiện diện của danh sách tin nhắn : Kiểm tra xem messagesdanh sách có hiện diện trong mỗi mục nhập hay không. Loại lỗi: missing_messages_list.
+ Kiểm tra khóa tin nhắn : Xác thực rằng mỗi tin nhắn trong messagesdanh sách chứa khóa rolevà content. Loại lỗi: message_missing_key.
+ Các khóa không được nhận dạng trong tin nhắn : Ghi nhật ký nếu tin nhắn có các khóa khác ngoài role, content, weight, function_call, và name. Loại lỗi: message_unrecognized_key.
+ Xác thực vai trò : Đảm bảo rolelà một trong các vai trò "hệ thống", "người dùng" hoặc "trợ lý". Loại lỗi: unrecognized_role.
+ Xác thực nội dung : Xác minh rằng contentcó dữ liệu văn bản và là một chuỗi. Loại lỗi: missing_content.
+ Trợ lý tin nhắn hiện diện : Kiểm tra xem mỗi cuộc trò chuyện có ít nhất một tin nhắn từ trợ lý hay không. Loại lỗi: example_missing_assistant_message.
Mã bên dưới thực hiện các kiểm tra này và in ra số lượng cho từng loại lỗi được tìm thấy. Điều này hữu ích cho việc gỡ lỗi và đảm bảo tập dữ liệu đã sẵn sàng cho các bước tiếp theo.
# Format error checks
format_errors = defaultdict(int)
for ex in dataset: if not isinstance(ex, dict): format_errors["data_type"] += 1 continue messages = ex.get("messages", None) if not messages: format_errors["missing_messages_list"] += 1 continue for message in messages: if "role" not in message or "content" not in message: format_errors["message_missing_key"] += 1 if any(k not in ("role", "content", "name", "function_call", "weight") for k in message): format_errors["message_unrecognized_key"] += 1 if message.get("role", None) not in ("system", "user", "assistant", "function"): format_errors["unrecognized_role"] += 1 content = message.get("content", None) function_call = message.get("function_call", None) if (not content and not function_call) or not isinstance(content, str): format_errors["missing_content"] += 1 if not any(message.get("role", None) == "assistant" for message in messages): format_errors["example_missing_assistant_message"] += 1
if format_errors: print("Found errors:") for k, v in format_errors.items(): print(f"{k}: {v}")
else: print("No errors found")Không tìm thấy lỗiTiện ích đếm token
Chúng ta hãy định nghĩa một số tiện ích hữu ích để sử dụng trong phần còn lại của sổ ghi chép.
- mua tài khoản ChatGPT 4.0 giá rẻ chính hãng ưu đãi đặc biệt ngày hôm nay!
encoding = tiktoken.get_encoding("cl100k_base")
# not exact!
# simplified from https://github.com/openai/openai-cookbook/blob/main/examples/How_to_count_tokens_with_tiktoken.ipynb
def num_tokens_from_messages(messages, tokens_per_message=3, tokens_per_name=1): 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 return num_tokens
def num_assistant_tokens_from_messages(messages): num_tokens = 0 for message in messages: if message["role"] == "assistant": num_tokens += len(encoding.encode(message["content"])) return num_tokens
def print_distribution(values, name): print(f"\n#### Distribution of {name}:") print(f"min / max: {min(values)}, {max(values)}") print(f"mean / median: {np.mean(values)}, {np.median(values)}") print(f"p5 / p95: {np.quantile(values, 0.1)}, {np.quantile(values, 0.9)}")Cảnh báo dữ liệu và số lượng mã thông báo
Với một số phân tích nhẹ, chúng ta có thể xác định các vấn đề tiềm ẩn trong tập dữ liệu, như tin nhắn bị thiếu và cung cấp thông tin thống kê về số lượng tin nhắn và mã thông báo.
- Tin nhắn hệ thống/người dùng bị thiếu : Đếm số cuộc trò chuyện thiếu tin nhắn "hệ thống" hoặc "người dùng". Những tin nhắn như vậy rất quan trọng để xác định hành vi của trợ lý và bắt đầu cuộc trò chuyện.
- Số lượng tin nhắn trên mỗi ví dụ : Tóm tắt sự phân bổ số lượng tin nhắn trong mỗi cuộc hội thoại, cung cấp cái nhìn sâu sắc về độ phức tạp của cuộc đối thoại.
- Tổng số mã thông báo theo ví dụ : Tính toán và tóm tắt sự phân phối tổng số mã thông báo trong mỗi cuộc hội thoại. Quan trọng để hiểu chi phí tinh chỉnh.
- Mã thông báo trong tin nhắn của Trợ lý : Tính toán số lượng mã thông báo trong tin nhắn của trợ lý cho mỗi cuộc trò chuyện và tóm tắt phân phối này. Hữu ích để hiểu mức độ chi tiết của trợ lý.
- Cảnh báo giới hạn mã thông báo : Kiểm tra xem có ví dụ nào vượt quá giới hạn mã thông báo tối đa (16.385 mã thông báo) hay không, vì những ví dụ như vậy sẽ bị cắt bớt trong quá trình tinh chỉnh, có khả năng dẫn đến mất dữ liệu.
# Warnings and tokens counts
n_missing_system = 0
n_missing_user = 0
n_messages = []
convo_lens = []
assistant_message_lens = []
for ex in dataset: messages = ex["messages"] if not any(message["role"] == "system" for message in messages): n_missing_system += 1 if not any(message["role"] == "user" for message in messages): n_missing_user += 1 n_messages.append(len(messages)) convo_lens.append(num_tokens_from_messages(messages)) assistant_message_lens.append(num_assistant_tokens_from_messages(messages))
print("Num examples missing system message:", n_missing_system)
print("Num examples missing user message:", n_missing_user)
print_distribution(n_messages, "num_messages_per_example")
print_distribution(convo_lens, "num_total_tokens_per_example")
print_distribution(assistant_message_lens, "num_assistant_tokens_per_example")
n_too_long = sum(l > 16,385 for l in convo_lens)
print(f"\n{n_too_long} examples may be over the 16,385 token limit, they will be truncated during fine-tuning")Số ví dụ thiếu thông báo hệ thống: 1 Số ví dụ thiếu thông báo người dùng: 1
#### Phân phối num_messages_per_example: min / max: 2, 9 mean / average: 3.8, 3.0 p5 / p95: 2.0, 6.6000000000000005
#### Phân phối num_total_tokens_per_example: min / max: 26, 8032 mean / average: 1648.4, 45.0 p5 / p95: 26.8, 4863.6
#### Phân phối num_assistant_tokens_per_example: min / max: 4, 8000 mean / average: 1610.2, 10.0 p5 / p95: 6.0, 4811.200000000001
0 ví dụ có thể vượt quá Giới hạn 16.385 mã thông báo, chúng sẽ bị cắt bớt trong quá trình tinh chỉnhDự toán chi phí
Xem thêm: mua tài khoản ChatGPT Plus chính hãng giá rẻ
Trong phần cuối này, chúng tôi ước tính tổng số token sẽ được sử dụng để tinh chỉnh, cho phép chúng tôi ước tính chi phí. Cần lưu ý rằng thời lượng của các công việc tinh chỉnh cũng sẽ tăng theo số lượng token.
# Pricing and default n_epochs estimate
MAX_TOKENS_PER_EXAMPLE = 16385
TARGET_EPOCHS = 3
MIN_TARGET_EXAMPLES = 100
MAX_TARGET_EXAMPLES = 25000
MIN_DEFAULT_EPOCHS = 1
MAX_DEFAULT_EPOCHS = 25
n_epochs = TARGET_EPOCHS
n_train_examples = len(dataset)
if n_train_examples * TARGET_EPOCHS < MIN_TARGET_EXAMPLES: n_epochs = min(MAX_DEFAULT_EPOCHS, MIN_TARGET_EXAMPLES // n_train_examples)
elif n_train_examples * TARGET_EPOCHS > MAX_TARGET_EXAMPLES: n_epochs = max(MIN_DEFAULT_EPOCHS, MAX_TARGET_EXAMPLES // n_train_examples)
n_billing_tokens_in_dataset = sum(min(MAX_TOKENS_PER_EXAMPLE, length) for length in convo_lens)
print(f"Dataset has ~{n_billing_tokens_in_dataset} tokens that will be charged for during training")
print(f"By default, you'll train for {n_epochs} epochs on this dataset")
print(f"By default, you'll be charged for ~{n_epochs * n_billing_tokens_in_dataset} tokens")Bộ dữ liệu có ~4306 mã thông báo sẽ được tính phí trong quá trình đào tạo Theo mặc định, bạn sẽ đào tạo trong 20 kỷ nguyên trên bộ dữ liệu này Theo mặc định, bạn sẽ được tính phí cho ~86120 mã thông báo
Cách đổi Mật khẩu Chat GPT - Hướng dẫn đổi Pass Chat GPT 100% Thành công
Hướng dẫn Cách đăng nhập Chat GPT Nhanh nhất | Có hỗ trợ Miễn phí qua Teamview-Ultraview
Chat GPT Plus là gì? So sánh Chat GPT Plus với Chat GPT Miễn phí
Chat GPT bị giới hạn giải thích vì sao và cách khắc phục
Chat GPT là gì ? Cách đăng Ký Chat GPT Miễn Phí tại Việt Nam