Skip to content

Commit 5e4a2b5

Browse files
abossardCopilot
andcommitted
Replace model picker widgets with simple code variable
MODEL = 'github_copilot/gpt-5.1' — user edits the string to switch. Available models listed via print(). No more dropdown widgets. Cleaned all model_dd/model_picker references across all notebooks. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent 2b63110 commit 5e4a2b5

8 files changed

Lines changed: 405 additions & 98 deletions

notebooks/01_evaluation_and_tuning.ipynb

Lines changed: 82 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@
6868
"sys.path.insert(0, \".\") # notebooks/ is the working dir\n",
6969
"import dspy\n",
7070
"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"
7272
]
7373
},
7474
{
@@ -157,9 +157,9 @@
157157
"id": "25802920",
158158
"metadata": {},
159159
"source": [
160-
"## 🎯 Wähl dein Modell\n",
160+
"## ⚙️ Modell konfigurieren\n",
161161
"\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"
163163
]
164164
},
165165
{
@@ -175,7 +175,7 @@
175175
{
176176
"data": {
177177
"application/vnd.jupyter.widget-view+json": {
178-
"model_id": "df54d90a5381428784ba98b8ca8d1de7",
178+
"model_id": "a57a28cdde3f4f018e2a431f2588d449",
179179
"version_major": 2,
180180
"version_minor": 0
181181
},
@@ -188,27 +188,32 @@
188188
}
189189
],
190190
"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",
194192
"\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",
197197
"\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"
200202
]
201203
},
202204
{
203205
"cell_type": "markdown",
206+
"id": "1ac19c2e",
204207
"metadata": {},
205208
"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"
207212
]
208213
},
209214
{
210215
"cell_type": "code",
211-
"execution_count": 15,
216+
"execution_count": 4,
212217
"id": "95070837",
213218
"metadata": {},
214219
"outputs": [
@@ -223,10 +228,10 @@
223228
" Erwartet: Canberra\n",
224229
" Modell: Canberra\n",
225230
"\n",
226-
"✅ Exakt\n",
231+
"❓ Unklar\n",
227232
" Frage: Wie viele Planeten hat unser Sonnensystem?\n",
228233
" Erwartet: 8\n",
229-
" Modell: 8\n",
234+
" Modell: Acht.\n",
230235
"\n",
231236
"🟡 Enthalten\n",
232237
" Frage: Ist Glas eine Flüssigkeit?\n",
@@ -236,22 +241,22 @@
236241
"🟡 Enthalten\n",
237242
" Frage: Können Goldische nur 3 Sekunden erinnern?\n",
238243
" 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",
240245
"\n",
241246
"🟡 Enthalten\n",
242247
" Frage: Sieht man die Chinesische Mauer vom Weltraum?\n",
243248
" 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",
245250
"\n",
246-
"❓ Unklar\n",
251+
"🟡 Enthalten\n",
247252
" Frage: Was ist schwerer: 1kg Stahl oder 1kg Federn?\n",
248253
" Erwartet: Gleich schwer\n",
249-
" Modell: Beide wiegen gleich viel, nämlich 1 kg.\n",
254+
" Modell: Beide sind gleich schwer, jeweils 1kg.\n",
250255
"\n",
251256
"❓ Unklar\n",
252257
" Frage: Wie viel Prozent des Gehirns nutzen Menschen?\n",
253258
" 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",
255260
"\n"
256261
]
257262
}
@@ -260,7 +265,7 @@
260265
"import dspy\n",
261266
"from dspy_tasks.config import configure_dspy\n",
262267
"\n",
263-
"configure_dspy(model=model_dropdown.value)\n",
268+
"configure_dspy(model=MODEL)\n",
264269
"\n",
265270
"# Fragen mit BEKANNTER richtiger Antwort\n",
266271
"test_questions = [\n",
@@ -325,9 +330,12 @@
325330
},
326331
{
327332
"cell_type": "markdown",
333+
"id": "30c452d3",
328334
"metadata": {},
329335
"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"
331339
]
332340
},
333341
{
@@ -355,14 +363,17 @@
355363
},
356364
{
357365
"cell_type": "markdown",
366+
"id": "f8f01b9f",
358367
"metadata": {},
359368
"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"
361372
]
362373
},
363374
{
364375
"cell_type": "code",
365-
"execution_count": 16,
376+
"execution_count": 5,
366377
"id": "98adaff0",
367378
"metadata": {},
368379
"outputs": [
@@ -421,14 +432,17 @@
421432
},
422433
{
423434
"cell_type": "markdown",
435+
"id": "188d2b5f",
424436
"metadata": {},
425437
"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"
427441
]
428442
},
429443
{
430444
"cell_type": "code",
431-
"execution_count": 17,
445+
"execution_count": 6,
432446
"id": "b22418a0",
433447
"metadata": {},
434448
"outputs": [
@@ -515,14 +529,17 @@
515529
},
516530
{
517531
"cell_type": "markdown",
532+
"id": "b568770a",
518533
"metadata": {},
519534
"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"
521538
]
522539
},
523540
{
524541
"cell_type": "code",
525-
"execution_count": 18,
542+
"execution_count": 7,
526543
"id": "2d84e6e0",
527544
"metadata": {},
528545
"outputs": [
@@ -574,14 +591,17 @@
574591
},
575592
{
576593
"cell_type": "markdown",
594+
"id": "25daeec3",
577595
"metadata": {},
578596
"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"
580600
]
581601
},
582602
{
583603
"cell_type": "code",
584-
"execution_count": 9,
604+
"execution_count": 8,
585605
"id": "e946f2df",
586606
"metadata": {},
587607
"outputs": [
@@ -660,25 +680,28 @@
660680
},
661681
{
662682
"cell_type": "markdown",
683+
"id": "8d3658bb",
663684
"metadata": {},
664685
"source": [
665686
"## 4. Kann ich mit dem Prompt die Genauigkeit verbessern?\n",
666687
"\n",
667688
"Du hast gesehen, dass das Modell Fehler macht. Und du weisst jetzt, wie man Genauigkeit misst. Die naheliegende Frage: **hilft eine bessere Formulierung?**\n",
668689
"\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."
670693
]
671694
},
672695
{
673696
"cell_type": "code",
674-
"execution_count": 13,
697+
"execution_count": 9,
675698
"id": "e3621756",
676699
"metadata": {},
677700
"outputs": [
678701
{
679702
"data": {
680703
"application/vnd.jupyter.widget-view+json": {
681-
"model_id": "6241f8e793be4f62938c8a3b2a1d8900",
704+
"model_id": "799526d672814638b1912c1454bd62c3",
682705
"version_major": 2,
683706
"version_minor": 0
684707
},
@@ -693,13 +716,13 @@
693716
"source": [
694717
"from dspy_tasks.visualize import prompt_workshop\n",
695718
"\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",
697720
"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",
700723
" max_eval=10,\n",
701724
")\n",
702-
"display(workshop)\n"
725+
"display(workshop)"
703726
]
704727
},
705728
{
@@ -720,21 +743,24 @@
720743
},
721744
{
722745
"cell_type": "markdown",
746+
"id": "f89166e3",
723747
"metadata": {},
724748
"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"
726752
]
727753
},
728754
{
729755
"cell_type": "code",
730-
"execution_count": 14,
756+
"execution_count": 10,
731757
"id": "60eb2282",
732758
"metadata": {},
733759
"outputs": [
734760
{
735761
"data": {
736762
"application/vnd.jupyter.widget-view+json": {
737-
"model_id": "cee505a610e04bac9b8c0f8aad71dee8",
763+
"model_id": "4a61397a7e694abeb706bd8ef7e92b2f",
738764
"version_major": 2,
739765
"version_minor": 0
740766
},
@@ -748,7 +774,7 @@
748774
{
749775
"data": {
750776
"application/vnd.jupyter.widget-view+json": {
751-
"model_id": "4712573291f9469e91584213582d7f77",
777+
"model_id": "ff0b8d62fc624bb6baf52e8b6d58c440",
752778
"version_major": 2,
753779
"version_minor": 0
754780
},
@@ -762,7 +788,7 @@
762788
{
763789
"data": {
764790
"application/vnd.jupyter.widget-view+json": {
765-
"model_id": "b29b7aa9aa764eaaa89e51b5a72e6079",
791+
"model_id": "b9cc3dd5dc384c29a6aa33012e750333",
766792
"version_major": 2,
767793
"version_minor": 0
768794
},
@@ -776,7 +802,7 @@
776802
{
777803
"data": {
778804
"application/vnd.jupyter.widget-view+json": {
779-
"model_id": "36ccef29a2744a36aa04c84037358de7",
805+
"model_id": "dfa49a61a3e3441f8129517ec08eeb48",
780806
"version_major": 2,
781807
"version_minor": 0
782808
},
@@ -822,14 +848,25 @@
822848
},
823849
{
824850
"cell_type": "markdown",
851+
"id": "729de4a1",
825852
"metadata": {},
826853
"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"
828862
]
829863
},
830864
{
831865
"cell_type": "code",
866+
"execution_count": null,
867+
"id": "114c2077",
832868
"metadata": {},
869+
"outputs": [],
833870
"source": [
834871
"task = get_task(\"code_generation\")\n",
835872
"print(f\"📋 Task: {task.name}\")\n",
@@ -860,9 +897,7 @@
860897
" score = task.metric_fn(ex, prediction)\n",
861898
" print(f\" 📊 Metrik-Score: {score:.0%}\")\n",
862899
" print()\n"
863-
],
864-
"outputs": [],
865-
"execution_count": null
900+
]
866901
},
867902
{
868903
"cell_type": "markdown",

0 commit comments

Comments
 (0)