|
115 | 115 | "from dspy_tasks.actions import run_with_prompt\n", |
116 | 116 | "from dspy_tasks.visualize import display_score, display_results_table\n", |
117 | 117 | "\n", |
118 | | - "# Dein manueller Versuch — ändere den Prompt und führe die Zelle erneut aus!\n", |
119 | | - "MEIN_PROMPT = \"\"\"Classify this IT support ticket.\n", |
120 | | - "Category MUST be one of: Event NO Customer Impact, Failure, Service Request\n", |
121 | | - "Priority MUST be one of: High, Medium, Standard\n", |
122 | | - "Assigned group MUST be one of: SDE - Service Desk, OFC - Office & Collaboration, PRM - Premium Support, CDC - Client Design & Standard SW Integration, OUM - Incident, Helpdesk, Service-Center IKT, Service-Center IKT Bestellungen, Smartcard Office, CBCD - Container Basierte Cloud Dienste, OPC - Applikationen, DevOps - Rein, BVX - ePortal Service Line, IOM - Input / Output Mgmt., OPM - DLC Dispatching, O-SDK, ESTV-RSS-Stammdaten, FIB - BIT Store Bollwerk, Immobilien BAZG, Bedarfsmanagement, Güter und Ausrüstung\"\"\"\n", |
123 | | - "\n", |
124 | | - "result = run_with_prompt(\"ticket_routing\", MEIN_PROMPT, max_eval=3)\n", |
125 | | - "display_score(\"Dein manueller Prompt\", result.score)\n", |
126 | | - "display_results_table(result.individual_scores)" |
| 118 | + "# Dein manueller Prompt — ändere ihn und führe die Zelle erneut aus!\n", |
| 119 | + "MEIN_PROMPT = \"\"\"Klassifiziere dieses IT-Support-Ticket.\n", |
| 120 | + "Kategorie MUSS eine von diesen sein: Event NO Customer Impact, Failure, Service Request\n", |
| 121 | + "Priorität MUSS eine von diesen sein: High, Medium, Standard\n", |
| 122 | + "Zuständige Gruppe MUSS eine von diesen sein: SDE - Service Desk, OFC - Office & Collaboration, PRM - Premium Support, CDC - Client Design & Standard SW Integration, OUM - Incident, Helpdesk, Service-Center IKT, Service-Center IKT Bestellungen, Smartcard Office, CBCD - Container Basierte Cloud Dienste, OPC - Applikationen, DevOps - Rein, BVX - ePortal Service Line, IOM - Input / Output Mgmt., OPM - DLC Dispatching, O-SDK, ESTV-RSS-Stammdaten, FIB - BIT Store Bollwerk, Immobilien BAZG, Bedarfsmanagement, Güter und Ausrüstung\"\"\"\n", |
| 123 | + "\n", |
| 124 | + "manual_result = run_with_prompt(\"ticket_routing\", MEIN_PROMPT, max_eval=8)\n", |
| 125 | + "display_score(\"Dein manueller Prompt\", manual_result.score)\n", |
| 126 | + "display_results_table(manual_result.individual_scores)" |
127 | 127 | ] |
128 | 128 | }, |
129 | 129 | { |
|
169 | 169 | "metadata": {}, |
170 | 170 | "outputs": [], |
171 | 171 | "source": [ |
172 | | - "from dspy_tasks.actions import run_optimization, run_with_prompt\n", |
| 172 | + "from dspy_tasks.actions import run_optimization\n", |
173 | 173 | "from dspy_tasks.tasks import get_task\n", |
174 | 174 | "from dspy_tasks.visualize import display_improvement, display_insight, display_prompt_diff, display_score, display_results_table\n", |
175 | 175 | "\n", |
176 | 176 | "task = get_task(\"ticket_routing\")\n", |
177 | 177 | "print(f\"⏳ Optimiere {task.name} mit BootstrapFewShot...\")\n", |
| 178 | + "print(f\" Basis: dein manueller Prompt\")\n", |
178 | 179 | "print(f\" Das kann 10-60 Sekunden dauern...\\n\")\n", |
179 | 180 | "\n", |
180 | | - "result = run_optimization(\"ticket_routing\", \"BootstrapFewShot\", max_eval=8)\n", |
| 181 | + "bs_result = run_optimization(\"ticket_routing\", \"BootstrapFewShot\", max_eval=8, instructions=MEIN_PROMPT)\n", |
181 | 182 | "\n", |
182 | | - "# Zeige Baseline (zero-shot, OHNE Prompt) vs. Optimiert\n", |
183 | 183 | "print(\"━\" * 60)\n", |
184 | | - "print(\"📊 VORHER: Zero-Shot Baseline (kein Prompt, kein Beispiel)\")\n", |
185 | | - "display_score(\"Zero-Shot Baseline\", result.baseline_score)\n", |
186 | | - "if result.baseline_individual_scores:\n", |
187 | | - " display_results_table(result.baseline_individual_scores)\n", |
| 184 | + "print(\"📊 NACHHER: Optimierter Prompt (dein Prompt + Few-Shot Beispiele)\")\n", |
| 185 | + "display_score(\"Nach BootstrapFewShot\", bs_result.optimized_score)\n", |
| 186 | + "if bs_result.optimized_individual_scores:\n", |
| 187 | + " display_results_table(bs_result.optimized_individual_scores)\n", |
188 | 188 | "\n", |
189 | | - "print(\"\\n\" + \"━\" * 60)\n", |
190 | | - "print(\"📊 NACHHER: Optimierter Prompt (mit Few-Shot Beispielen)\")\n", |
191 | | - "display_score(\"Nach BootstrapFewShot\", result.optimized_score)\n", |
192 | | - "if result.optimized_individual_scores:\n", |
193 | | - " display_results_table(result.optimized_individual_scores)\n", |
| 189 | + "display_improvement(manual_result.score, bs_result.optimized_score)\n", |
194 | 190 | "\n", |
195 | | - "display_improvement(result.baseline_score, result.optimized_score)\n", |
196 | | - "print(f\"⏱️ Optimierung dauerte {result.elapsed_seconds}s | {result.llm_calls} LLM-Aufrufe\")\n", |
197 | | - "\n", |
198 | | - "display_prompt_diff(result.prompt_before, result.prompt_after)\n", |
| 191 | + "display_prompt_diff(MEIN_PROMPT, bs_result.prompt_after)\n", |
199 | 192 | "\n", |
200 | 193 | "display_insight(\"Was gerade passiert ist\",\n", |
201 | | - " f\"Zero-Shot (ohne Prompt): {result.baseline_score:.0%}. \"\n", |
202 | | - " f\"Nach Optimierung: {result.optimized_score:.0%}. \"\n", |
203 | | - " \"Der Optimizer hat aus den Trainingsdaten die besten Beispiel-Tickets ausgewählt und in den Prompt eingefügt. \"\n", |
204 | | - " \"Vergleich das mit deinem manuellen Prompt oben — ist der Optimizer besser?\")" |
| 194 | + " f\"Dein Prompt: {manual_result.score:.0%} → BootstrapFewShot: {bs_result.optimized_score:.0%}. \"\n", |
| 195 | + " \"Der Optimizer hat deinen Prompt als Basis genommen und die besten Beispiel-Tickets hinzugefügt.\")" |
205 | 196 | ] |
206 | 197 | }, |
207 | 198 | { |
|
241 | 232 | "\n", |
242 | 233 | "task = get_task(\"ticket_routing\")\n", |
243 | 234 | "\n", |
244 | | - "# --- BootstrapFewShot ---\n", |
| 235 | + "# --- BootstrapFewShot (basierend auf manuellem Prompt) ---\n", |
245 | 236 | "print(f\"⏳ BootstrapFewShot auf {task.name}...\\n\")\n", |
246 | | - "r_bs = run_optimization(\"ticket_routing\", \"BootstrapFewShot\", max_eval=8)\n", |
247 | | - "print(f\"\\n✅ BootstrapFewShot: {r_bs.baseline_score:.0%} → {r_bs.optimized_score:.0%}\")\n", |
248 | | - "display_improvement(r_bs.baseline_score, r_bs.optimized_score)\n", |
| 237 | + "r_bs = run_optimization(\"ticket_routing\", \"BootstrapFewShot\", max_eval=8, instructions=MEIN_PROMPT)\n", |
| 238 | + "print(f\"✅ BootstrapFewShot: {r_bs.optimized_score:.0%}\")\n", |
249 | 239 | "\n", |
250 | | - "print(\"\\n📝 BootstrapFewShot — Prompt VORHER:\")\n", |
251 | | - "print(r_bs.prompt_before)\n", |
252 | | - "print(\"\\n📝 BootstrapFewShot — Prompt NACHHER:\")\n", |
| 240 | + "print(\"\\n📝 BootstrapFewShot — Prompt:\")\n", |
253 | 241 | "print(r_bs.prompt_after[:2000])\n", |
254 | 242 | "if len(r_bs.prompt_after) > 2000:\n", |
255 | 243 | " print(f\"... ({len(r_bs.prompt_after)} Zeichen)\")\n", |
|
258 | 246 | "if r_bs.optimized_individual_scores:\n", |
259 | 247 | " display_results_table(r_bs.optimized_individual_scores)\n", |
260 | 248 | "\n", |
261 | | - "# --- MIPROv2 ---\n", |
| 249 | + "# --- MIPROv2 (basierend auf dem BESSEREN der beiden bisherigen Ergebnisse) ---\n", |
262 | 250 | "print(f\"\\n{'━'*60}\")\n", |
263 | | - "print(f\"⏳ MIPROv2 auf {task.name}...\\n\")\n", |
264 | | - "r_mipro = run_optimization(\"ticket_routing\", \"MIPROv2\", max_eval=8)\n", |
265 | | - "print(f\"\\n✅ MIPROv2: {r_mipro.baseline_score:.0%} → {r_mipro.optimized_score:.0%}\")\n", |
266 | | - "display_improvement(r_mipro.baseline_score, r_mipro.optimized_score)\n", |
267 | | - "\n", |
268 | | - "print(\"\\n📝 MIPROv2 — Prompt VORHER:\")\n", |
269 | | - "print(r_mipro.prompt_before)\n", |
270 | | - "print(\"\\n📝 MIPROv2 — Prompt NACHHER:\")\n", |
| 251 | + "best_score = max(manual_result.score, r_bs.optimized_score)\n", |
| 252 | + "best_prompt = MEIN_PROMPT if manual_result.score >= r_bs.optimized_score else r_bs.prompt_after\n", |
| 253 | + "best_label = \"Manuell\" if manual_result.score >= r_bs.optimized_score else \"BootstrapFewShot\"\n", |
| 254 | + "print(f\"⏳ MIPROv2 auf {task.name}...\")\n", |
| 255 | + "print(f\" Basis: {best_label} ({best_score:.0%}) — das bisherige beste Ergebnis\\n\")\n", |
| 256 | + "\n", |
| 257 | + "r_mipro = run_optimization(\"ticket_routing\", \"MIPROv2\", max_eval=8, instructions=best_prompt)\n", |
| 258 | + "print(f\"✅ MIPROv2: {r_mipro.optimized_score:.0%}\")\n", |
| 259 | + "\n", |
| 260 | + "print(\"\\n📝 MIPROv2 — Prompt:\")\n", |
271 | 261 | "print(r_mipro.prompt_after[:2000])\n", |
272 | 262 | "if len(r_mipro.prompt_after) > 2000:\n", |
273 | 263 | " print(f\"... ({len(r_mipro.prompt_after)} Zeichen)\")\n", |
|
276 | 266 | "if r_mipro.optimized_individual_scores:\n", |
277 | 267 | " display_results_table(r_mipro.optimized_individual_scores)\n", |
278 | 268 | "\n", |
279 | | - "# --- Vergleich ---\n", |
| 269 | + "# --- Vergleich aller 3 ---\n", |
280 | 270 | "print(f\"\\n{'━'*60}\")\n", |
281 | | - "print(\"📊 Zusammenfassung:\")\n", |
282 | | - "print(f\" Dein manueller Prompt: scroll hoch und vergleich!\")\n", |
283 | | - "print(f\" Zero-Shot Baseline: {r_bs.baseline_score:.0%}\")\n", |
284 | | - "print(f\" BootstrapFewShot: {r_bs.optimized_score:.0%}\")\n", |
285 | | - "print(f\" MIPROv2: {r_mipro.optimized_score:.0%}\")\n", |
| 271 | + "print(\"📊 Alle 3 Prompts im Vergleich:\")\n", |
| 272 | + "print(f\" 1. Manueller Prompt: {manual_result.score:.0%} (deine Anweisung)\")\n", |
| 273 | + "print(f\" 2. BootstrapFewShot: {r_bs.optimized_score:.0%} (dein Prompt + Beispiele)\")\n", |
| 274 | + "print(f\" 3. MIPROv2: {r_mipro.optimized_score:.0%} (bester Prompt + Beispiele + umgeschrieben)\")\n", |
286 | 275 | "\n", |
287 | 276 | "scores = {\n", |
288 | | - " \"BootstrapFewShot\": {\"baseline\": r_bs.baseline_score, \"optimized\": r_bs.optimized_score},\n", |
289 | | - " \"MIPROv2\": {\"baseline\": r_mipro.baseline_score, \"optimized\": r_mipro.optimized_score},\n", |
| 277 | + " \"Manuell\": {\"baseline\": manual_result.score, \"optimized\": manual_result.score},\n", |
| 278 | + " \"BootstrapFewShot\": {\"baseline\": manual_result.score, \"optimized\": r_bs.optimized_score},\n", |
| 279 | + " \"MIPROv2\": {\"baseline\": manual_result.score, \"optimized\": r_mipro.optimized_score},\n", |
290 | 280 | "}\n", |
291 | | - "fig = bar_comparison(\"Ticket Routing: Optimizer-Vergleich\", scores)\n", |
| 281 | + "fig = bar_comparison(\"Ticket Routing: Manuell vs. Optimizer\", scores)\n", |
292 | 282 | "fig.show()" |
293 | 283 | ] |
294 | 284 | }, |
295 | | - { |
296 | | - "cell_type": "code", |
297 | | - "execution_count": null, |
298 | | - "metadata": {}, |
299 | | - "outputs": [], |
300 | | - "source": [] |
301 | | - }, |
302 | 285 | { |
303 | 286 | "cell_type": "markdown", |
304 | 287 | "metadata": {}, |
|
470 | 453 | "metadata": {}, |
471 | 454 | "outputs": [], |
472 | 455 | "source": [ |
473 | | - "# Verfügbare Aufgaben zum Optimieren:\n", |
474 | | - "available = [\"multihop_qa\", \"report_generation\"]\n", |
475 | | - "print(\"Verfügbare Aufgaben:\")\n", |
476 | | - "for tid in available:\n", |
477 | | - " t = get_task(tid)\n", |
478 | | - " examples = t.load_examples()[:2]\n", |
479 | | - " print(f\"\\n 📋 {tid}: {t.name}\")\n", |
480 | | - " print(f\" {t.description}\")\n", |
481 | | - " if examples:\n", |
482 | | - " sample = examples[0]\n", |
483 | | - " input_preview = \" | \".join(f\"{k}={str(v)[:60]}\" for k, v in sample.inputs().items())\n", |
484 | | - " print(f\" Beispiel-Input: {input_preview[:120]}...\")\n", |
485 | | - "\n", |
486 | | - "# ═══ Wähle eine Aufgabe (ändere den String): ═══\n", |
487 | | - "TASK = \"multihop_qa\"\n", |
| 456 | + "# ━━━ Verfügbare Aufgaben ━━━\n", |
| 457 | + "from dspy_tasks.tasks import list_tasks\n", |
| 458 | + "from dspy_tasks.actions import run_with_prompt\n", |
| 459 | + "\n", |
| 460 | + "print(\"Alle verfügbaren Aufgaben:\\n\")\n", |
| 461 | + "for tier in [1, 2, 3, 4]:\n", |
| 462 | + " tasks_in_tier = [t for t in list_tasks() if t.tier == tier]\n", |
| 463 | + " tier_labels = {1: \"Basics\", 2: \"Reasoning\", 3: \"Composition\", 4: \"Agentic\"}\n", |
| 464 | + " print(f\" Tier {tier} — {tier_labels[tier]}:\")\n", |
| 465 | + " for t in tasks_in_tier:\n", |
| 466 | + " examples = t.load_examples()[:1]\n", |
| 467 | + " sample_input = \"\"\n", |
| 468 | + " if examples:\n", |
| 469 | + " sample_input = \" | \".join(f\"{k}={str(v)[:40]}\" for k, v in examples[0].inputs().items())\n", |
| 470 | + " print(f\" • {t.id:25s} {t.name}\")\n", |
| 471 | + " print(f\" {t.description[:80]}\")\n", |
| 472 | + " if sample_input:\n", |
| 473 | + " print(f\" Beispiel: {sample_input[:100]}\")\n", |
| 474 | + " print()\n", |
| 475 | + "\n", |
| 476 | + "# ━━━ Aufgabe 1: Sentiment (BootstrapFewShot) ━━━\n", |
| 477 | + "SENT_PROMPT = \"Bestimme ob diese Bewertung positiv, negativ oder neutral ist.\"\n", |
| 478 | + "print(\"━\" * 60)\n", |
| 479 | + "print(\"📋 Sentiment Classification — BootstrapFewShot\\n\")\n", |
| 480 | + "\n", |
| 481 | + "manual_sent = run_with_prompt(\"sentiment\", SENT_PROMPT, max_eval=8)\n", |
| 482 | + "display_score(\"Sentiment: Manueller Prompt\", manual_sent.score)\n", |
| 483 | + "display_results_table(manual_sent.individual_scores)\n", |
| 484 | + "\n", |
| 485 | + "print(\"\\n⏳ Optimiere mit BootstrapFewShot (basierend auf manuellem Prompt)...\")\n", |
| 486 | + "r_sent = run_optimization(\"sentiment\", \"BootstrapFewShot\", max_eval=8, instructions=SENT_PROMPT)\n", |
| 487 | + "display_score(\"Sentiment: Nach BootstrapFewShot\", r_sent.optimized_score)\n", |
| 488 | + "if r_sent.optimized_individual_scores:\n", |
| 489 | + " display_results_table(r_sent.optimized_individual_scores)\n", |
| 490 | + "display_improvement(manual_sent.score, r_sent.optimized_score)\n", |
488 | 491 | "\n", |
| 492 | + "# ━━━ Aufgabe 2: Multi-Hop QA (BootstrapFewShot → MIPROv2) ━━━\n", |
| 493 | + "MHQA_PROMPT = \"Beantworte die Frage basierend auf dem Kontext. Denke Schritt für Schritt.\"\n", |
489 | 494 | "print(f\"\\n{'━'*60}\")\n", |
490 | | - "print(f\"⏳ Optimiere {TASK}...\")\n", |
491 | | - "result = run_optimization(TASK, \"BootstrapFewShot\", max_eval=8)\n", |
492 | | - "display_improvement(result.baseline_score, result.optimized_score)\n", |
493 | | - "display_prompt_diff(result.prompt_before, result.prompt_after)\n", |
494 | | - "\n", |
495 | | - "# Zeige Ergebnisse pro Beispiel\n", |
496 | | - "print(\"\\n📊 Ergebnisse nach Optimierung:\")\n", |
497 | | - "if result.optimized_individual_scores:\n", |
498 | | - " display_results_table(result.optimized_individual_scores)" |
| 495 | + "print(\"📋 Multi-Hop QA — BootstrapFewShot → MIPROv2\\n\")\n", |
| 496 | + "\n", |
| 497 | + "manual_mhqa = run_with_prompt(\"multihop_qa\", MHQA_PROMPT, max_eval=8)\n", |
| 498 | + "display_score(\"Multi-Hop QA: Manueller Prompt\", manual_mhqa.score)\n", |
| 499 | + "display_results_table(manual_mhqa.individual_scores)\n", |
| 500 | + "\n", |
| 501 | + "# Erst BootstrapFewShot\n", |
| 502 | + "print(\"\\n⏳ Schritt 1: BootstrapFewShot...\")\n", |
| 503 | + "r_mhqa_bs = run_optimization(\"multihop_qa\", \"BootstrapFewShot\", max_eval=8, instructions=MHQA_PROMPT)\n", |
| 504 | + "display_score(\"Multi-Hop QA: Nach BootstrapFewShot\", r_mhqa_bs.optimized_score)\n", |
| 505 | + "\n", |
| 506 | + "# Dann MIPROv2 auf dem besseren Ergebnis\n", |
| 507 | + "best_mhqa_score = max(manual_mhqa.score, r_mhqa_bs.optimized_score)\n", |
| 508 | + "best_mhqa_prompt = MHQA_PROMPT if manual_mhqa.score >= r_mhqa_bs.optimized_score else r_mhqa_bs.prompt_after\n", |
| 509 | + "best_mhqa_label = \"Manuell\" if manual_mhqa.score >= r_mhqa_bs.optimized_score else \"BootstrapFewShot\"\n", |
| 510 | + "print(f\"\\n⏳ Schritt 2: MIPROv2 (basierend auf {best_mhqa_label}: {best_mhqa_score:.0%})...\")\n", |
| 511 | + "r_mhqa = run_optimization(\"multihop_qa\", \"MIPROv2\", max_eval=8, instructions=best_mhqa_prompt)\n", |
| 512 | + "display_score(\"Multi-Hop QA: Nach MIPROv2\", r_mhqa.optimized_score)\n", |
| 513 | + "if r_mhqa.optimized_individual_scores:\n", |
| 514 | + " display_results_table(r_mhqa.optimized_individual_scores)\n", |
| 515 | + "\n", |
| 516 | + "print(f\"\\n📊 Manuell {manual_mhqa.score:.0%} → BootstrapFewShot {r_mhqa_bs.optimized_score:.0%} → MIPROv2 {r_mhqa.optimized_score:.0%}\")" |
499 | 517 | ] |
500 | 518 | }, |
501 | 519 | { |
|
0 commit comments