Dieses Tutorial demonstriert eine einfache zweier-Agenten-Trainingsaufgabe mit einer Längenverhältnis-Belohnung. Beide Agenten erhalten denselben Prompt und generieren unabhängig voneinander; der zweite Agent sieht nicht die Antwort des ersten Agenten. Die Belohnung fördert, dass die zweite Ausgabe 2–3× so viele Zeichen enthält wie die erste. Sie bewertet keine Storyqualität oder semantische Zusammenarbeit.
Benutzer können das Beispiel aus einem installierten Quellcode-Checkout ausführen:
python examples/story-len-ratio.pySpeicheranforderungen hängen vom Modell, der Anzahl der Agenten, der Batch-Größe und der Antwortlänge ab. W&B-Protokollierung ist standardmäßig deaktiviert. Das --wandb-Flag aktiviert sie; --wandb-project und --wandb-entity sind optional.
Importiere Bibliotheken#
import math
from functools import partial
from datasets import Dataset
from transformers import AutoModelForCausalLM, AutoTokenizer
from comlrl.utils.reward_processor import RewardProcessors
from comlrl.trainers.reinforce import MAGRPOConfig, MAGRPOTrainerDatenvorbereitung#
Der Datensatz enthält kreative Prompts für beide Agenten.
train_data = {
"prompt": [
"Describe a city in the clouds:",
"Invent a new holiday and explain it:",
"Write a bedtime story for a dragon:",
"Explain how teleportation might work:",
"Tell a joke about dinosaurs:",
"Describe a world without electricity:",
"Create a superhero with a unique power:",
"Write a scene where the moon talks:",
"Invent a new type of fruit:",
"Design a playground on Mars:",
]
}
train_dataset = Dataset.from_dict(train_data)Agenteninitialisierung#
Das tokenizer konvertiert Text in das Modell tokens. Jeder Agent verwendet eine separate Modellinstanz.
model_name = "Qwen/Qwen2.5-0.5B"
tokenizer = AutoTokenizer.from_pretrained(model_name)
agents = [AutoModelForCausalLM.from_pretrained(model_name) for _ in range(2)]Definiere die Belohnungsfunktion#
Die Belohnungsfunktion bewertet das Verhältnis der Ausgabenlänge der Agenten. Sie gibt die maximale Belohnung (1.0) zurück, wenn die zweite Ausgabe 2–3× so viele Zeichen enthält wie die erste. Außerhalb dieses Bereichs nimmt die Belohnung exponentiell ab, je weiter sie von der nächsten Grenze entfernt ist.
def proper_length_ratio_reward(
completions1, completions2, target_min=2.0, target_max=3.0
):
rewards = []
for c1, c2 in zip(completions1, completions2):
len1, len2 = len(c1), len(c2)
if len1 == 0:
rewards.append(0.0)
continue
ratio = len2 / len1
if target_min <= ratio <= target_max:
reward = 1.0
else:
if ratio < target_min:
distance = target_min - ratio
else:
distance = ratio - target_max
reward = math.exp(-distance)
rewards.append(float(reward))
return rewardsKonfiguriere das Training#
Benutzer können das Training über MAGRPOConfig konfigurieren, einschließlich der Lernrate, der Batch-Größe und der Anzahl der Generationen pro Agent pro Prompt.
output_dir = "./magrpo_multi_reward_output"
config = MAGRPOConfig(
num_train_epochs=3,
agent_learning_rate=5e-5,
logging_steps=10,
num_generations=8,
num_turns=1,
max_new_tokens=128,
)Erstellen Sie Trainer#
Das folgende Beispiel initialisiert MAGRPOTrainer mit den oben definierten Agenten, der Belohnungsfunktion und der Konfiguration. RewardProcessors.scale multipliziert Task-Belohnungen mit 100. Mit der Standard-advantage_normalization=True wird die Normalisierung dies weitgehend aufheben, was nicht auf eine 100-fache Stärkung des Policy Gradient schließen lässt.
configured_reward_func = partial(
proper_length_ratio_reward, target_min=2, target_max=3
)
trainer = MAGRPOTrainer(
agents=agents,
reward_func=configured_reward_func,
reward_processor=RewardProcessors.scale(factor=100.0),
args=config,
train_dataset=train_dataset,
tokenizer=tokenizer,
)Training starten#
Der folgende Code trainiert beide Agenten, um die gemeinsame Belohnung zu maximieren und die trainierten Modelle zu speichern.
trainer.train()
trainer.save_model(f"{output_dir}/models")