Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
Menciptakan aset untuk pembelajaran penguatan multi-putaran
Format kumpulan data yang cepat
Dataset pelatihan Anda adalah kumpulan petunjuk yang dikirim SageMaker AI ke agen Anda selama pelatihan. Setiap prompt memulai satu peluncuran: agen Anda memprosesnya, mengambil tindakan di satu putaran atau lebih, dan mengembalikan hadiah. Kualitas dan struktur kumpulan data Anda secara langsung memengaruhi apa yang dipelajari model.
Format file yang didukung
| Format | Ekstensi | Catatan |
|---|---|---|
| Apache Parquet | .parket | Direkomendasikan untuk kumpulan data besar — penyimpanan yang efisien dan pemuatan cepat |
| Garis JSON | .jsonl | Satu objek JSON per baris - mudah dibuat dan dapat dibaca manusia |
| JSON | .json | Array objek JSON |
| CSV | .csv | Comma-separated nilai dengan baris header |
Skema kumpulan data
Deteksi kolom cepat
Layanan RFT mendeteksi kolom prompt menggunakan aturan berikut, secara berurutan:
-
Jika kolom bernama
promptada, kolom itu digunakan. -
Jika tidak, kolom pertama dalam kumpulan data digunakan.
Selalu beri nama kolom prompt Anda prompt untuk menghindari ambiguitas. Anda dapat menyertakan kolom tambahan untuk tujuan pelacakan Anda sendiri, tetapi hanya kolom prompt yang dibaca oleh layanan RFT.
Bagaimana petunjuk digunakan
Layanan RFT membaca kolom prompt dan meneruskan nilai string langsung ke agen Anda apa adanya. Itu tidak mengurai, memvalidasi, atau mengubah konten. Format apa yang digunakan sepenuhnya bergantung pada apa yang diharapkan agen Anda — agen sederhana mungkin mengambil teks biasa, sementara yang lebih canggih mungkin mengharapkan string JSON yang berisi riwayat percakapan, konfigurasi alat, dan spesifikasi hadiah.
Perlindungan data
Karena layanan RFT melewati perintah tanpa inspeksi, Anda bertanggung jawab untuk melindungi konten sensitif. Pertimbangkan untuk menyandikan atau mengenkripsi data yang cepat sebelum menyimpannya, dan menangani decoding atau dekripsi di agen Anda.
Pendekatan umum:
-
Pengkodean Base64 — penyamaran sederhana untuk data yang tidak sensitif
-
Enkripsi — untuk data sensitif atau berpemilik (misalnya, AES dengan kunci yang dikelola oleh agen Anda)
Contoh 1: Dataset Q & A Sederhana (Teks Biasa)
Untuk tugas pelatihan langsung dengan petunjuk teks biasa.
Kasus penggunaan: Penjawab pertanyaan dasar, instruksi sederhana berikut
Parket (Python)
import pyarrow as pa import pyarrow.parquet as pq data = { "prompt": [ "What is 2 + 2?", "Explain the concept of machine learning.", "Write a Python function to reverse a string.", "What is the capital of France?", "How does photosynthesis work?", ] } table = pa.table(data) pq.write_table(table, "training_data.parquet")
Garis JSON (.jsonl)
{"prompt": "What is 2 + 2?"} {"prompt": "Explain the concept of machine learning."} {"prompt": "Write a Python function to reverse a string."}
Contoh 2: Search/Reasoning dengan Penggunaan Alat
Untuk tugas-tugas yang membutuhkan akses alat eksternal (misalnya, mesin pencari) selama penalaran model.
Kasus penggunaan: Fact-based Tanya Jawab dengan pencarian web, penalaran tambahan pengambilan
Struktur:
prompt (column) = JSON string (recommend encoded/encrypted) containing: ├── data_source: Dataset origin identifier ├── prompt: Conversation messages [system, user] ├── ability: Task category (e.g., "fact-reasoning") ├── env_class: "search" ├── reward_spec: Ground truth answer for evaluation └── extra_info: Tool configuration and metadata
Contoh Baris:
import pyarrow as pa import pyarrow.parquet as pq import json task_data = { "data_source": "searchR1_nq", "prompt": [ { "role": "system", "content": "You are a helpful and harmless assistant." }, { "role": "user", "content": "Answer the given question. You must conduct reasoning inside <think> and </think> first every time you get new information. After reasoning, if you find you lack some knowledge, you can call a search engine by <search> query </search> and it will return the top searched results between <information> and </information>. You can search as many times as you want. If you find no further external knowledge needed, you can directly provide the answer inside <answer> and </answer>, without detailed illustrations. For example, <answer> Beijing </answer>. Question: total number of death row inmates in the us?" } ], "ability": "fact-reasoning", "env_class": "search", "reward_spec": { "ground_truth": { "target": [ "2,718" ] }, "style": "rule" }, "extra_info": { "index": 0, "question": "total number of death row inmates in the us?", "split": "train", "need_tools_kwargs": true, "tools_kwargs": { "search": { "create_kwargs": { "question": "total number of death row inmates in the us?", "ground_truth": { "target": [ "2,718" ] }, "data_source": "searchR1_nq" } } } } } # Recommend: encode or encrypt before storing data = {"prompt": [json.dumps(task_data)]} table = pa.table(data) pq.write_table(table, "search_training_data.parquet")
Contoh 3: Generasi SQL (Multi-Turn dengan Konteks Kompleks)
Untuk tugas pembuatan kode yang membutuhkan skema database, penalaran multi-langkah, dan umpan balik eksekusi SQL.
Kasus penggunaan: Text-to-SQL, pembuatan kode dengan verifikasi eksekusi
Struktur:
prompt (column) = JSON string (recommend encoded/encrypted) containing: ├── input_seq: Human-readable task description ├── prompt: Conversation messages [system, user] ├── env_class: "text2sql" ├── reward_spec: Ground truth SQL and evaluation config ├── instance_id: Unique task identifier ├── schema: Database schema definition ├── question: Natural language question └── extra_info: Additional metadata
Contoh Baris:
import pyarrow as pa import pyarrow.parquet as pq import json task_data = { "input_seq": "Task Overview:\nYou are a data science expert. Below, you are provided with a database schema\nand a natural language question. Your task is to understand the schema and\ngenerate a valid SQL query to answer the question.\n\nDatabase Engine: SQLite\n\nDatabase Schema:\nCREATE TABLE countries (\n country_id INTEGER PRIMARY KEY,\n english_name TEXT,\n population INTEGER\n);\n\nCREATE TABLE country_metrics (\n metric_id INTEGER PRIMARY KEY,\n country_id INTEGER,\n metric_type TEXT,\n year INTEGER,\n value REAL\n);\n\nQuestion: List all countries with their current population and average\npopulation over the last five years.", "prompt": [ { "role": "system", "content": "Task Overview:\nYou are a data science expert. Your task is to understand the schema and generate\na valid SQL query to answer the question within limited turns.\n\nInstructions:\n- Make sure you only output the information asked in the question.\n- Think through the steps before generating the final SQL query.\n\nFormat:\n- Conduct thinking inside <think>...</think> blocks.\n- You can use SQL tool written within <sql>your sql</sql> to explore or verify.\n- SQL tool output will be shown inside <observation>...</observation>.\n- Provide the final SQL query inside <solution>...</solution>." }, { "role": "user", "content": "Database Schema:\nCREATE TABLE countries (\n country_id INTEGER PRIMARY KEY,\n english_name TEXT,\n population INTEGER\n);\n\nCREATE TABLE country_metrics (\n metric_id INTEGER PRIMARY KEY,\n country_id INTEGER,\n metric_type TEXT,\n year INTEGER,\n value REAL\n);\n\nQuestion: List all countries with their current population and average\npopulation over the last five years." } ], "env_class": "text2sql", "instance_id": "sql_task_001", "reward_spec": { "ground_truth": "SELECT c.english_name, c.population, AVG(m.value) as avg_pop\nFROM countries c\nJOIN country_metrics m ON c.country_id = m.country_id\nWHERE m.metric_type = 'Population' AND m.year > strftime('%Y', 'now') - 5\nGROUP BY c.country_id;", "style": "rule" }, "schema": "CREATE TABLE countries (...); CREATE TABLE country_metrics (...);", "question": "List all countries with their current population...", "extra_info": { "split": "train", "difficulty": "medium" } } # Recommend: encode or encrypt before storing data = {"prompt": [json.dumps(task_data)]} table = pa.table(data) pq.write_table(table, "sql_training_data.parquet")
Praktik Terbaik
Ukuran Dataset
Contoh minimum setidaknya sama dengantraining_batch_size. 10x+ ukuran batch Anda untuk keragaman direkomendasikan.
Kualitas yang cepat
-
Konteks lengkap: Sertakan semua informasi yang diperlukan untuk model untuk menghasilkan respons yang berguna
-
Struktur yang konsisten: Pertahankan pemformatan yang konsisten di semua petunjuk
-
Hindari duplikat: Petunjuk unik memberikan sinyal pelatihan yang lebih baik
-
Petunjuk yang jelas: Untuk tugas penggunaan alat, berikan instruksi format eksplisit
Perlindungan Data
-
Menyandikan atau mengenkripsi konten prompt untuk melindungi data sensitif
-
Kelola kunci dekripsi dengan aman di server peluncuran Anda
-
Layanan RFT melewati petunjuk tanpa inspeksi, jadi perlindungan adalah tanggung jawab Anda
Desain fungsi hadiah
Desain fungsi penghargaan sangat penting untuk menyediakan sinyal pembelajaran yang efektif dalam sistem agen multi-langkah yang kompleks. Saat merancang fungsi hadiah untuk RL multi-putaran, pertimbangkan pedoman berikut.
-
Mulailah dengan hadiah berbasis hasil. Skor hasil akhir terlebih dahulu untuk menetapkan garis dasar yang bersih dan andal sebelum menambahkan hadiah menengah atau pembentukan hadiah.
-
Pertimbangkan imbalan berkelanjutan atas imbalan biner. Hadiah berkelanjutan dapat memberikan sinyal kredit sebagian yang lebih jelas, tetapi mudah dimainkan. Imbalan biner lebih disukai ketika kredit sebagian sulit ditentukan atau ketika garis dasar yang bersih diperlukan.
-
Gunakan hadiah membentuk dengan hati-hati. Membentuk hadiah dapat memandu pembelajaran, tetapi mereka harus digunakan dengan hemat karena pembentukan yang terlalu kuat atau tidak selaras dapat mengajarkan jalan pintas.
-
Waspada terhadap peretasan hadiah. Buat hadiah sulit untuk dieksploitasi, dan verifikasi bahwa model tersebut menyelesaikan tugas sebenarnya daripada memainkan aturan penilaian.
-
Validasi sebelum pelatihan. Uji fungsi hadiah pada lintasan nyata sebelum pelatihan untuk menangkap bug, celah, atau sinyal yang menyesatkan.
-
Pantau metrik perilaku, bukan hanya hadiah. Lacak metrik seperti tingkat penyelesaian, jumlah belokan, penggunaan alat, dan celah overfitting untuk memastikan model membaik dengan cara yang diinginkan.
Proses desain hadiah
-
Tentukan seperti apa kesuksesan itu dan tentukan apakah itu dapat dinilai secara otomatis.
-
Mengevaluasi model dasar untuk menetapkan tingkat keberhasilan dasar.
-
Desain tingkatan hadiah: imbalan positif untuk sukses, imbalan nol untuk kegagalan, dan imbalan negatif untuk perilaku merosot.
-
Tangani kasus tepi secara eksplisit, termasuk batas waktu, kesalahan lingkungan, keluaran yang salah bentuk, dan respons kosong.
-
Periksa setiap komponen hadiah untuk potensi peretasan hadiah.
-
Validasi pada lintasan nyata sebelum pelatihan.
-
Pantau bersama metrik perilaku selama pelatihan.
-
Iterasi berdasarkan hasil awal.
Dalam praktiknya, fungsi hadiah mengambil riwayat pesan lengkap dari sebuah episode sebagai input dan mengembalikan dua output: hadiah skalar (skor floating-point yang mengukur kualitas lintasan, dengan nilai yang lebih tinggi menunjukkan kinerja yang lebih baik) dan kamus metrik untuk logging, debugging, dan pemantauan.
Contoh: Fungsi hadiah agen pencarian
Contoh berikut menunjukkan fungsi hadiah untuk agen yang menjawab pertanyaan menggunakan pencarian. Ini menunjukkan evaluasi hasil, pembentukan format, dan pemeriksaan kebenaran jawaban.
class TextAnswerReward: """Reward function to check text answer against gold answers. formula: format_coef * (correct_format - 1) + correct_answer """ gold_answers: list[str] format_coef: float = 0.1 async def __call__(self, history: list[Message]) -> tuple[float, dict[str, float]]: """Grade the completed episode by checking the final assistant message.""" final_message = None for msg in reversed(history): if msg.get("role") == "assistant": final_message = msg break if final_message is None: return 0.0, {"format": 0.0, "correct": 0.0} content = get_text_content(final_message) correct_format = float(self._extract_answer(content) is not None) correct_answer = float(self._check_answer(content)) reward = self.format_coef * (correct_format - 1) + correct_answer return reward, {"format": correct_format, "correct": correct_answer} def _extract_answer(self, text: str) -> str | None: if "Answer:" not in text: return None parts = text.split("Answer:") if len(parts) != 2: return None return parts[1].strip() def _check_answer(self, text: str) -> bool: model_answer = self._extract_answer(text) if model_answer is None or len(self.gold_answers) == 0: return False for gold in self.gold_answers: if normalize_answer(model_answer) == normalize_answer(gold): return True return False
Fungsi hadiah ini mencakup pilihan desain utama berikut:
-
Kebenaran mendominasi. Jawaban yang benar selalu mendapat skor lebih tinggi daripada jawaban yang salah, apa pun formatnya.
-
Format adalah sinyal pembentukan kecil. Koefisien format (0,1) adalah 10% dari hadiah hasil, cukup kecil sehingga model tidak dapat memperoleh keuntungan dari kepatuhan format saja, tetapi cukup besar untuk mengarahkannya ke output yang dapat diuraikan.
-
Format yang salah dengan jawaban yang salah dihukum ringan. Skor -0.1 menciptakan gradien kecil dari output yang sama sekali tidak terstruktur, tanpa membebani sinyal pembelajaran.
-
Tidak ada jawaban yang diperlakukan salah dengan format yang buruk. Jika model tidak pernah menghasilkan pesan asisten, fungsi mengembalikan 0,0, membedakannya dari penalti aktif -0,1 untuk respons sekarang tetapi salah bentuk.