| from training.prompt_templates import format_arbitrator_observation |
| from training.rollout import generate_decision |
|
|
|
|
| def save_frozen_checkpoint(model, tokenizer, path: str = "./frozen_baseline"): |
| """ |
| Call this at step 0 before any training. |
| This is your primary proof of learning. |
| Non-negotiable. |
| """ |
| model.save_pretrained(path) |
| tokenizer.save_pretrained(path) |
| print(f"Frozen baseline saved to {path}") |
|
|
|
|
| def load_frozen(path: str): |
| try: |
| from unsloth import FastLanguageModel |
| model, tokenizer = FastLanguageModel.from_pretrained( |
| model_name=path, |
| max_seq_length=4096, |
| load_in_4bit=True, |
| fast_inference=True, |
| ) |
| return model |
| except ImportError: |
| from transformers import AutoModelForCausalLM |
| return AutoModelForCausalLM.from_pretrained(path) |
|
|
|
|
| def evaluate_vs_frozen( |
| trained_model, |
| frozen_checkpoint_path: str, |
| env_client, |
| tokenizer, |
| num_episodes: int = 100 |
| ) -> dict: |
| """ |
| Runs trained Agent C against frozen Agent C baseline. |
| Both face the same episodes. |
| Returns comparative metrics. |
| """ |
| frozen_model = load_frozen(frozen_checkpoint_path) |
|
|
| trained_results = [] |
| frozen_results = [] |
|
|
| for _ in range(num_episodes): |
| obs = env_client.reset() |
|
|
| messages = format_arbitrator_observation(obs) |
| prompt = tokenizer.apply_chat_template(messages, tokenize=False) |
| _, trained_decision = generate_decision(trained_model, tokenizer, prompt) |
| trained_result = env_client.step(trained_decision or {"action": "nothing"}) |
| trained_results.append(trained_result) |
|
|
| obs_reset = env_client.reset() |
| _, frozen_decision = generate_decision(frozen_model, tokenizer, prompt) |
| frozen_result = env_client.step(frozen_decision or {"action": "nothing"}) |
| frozen_results.append(frozen_result) |
|
|
| return { |
| "trained_accuracy": sum(r["info"]["agent_c_was_correct"] for r in trained_results) / num_episodes, |
| "frozen_accuracy": sum(r["info"]["agent_c_was_correct"] for r in frozen_results) / num_episodes, |
| "trained_merge_rate": sum(r["info"]["spec_satisfied"] for r in trained_results) / num_episodes, |
| "frozen_merge_rate": sum(r["info"]["spec_satisfied"] for r in frozen_results) / num_episodes, |
| } |
|
|