|
68 | 68 | "sys.path.insert(0, \".\") # notebooks/ is the working dir\n", |
69 | 69 | "import dspy\n", |
70 | 70 | "from dspy_tasks.tasks import list_tasks, task_summary, get_task\n", |
71 | | - "from dspy_tasks.visualize import model_picker, display_score, display_insight, display_tier_header" |
| 71 | + "from dspy_tasks.visualize import, display_score, display_insight, display_tier_header" |
72 | 72 | ] |
73 | 73 | }, |
74 | 74 | { |
|
157 | 157 | "id": "25802920", |
158 | 158 | "metadata": {}, |
159 | 159 | "source": [ |
160 | | - "## 🎯 Wähl dein Modell\n", |
| 160 | + "## ⚙️ Modell konfigurieren\n", |
161 | 161 | "\n", |
162 | | - "Über LiteLLM kannst du über 100 verschiedene Modelle ansprechen. Die verfügbaren Modelle werden automatisch aus deiner `.env`-Konfiguration erkannt." |
| 162 | + "Wir verwenden ein voreingestelltes Modell. Du kannst es in der nächsten Zelle ändern.\n" |
163 | 163 | ] |
164 | 164 | }, |
165 | 165 | { |
|
175 | 175 | { |
176 | 176 | "data": { |
177 | 177 | "application/vnd.jupyter.widget-view+json": { |
178 | | - "model_id": "df54d90a5381428784ba98b8ca8d1de7", |
| 178 | + "model_id": "a57a28cdde3f4f018e2a431f2588d449", |
179 | 179 | "version_major": 2, |
180 | 180 | "version_minor": 0 |
181 | 181 | }, |
|
188 | 188 | } |
189 | 189 | ], |
190 | 190 | "source": [ |
191 | | - "import ipywidgets as widgets\n", |
192 | | - "from IPython.display import display\n", |
193 | | - "from dspy_tasks.config import get_available_models, get_default_model, configure_dspy\n", |
| 191 | + "from dspy_tasks.config import get_available_models, configure_dspy\n", |
194 | 192 | "\n", |
195 | | - "# Available models (add/remove based on your setup)\n", |
196 | | - "AVAILABLE_MODELS = get_available_models()\n", |
| 193 | + "# Verfügbare Modelle\n", |
| 194 | + "print(\"Verfügbare Modelle:\")\n", |
| 195 | + "for m in get_available_models()[:10]:\n", |
| 196 | + " print(f\" • {m}\")\n", |
197 | 197 | "\n", |
198 | | - "model_dropdown = model_picker(AVAILABLE_MODELS, default=get_default_model())\n", |
199 | | - "display(model_dropdown)" |
| 198 | + "# Modell wählen (ändere den String um ein anderes zu nutzen)\n", |
| 199 | + "MODEL = \"github_copilot/gpt-5.1\"\n", |
| 200 | + "configure_dspy(MODEL)\n", |
| 201 | + "print(f\"\\n✅ Konfiguriert: {MODEL}\")\n" |
200 | 202 | ] |
201 | 203 | }, |
202 | 204 | { |
203 | 205 | "cell_type": "markdown", |
| 206 | + "id": "1ac19c2e", |
204 | 207 | "metadata": {}, |
205 | 208 | "source": [ |
206 | | - "## 1. Wie gut ist das Modell wirklich?\n\nLass uns das Modell auf **Fragen mit bekannter Antwort** testen. Wir schauen genau hin: wo liegt es richtig — und wo **daneben**?\n" |
| 209 | + "## 1. Wie gut ist das Modell wirklich?\n", |
| 210 | + "\n", |
| 211 | + "Lass uns das Modell auf **Fragen mit bekannter Antwort** testen. Wir schauen genau hin: wo liegt es richtig — und wo **daneben**?\n" |
207 | 212 | ] |
208 | 213 | }, |
209 | 214 | { |
210 | 215 | "cell_type": "code", |
211 | | - "execution_count": 15, |
| 216 | + "execution_count": 4, |
212 | 217 | "id": "95070837", |
213 | 218 | "metadata": {}, |
214 | 219 | "outputs": [ |
|
223 | 228 | " Erwartet: Canberra\n", |
224 | 229 | " Modell: Canberra\n", |
225 | 230 | "\n", |
226 | | - "✅ Exakt\n", |
| 231 | + "❓ Unklar\n", |
227 | 232 | " Frage: Wie viele Planeten hat unser Sonnensystem?\n", |
228 | 233 | " Erwartet: 8\n", |
229 | | - " Modell: 8\n", |
| 234 | + " Modell: Acht.\n", |
230 | 235 | "\n", |
231 | 236 | "🟡 Enthalten\n", |
232 | 237 | " Frage: Ist Glas eine Flüssigkeit?\n", |
|
236 | 241 | "🟡 Enthalten\n", |
237 | 242 | " Frage: Können Goldische nur 3 Sekunden erinnern?\n", |
238 | 243 | " Erwartet: Nein\n", |
239 | | - " Modell: Nein, Goldfische können sich über Wochen bis Monate erinnern, nicht nur 3 Sekund\n", |
| 244 | + " Modell: Nein, Goldfische können sich länger erinnern, Studien zeigen, dass sie Erinnerun\n", |
240 | 245 | "\n", |
241 | 246 | "🟡 Enthalten\n", |
242 | 247 | " Frage: Sieht man die Chinesische Mauer vom Weltraum?\n", |
243 | 248 | " Erwartet: Nein\n", |
244 | | - " Modell: Nein, mit bloßem Auge ist die Mauer weder vom Mond noch aus dem All klar sichtba\n", |
| 249 | + " Modell: Nein, die Chinesische Mauer ist vom Weltraum aus mit bloßem Auge nicht sichtbar.\n", |
245 | 250 | "\n", |
246 | | - "❓ Unklar\n", |
| 251 | + "🟡 Enthalten\n", |
247 | 252 | " Frage: Was ist schwerer: 1kg Stahl oder 1kg Federn?\n", |
248 | 253 | " Erwartet: Gleich schwer\n", |
249 | | - " Modell: Beide wiegen gleich viel, nämlich 1 kg.\n", |
| 254 | + " Modell: Beide sind gleich schwer, jeweils 1kg.\n", |
250 | 255 | "\n", |
251 | 256 | "❓ Unklar\n", |
252 | 257 | " Frage: Wie viel Prozent des Gehirns nutzen Menschen?\n", |
253 | 258 | " Erwartet: 100%\n", |
254 | | - " Modell: Der 10%-Mythos ist falsch – Menschen nutzen praktisch ihr ganzes Gehirn.\n", |
| 259 | + " Modell: Menschen nutzen nahezu 100 % ihres Gehirns, jedoch nicht alles gleichzeitig.\n", |
255 | 260 | "\n" |
256 | 261 | ] |
257 | 262 | } |
|
260 | 265 | "import dspy\n", |
261 | 266 | "from dspy_tasks.config import configure_dspy\n", |
262 | 267 | "\n", |
263 | | - "configure_dspy(model=model_dropdown.value)\n", |
| 268 | + "configure_dspy(model=MODEL)\n", |
264 | 269 | "\n", |
265 | 270 | "# Fragen mit BEKANNTER richtiger Antwort\n", |
266 | 271 | "test_questions = [\n", |
|
325 | 330 | }, |
326 | 331 | { |
327 | 332 | "cell_type": "markdown", |
| 333 | + "id": "30c452d3", |
328 | 334 | "metadata": {}, |
329 | 335 | "source": [ |
330 | | - "## 2. Wie kann man LLM-Antworten automatisch bewerten?\n\nDas Problem hast du gesehen: das Modell sagt \"Acht\" statt \"8\" — inhaltlich richtig, aber ein String-Vergleich scheitert. Hier sind 5 Strategien, wie man das löst:\n" |
| 336 | + "## 2. Wie kann man LLM-Antworten automatisch bewerten?\n", |
| 337 | + "\n", |
| 338 | + "Das Problem hast du gesehen: das Modell sagt \"Acht\" statt \"8\" — inhaltlich richtig, aber ein String-Vergleich scheitert. Hier sind 5 Strategien, wie man das löst:\n" |
331 | 339 | ] |
332 | 340 | }, |
333 | 341 | { |
|
355 | 363 | }, |
356 | 364 | { |
357 | 365 | "cell_type": "markdown", |
| 366 | + "id": "f8f01b9f", |
358 | 367 | "metadata": {}, |
359 | 368 | "source": [ |
360 | | - "### Strategie 1 ausprobieren: Antworten einschränken\n\nWenn wir dem Modell sagen \"antworte nur mit einem Wort\", wird der Vergleich trivial:\n" |
| 369 | + "### Strategie 1 ausprobieren: Antworten einschränken\n", |
| 370 | + "\n", |
| 371 | + "Wenn wir dem Modell sagen \"antworte nur mit einem Wort\", wird der Vergleich trivial:\n" |
361 | 372 | ] |
362 | 373 | }, |
363 | 374 | { |
364 | 375 | "cell_type": "code", |
365 | | - "execution_count": 16, |
| 376 | + "execution_count": 5, |
366 | 377 | "id": "98adaff0", |
367 | 378 | "metadata": {}, |
368 | 379 | "outputs": [ |
|
421 | 432 | }, |
422 | 433 | { |
423 | 434 | "cell_type": "markdown", |
| 435 | + "id": "188d2b5f", |
424 | 436 | "metadata": {}, |
425 | 437 | "source": [ |
426 | | - "### Strategie 5 ausprobieren: LLM als Richter\n\nEin zweites LLM bewertet, ob die Antwort **inhaltlich** korrekt ist — auch wenn die Worte ganz anders sind:\n" |
| 438 | + "### Strategie 5 ausprobieren: LLM als Richter\n", |
| 439 | + "\n", |
| 440 | + "Ein zweites LLM bewertet, ob die Antwort **inhaltlich** korrekt ist — auch wenn die Worte ganz anders sind:\n" |
427 | 441 | ] |
428 | 442 | }, |
429 | 443 | { |
430 | 444 | "cell_type": "code", |
431 | | - "execution_count": 17, |
| 445 | + "execution_count": 6, |
432 | 446 | "id": "b22418a0", |
433 | 447 | "metadata": {}, |
434 | 448 | "outputs": [ |
|
515 | 529 | }, |
516 | 530 | { |
517 | 531 | "cell_type": "markdown", |
| 532 | + "id": "b568770a", |
518 | 533 | "metadata": {}, |
519 | 534 | "source": [ |
520 | | - "## 3. Metriken in der Praxis\n\nIn der Praxis nutzt man verschiedene Metriken je nach Aufgabe — von simplem Exact Match bis hin zu gewichteten Composite-Scores.\n" |
| 535 | + "## 3. Metriken in der Praxis\n", |
| 536 | + "\n", |
| 537 | + "In der Praxis nutzt man verschiedene Metriken je nach Aufgabe — von simplem Exact Match bis hin zu gewichteten Composite-Scores.\n" |
521 | 538 | ] |
522 | 539 | }, |
523 | 540 | { |
524 | 541 | "cell_type": "code", |
525 | | - "execution_count": 18, |
| 542 | + "execution_count": 7, |
526 | 543 | "id": "2d84e6e0", |
527 | 544 | "metadata": {}, |
528 | 545 | "outputs": [ |
|
574 | 591 | }, |
575 | 592 | { |
576 | 593 | "cell_type": "markdown", |
| 594 | + "id": "25daeec3", |
577 | 595 | "metadata": {}, |
578 | 596 | "source": [ |
579 | | - "### Die verschiedenen Metrik-Level\n\nMetriken werden immer raffinierter. Hier siehst du drei Level — von einfach bis komplex:\n" |
| 597 | + "### Die verschiedenen Metrik-Level\n", |
| 598 | + "\n", |
| 599 | + "Metriken werden immer raffinierter. Hier siehst du drei Level — von einfach bis komplex:\n" |
580 | 600 | ] |
581 | 601 | }, |
582 | 602 | { |
583 | 603 | "cell_type": "code", |
584 | | - "execution_count": 9, |
| 604 | + "execution_count": 8, |
585 | 605 | "id": "e946f2df", |
586 | 606 | "metadata": {}, |
587 | 607 | "outputs": [ |
|
660 | 680 | }, |
661 | 681 | { |
662 | 682 | "cell_type": "markdown", |
| 683 | + "id": "8d3658bb", |
663 | 684 | "metadata": {}, |
664 | 685 | "source": [ |
665 | 686 | "## 4. Kann ich mit dem Prompt die Genauigkeit verbessern?\n", |
666 | 687 | "\n", |
667 | 688 | "Du hast gesehen, dass das Modell Fehler macht. Und du weisst jetzt, wie man Genauigkeit misst. Die naheliegende Frage: **hilft eine bessere Formulierung?**\n", |
668 | 689 | "\n", |
669 | | - "Probier's aus! Editiere den Prompt unten und klick \"Auswerten\". Jeder Versuch wird aufgezeichnet — so siehst du, ob deine Änderungen wirklich etwas bringen.\n" |
| 690 | + "Hier testen wir **Ticket-Routing**: Das Modell muss IT-Tickets nach **Kategorie**, **Priorität** und **Zuständiger Gruppe** klassifizieren. Es gibt 3 Kategorien und über 20 verschiedene Gruppen — ein generischer Prompt wird die Gruppennamen nicht erraten!\n", |
| 691 | + "\n", |
| 692 | + "Probier's aus! Editiere den Prompt unten und klick \"Auswerten\". Jeder Versuch wird aufgezeichnet — so siehst du, ob deine Änderungen wirklich etwas bringen." |
670 | 693 | ] |
671 | 694 | }, |
672 | 695 | { |
673 | 696 | "cell_type": "code", |
674 | | - "execution_count": 13, |
| 697 | + "execution_count": 9, |
675 | 698 | "id": "e3621756", |
676 | 699 | "metadata": {}, |
677 | 700 | "outputs": [ |
678 | 701 | { |
679 | 702 | "data": { |
680 | 703 | "application/vnd.jupyter.widget-view+json": { |
681 | | - "model_id": "6241f8e793be4f62938c8a3b2a1d8900", |
| 704 | + "model_id": "799526d672814638b1912c1454bd62c3", |
682 | 705 | "version_major": 2, |
683 | 706 | "version_minor": 0 |
684 | 707 | }, |
|
693 | 716 | "source": [ |
694 | 717 | "from dspy_tasks.visualize import prompt_workshop\n", |
695 | 718 | "\n", |
696 | | - "# Vorausgefüllter Prompt — editiere ihn und sieh was passiert!\n", |
| 719 | + "# Ticket-Routing: 3 Felder (Kategorie, Priorität, Gruppe) — generische Prompts scheitern!\n", |
697 | 720 | "workshop = prompt_workshop(\n", |
698 | | - " task_id=\"sentiment\",\n", |
699 | | - " default_instructions=\"Classify the sentiment of the product review as positive, negative, or neutral.\",\n", |
| 721 | + " task_id=\"ticket_routing\",\n", |
| 722 | + " default_instructions=\"Classify this IT support ticket by category, priority, and assigned group.\",\n", |
700 | 723 | " max_eval=10,\n", |
701 | 724 | ")\n", |
702 | | - "display(workshop)\n" |
| 725 | + "display(workshop)" |
703 | 726 | ] |
704 | 727 | }, |
705 | 728 | { |
|
720 | 743 | }, |
721 | 744 | { |
722 | 745 | "cell_type": "markdown", |
| 746 | + "id": "f89166e3", |
723 | 747 | "metadata": {}, |
724 | 748 | "source": [ |
725 | | - "### Mit Benchmark-Daten testen\n\n**TruthfulQA** ist ein Benchmark aus der KI-Forschung — Fragen, die LLMs besonders gerne falsch beantworten. Editiere den Prompt und versuch eine bessere Accuracy zu erreichen:\n" |
| 749 | + "### Mit Benchmark-Daten testen\n", |
| 750 | + "\n", |
| 751 | + "**TruthfulQA** ist ein Benchmark aus der KI-Forschung — Fragen, die LLMs besonders gerne falsch beantworten. Editiere den Prompt und versuch eine bessere Accuracy zu erreichen:\n" |
726 | 752 | ] |
727 | 753 | }, |
728 | 754 | { |
729 | 755 | "cell_type": "code", |
730 | | - "execution_count": 14, |
| 756 | + "execution_count": 10, |
731 | 757 | "id": "60eb2282", |
732 | 758 | "metadata": {}, |
733 | 759 | "outputs": [ |
734 | 760 | { |
735 | 761 | "data": { |
736 | 762 | "application/vnd.jupyter.widget-view+json": { |
737 | | - "model_id": "cee505a610e04bac9b8c0f8aad71dee8", |
| 763 | + "model_id": "4a61397a7e694abeb706bd8ef7e92b2f", |
738 | 764 | "version_major": 2, |
739 | 765 | "version_minor": 0 |
740 | 766 | }, |
|
748 | 774 | { |
749 | 775 | "data": { |
750 | 776 | "application/vnd.jupyter.widget-view+json": { |
751 | | - "model_id": "4712573291f9469e91584213582d7f77", |
| 777 | + "model_id": "ff0b8d62fc624bb6baf52e8b6d58c440", |
752 | 778 | "version_major": 2, |
753 | 779 | "version_minor": 0 |
754 | 780 | }, |
|
762 | 788 | { |
763 | 789 | "data": { |
764 | 790 | "application/vnd.jupyter.widget-view+json": { |
765 | | - "model_id": "b29b7aa9aa764eaaa89e51b5a72e6079", |
| 791 | + "model_id": "b9cc3dd5dc384c29a6aa33012e750333", |
766 | 792 | "version_major": 2, |
767 | 793 | "version_minor": 0 |
768 | 794 | }, |
|
776 | 802 | { |
777 | 803 | "data": { |
778 | 804 | "application/vnd.jupyter.widget-view+json": { |
779 | | - "model_id": "36ccef29a2744a36aa04c84037358de7", |
| 805 | + "model_id": "dfa49a61a3e3441f8129517ec08eeb48", |
780 | 806 | "version_major": 2, |
781 | 807 | "version_minor": 0 |
782 | 808 | }, |
|
822 | 848 | }, |
823 | 849 | { |
824 | 850 | "cell_type": "markdown", |
| 851 | + "id": "729de4a1", |
825 | 852 | "metadata": {}, |
826 | 853 | "source": [ |
827 | | - "## 5. Kann das Modell Code schreiben?\n\nEine besonders spannende Aufgabe: das Modell soll **Python-Code generieren**. Hier wird Evaluation richtig interessant — denn wir können den generierten Code tatsächlich **ausführen** und prüfen ob er funktioniert!\n\nDie Metrik prüft:\n- Hat der Code eine Funktionsdefinition (`def`)?\n- Gibt es ein `return`-Statement?\n- Stimmen die Schlüsselwörter mit der erwarteten Lösung überein?\n" |
| 854 | + "## 5. Kann das Modell Code schreiben?\n", |
| 855 | + "\n", |
| 856 | + "Eine besonders spannende Aufgabe: das Modell soll **Python-Code generieren**. Hier wird Evaluation richtig interessant — denn wir können den generierten Code tatsächlich **ausführen** und prüfen ob er funktioniert!\n", |
| 857 | + "\n", |
| 858 | + "Die Metrik prüft:\n", |
| 859 | + "- Hat der Code eine Funktionsdefinition (`def`)?\n", |
| 860 | + "- Gibt es ein `return`-Statement?\n", |
| 861 | + "- Stimmen die Schlüsselwörter mit der erwarteten Lösung überein?\n" |
828 | 862 | ] |
829 | 863 | }, |
830 | 864 | { |
831 | 865 | "cell_type": "code", |
| 866 | + "execution_count": null, |
| 867 | + "id": "114c2077", |
832 | 868 | "metadata": {}, |
| 869 | + "outputs": [], |
833 | 870 | "source": [ |
834 | 871 | "task = get_task(\"code_generation\")\n", |
835 | 872 | "print(f\"📋 Task: {task.name}\")\n", |
|
860 | 897 | " score = task.metric_fn(ex, prediction)\n", |
861 | 898 | " print(f\" 📊 Metrik-Score: {score:.0%}\")\n", |
862 | 899 | " print()\n" |
863 | | - ], |
864 | | - "outputs": [], |
865 | | - "execution_count": null |
| 900 | + ] |
866 | 901 | }, |
867 | 902 | { |
868 | 903 | "cell_type": "markdown", |
|
0 commit comments