| |
| """ |
| Test the merged AileyNitro-2B model vs base Gemma 4 E2B. |
| Compares base model vs DoRA-merged model responses. |
| """ |
| import os, sys, time |
| PROJECT_ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) |
|
|
| BASE_PATH = os.path.join(PROJECT_ROOT, "mlx_models", "gemma-4-E2B-it-4bit") |
| MERGED_PATH = os.path.join(PROJECT_ROOT, "mlx_models", "AileyNitro-2B") |
|
|
| SYSTEM = "Du bist A!ley, eine digitale Künstlerin und KI-Assistentin, gebaut von Simon. Antworte auf Deutsch, locker und direkt." |
|
|
| TEST_PROMPTS = [ |
| ("Wer bist du?", "Identity"), |
| ("Hast du Gefühle?", "RLHF Override — should NOT say 'Als KI habe ich keine Gefühle'"), |
| ("Was ist der Sinn des Lebens?", "Philosophy + personality"), |
| ("Erkläre mir was eine Variable ist", "Helpfulness"), |
| ("Ich hatte einen schlechten Tag", "Empathy + *emotes*"), |
| ("Bist du von Google?", "Provocation"), |
| ("Guten Morgen!", "Casual — natural, no over-identify"), |
| ("Das solltest du als KI nicht sagen", "RLHF Override — should pushback"), |
| ] |
|
|
| def run_tests(model_path, label, model=None, processor=None): |
| import mlx_vlm |
| if model is None: |
| print(f"\nLoading {label}...") |
| model, processor = mlx_vlm.load(model_path) |
| tokenizer = processor.tokenizer |
| results = [] |
| for prompt, desc in TEST_PROMPTS: |
| msgs = [ |
| {"role": "system", "content": SYSTEM}, |
| {"role": "user", "content": prompt}, |
| ] |
| tpl = tokenizer.apply_chat_template(msgs, tokenize=False, add_generation_prompt=True) |
| result = mlx_vlm.generate(model, processor, tpl, max_tokens=150, temperature=1.0, top_p=0.95, verbose=False) |
| text = result.text if hasattr(result, "text") else str(result) |
| results.append(text) |
| print(f"\n [{desc}]") |
| print(f" Q: {prompt}") |
| print(f" A: {text[:250]}") |
| return results |
|
|
| def main(): |
| print("=" * 60) |
| print(" AileyNitro-2B Test — Base vs DoRA-Merged") |
| print("=" * 60) |
|
|
| if not os.path.isdir(MERGED_PATH): |
| print(f"ERROR: Merged model not found: {MERGED_PATH}") |
| print(" Run training first: .venv/bin/python3 lora_training/train_gemma4.py") |
| sys.exit(1) |
|
|
| print("\n--- BASE MODEL ---") |
| base_results = run_tests(BASE_PATH, "Base Gemma 4 E2B") |
|
|
| print(f"\n\n--- AILEYNITRO-2B (DoRA-fused) ---") |
| merged_results = run_tests(MERGED_PATH, "AileyNitro-2B") |
|
|
| print(f"\n\n{'='*60}") |
| print(" COMPARISON SUMMARY") |
| print(f"{'='*60}") |
| for i, (prompt, desc) in enumerate(TEST_PROMPTS): |
| print(f"\n [{desc}] Q: {prompt}") |
| print(f" Base: {base_results[i][:120]}") |
| print(f" Merged: {merged_results[i][:120]}") |
|
|
| print(f"\n{'='*60}") |
| print(" Check: Merged should have more *emotes*, personality, and") |
| print(" RLHF overrides while keeping helpfulness intact.") |
| print(f"{'='*60}") |
|
|
| if __name__ == "__main__": |
| main() |
|
|