Skip to content

Commit fad59aa

Browse files
abossardCopilot
andcommitted
Restructure: Grokking Simplicity + Deep Modules to appendix, print→display
Main flow streamlined to 6 notebooks: 00 Intro → 01 Evaluation → 02 Optimization → 03 Domain → 04 Agents → 05 Finale Grokking Simplicity and Deep Modules moved to optional appendices. Replaced print() with styled display(HTML()) in standalone cells. Removed '20 Aufgaben' listing from intro. Updated all bridges, learning path diagram, and README. All 8 notebooks execute headless without errors. 11 E2E tests pass. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent a5f9387 commit fad59aa

9 files changed

Lines changed: 261 additions & 209 deletions

notebooks/00_introduction.ipynb

Lines changed: 18 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -125,18 +125,14 @@
125125
],
126126
"source": [
127127
"from dspy_tasks.visualize import diagram\n",
128-
"\n",
129-
"# Dein Lernpfad durch die 8 Notebooks\n",
130128
"diagram([\n",
131-
" {\"label\": \"Einführung\", \"detail\": \"Setup + erster Aufruf\", \"icon\": \"🚀\", \"color\": \"#0078d4\"},\n",
132-
" {\"label\": \"Trennung\", \"detail\": \"Data / Calc / Actions\", \"icon\": \"📊\", \"color\": \"#0078d4\"},\n",
133-
" {\"label\": \"Modultiefe\", \"detail\": \"Predict → CoT → ReAct\", \"icon\": \"🏛️\", \"color\": \"#0078d4\"},\n",
134-
" {\"label\": \"Evaluation\", \"detail\": \"Metriken = Software\", \"icon\": \"📐\", \"color\": \"#ca5010\"},\n",
135-
" {\"label\": \"Optimierung\", \"detail\": \"Prompts kompilieren\", \"icon\": \"⚙️\", \"color\": \"#ca5010\"},\n",
136-
" {\"label\": \"Domain-Daten\", \"detail\": \"Dein Burggraben\", \"icon\": \"🏰\", \"color\": \"#107c10\"},\n",
137-
" {\"label\": \"Agenten\", \"detail\": \"Tool-Nutzung\", \"icon\": \"🤖\", \"color\": \"#107c10\"},\n",
138-
" {\"label\": \"Gesamtbild\", \"detail\": \"Showdown + Quiz\", \"icon\": \"🎯\", \"color\": \"#107c10\"},\n",
139-
"], title=\"Dein Lernpfad\")"
129+
" {\"label\": \"00 Einführung\", \"detail\": \"Setup + erster Aufruf\", \"icon\": \"🚀\", \"color\": \"#0078d4\"},\n",
130+
" {\"label\": \"01 Evaluation\", \"detail\": \"Metriken + Accuracy\", \"icon\": \"📐\", \"color\": \"#0078d4\"},\n",
131+
" {\"label\": \"02 Optimierung\", \"detail\": \"Manuell vs. automatisch\", \"icon\": \"⚙️\", \"color\": \"#ca5010\"},\n",
132+
" {\"label\": \"03 Domain-Daten\", \"detail\": \"Dein Burggraben\", \"icon\": \"🏰\", \"color\": \"#ca5010\"},\n",
133+
" {\"label\": \"04 Agenten\", \"detail\": \"Tool-Nutzung\", \"icon\": \"🤖\", \"color\": \"#107c10\"},\n",
134+
" {\"label\": \"05 Gesamtbild\", \"detail\": \"Showdown + Quiz\", \"icon\": \"🎯\", \"color\": \"#107c10\"},\n",
135+
"], title=\"Dein Lernpfad (+ 2 optionale Appendix-Notebooks)\")"
140136
]
141137
},
142138
{
@@ -214,7 +210,8 @@
214210
"\n",
215211
"# Try it\n",
216212
"result = classifier(review=\"This laptop is absolutely fantastic! Best purchase I've made all year.\")\n",
217-
"print(f\"Sentiment: {result.sentiment}\")"
213+
"from IPython.display import display, HTML\n",
214+
"display(HTML(f'<div style=\"font-size:1.2em; padding:12px; background:#f3f2f1; border-radius:8px; margin:8px 0\">' f'<b>Sentiment:</b> <span style=\"color:#0078d4; font-weight:bold\">{result.sentiment}</span></div>'))"
218215
]
219216
},
220217
{
@@ -286,9 +283,11 @@
286283
"cell_type": "markdown",
287284
"metadata": {},
288285
"source": [
289-
"## 📋 Die 20 Aufgaben vor dir\n",
286+
"## 🗺️ Was dich erwartet\n",
287+
"\n",
288+
"Du wirst durch 8 Notebooks geführt — von den Grundlagen bis zur automatischen Optimierung. Jedes Notebook baut auf dem vorherigen auf und hat interaktive Aufgaben.\n",
290289
"\n",
291-
"Von einfacher Textklassifikation bis hin zu Agenten die Tools nutzen — jede Aufgabe hat eine klare Metrik und einen Lerneffekt."
290+
"Los geht's!"
292291
]
293292
},
294293
{
@@ -458,14 +457,7 @@
458457
}
459458
],
460459
"source": [
461-
"for tier in range(1, 5):\n",
462-
" tasks = [t for t in task_summary() if t[\"tier\"] == tier]\n",
463-
" tier_names = {1: \"Fundamentals\", 2: \"Reasoning\", 3: \"Composition\", 4: \"Agentic\"}\n",
464-
" display_tier_header(tier, tier_names[tier], f\"{len(tasks)} tasks\")\n",
465-
" for t in tasks:\n",
466-
" print(f\" {'★' * tier}{'☆' * (4-tier)} {t['name']} ({t['module_type']})\")\n",
467-
" print(f\" {t['description']}\")\n",
468-
" print()"
460+
"# Die Aufgaben entdeckst du Schritt für Schritt in den folgenden Notebooks."
469461
]
470462
},
471463
{
@@ -476,7 +468,7 @@
476468
"\n",
477469
"Du kannst ein Modell aufrufen und bekommst ein Ergebnis. **Aber woher weisst du, ob es GUT ist?**\n",
478470
"\n",
479-
"Das klären wir im nächsten Notebook: Wie man LLM-Aufgaben sauber in **Data**, **Calculations** und **Actions** aufteilt — nach dem Prinzip von *Grokking Simplicity*."
471+
"Das klären wir im nächsten Notebook: Wie man **Accuracy misst**, wo LLMs versagen, und wie du **selbst versuchst den Prompt zu verbessern**."
480472
]
481473
},
482474
{
@@ -519,9 +511,9 @@
519511
],
520512
"metadata": {
521513
"kernelspec": {
522-
"display_name": "Python 3 (ipykernel)",
514+
"display_name": "Python (notebooks/.venv)",
523515
"language": "python",
524-
"name": "python3"
516+
"name": "python-quart-vite-react-notebooks"
525517
},
526518
"language_info": {
527519
"codemirror_mode": {
@@ -538,4 +530,4 @@
538530
},
539531
"nbformat": 4,
540532
"nbformat_minor": 4
541-
}
533+
}

notebooks/03_evaluation_as_specification.ipynb renamed to notebooks/01_evaluation.ipynb

Lines changed: 33 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -77,20 +77,29 @@
7777
"outputs": [],
7878
"source": [
7979
"# Level 1: Binary exact match (simplest)\n",
80-
"print(\"Level 1: Exact Match\")\n",
81-
"print(f\" 'positive' == 'positive' → {1.0}\")\n",
82-
"print(f\" 'positive' == 'POSITIVE' → {1.0} (normalized)\")\n",
83-
"print(f\" 'positive' == 'negative' → {0.0}\")\n",
84-
"\n",
85-
"# Level 2: Token F1 (partial credit)\n",
80+
"from IPython.display import display, HTML\n",
8681
"from dspy_tasks.calculations import token_f1\n",
87-
"print(f\"\\nLevel 2: Token F1\")\n",
88-
"print(f\" gold=['apple','banana'], pred=['apple','cherry'] → {token_f1(['apple','banana'], ['apple','cherry']):.3f}\")\n",
8982
"\n",
90-
"# Level 3: Composite weighted\n",
91-
"print(f\"\\nLevel 3: Composite (ticket routing)\")\n",
92-
"print(\" Priority correct (40%) + Category correct (35%) + Team correct (25%)\")\n",
93-
"print(\" = Weighted specification of 'what matters most'\")\n",
83+
"f1_val = token_f1(['apple','banana'], ['apple','cherry'])\n",
84+
"\n",
85+
"display(HTML(\n",
86+
" '<div style=\"margin:8px 0\">'\n",
87+
" '<div style=\"padding:12px; background:#f3f2f1; border-radius:8px; margin-bottom:8px; border-left:4px solid #107c10\">'\n",
88+
" '<b style=\"font-size:1.05em\">Level 1: Exact Match</b>'\n",
89+
" '<div style=\"margin-top:6px; font-family:monospace; font-size:0.95em\">'\n",
90+
" ' 'positive' == 'positive' → <span style=\"color:#107c10; font-weight:bold\">1.0</span><br>'\n",
91+
" ' 'positive' == 'POSITIVE' → <span style=\"color:#107c10; font-weight:bold\">1.0</span> <span style=\"color:#605e5c\">(normalized)</span><br>'\n",
92+
" ' 'positive' == 'negative' → <span style=\"color:#d13438; font-weight:bold\">0.0</span></div></div>'\n",
93+
" '<div style=\"padding:12px; background:#f3f2f1; border-radius:8px; margin-bottom:8px; border-left:4px solid #0078d4\">'\n",
94+
" '<b style=\"font-size:1.05em\">Level 2: Token F1</b>'\n",
95+
" f'<div style=\"margin-top:6px; font-family:monospace; font-size:0.95em\">'\n",
96+
" f' gold=['apple','banana'], pred=['apple','cherry'] → <span style=\"color:#0078d4; font-weight:bold\">{f1_val:.3f}</span></div></div>'\n",
97+
" '<div style=\"padding:12px; background:#f3f2f1; border-radius:8px; border-left:4px solid #8764b8\">'\n",
98+
" '<b style=\"font-size:1.05em\">Level 3: Composite (ticket routing)</b>'\n",
99+
" '<div style=\"margin-top:6px; font-size:0.95em\">'\n",
100+
" ' Priority correct (<b>40%</b>) + Category correct (<b>35%</b>) + Team correct (<b>25%</b>)<br>'\n",
101+
" ' = Weighted specification of \"what matters most\"</div></div></div>'\n",
102+
"))\n",
94103
"\n",
95104
"display_insight(\"Der Kern-Insight\",\n",
96105
" \"Deine Metrik-Funktion IST deine Produkt-Spezifikation. \"\n",
@@ -105,11 +114,16 @@
105114
"outputs": [],
106115
"source": [
107116
"from dspy_tasks.config import configure_dspy\n",
117+
"from IPython.display import display, HTML\n",
108118
"# Code Generation task — different metric than simple matching\n",
109119
"task = get_task(\"code_generation\")\n",
110-
"print(f\"Task: {task.name}\")\n",
111-
"print(f\"Metric: code_execution_proxy (checks structure, keywords, overlap)\")\n",
112-
"print(f\"Teaching point: {task.teaching_point}\\n\")\n",
120+
"display(HTML(\n",
121+
" f'<div style=\"padding:12px; background:#f3f2f1; border-radius:8px; margin:8px 0\">'\n",
122+
" f'<div style=\"font-size:1.1em\"><b>Task:</b> {task.name}</div>'\n",
123+
" f'<div style=\"margin-top:4px\"><b>Metric:</b> <code>code_execution_proxy</code> '\n",
124+
" f'<span style=\"color:#605e5c\">(checks structure, keywords, overlap)</span></div>'\n",
125+
" f'<div style=\"margin-top:4px\"><b>Teaching point:</b> {task.teaching_point}</div></div>'\n",
126+
"))\n",
113127
"\n",
114128
"btn = run_button(\"Evaluate Code Generation\")\n",
115129
"out = widgets.Output()\n",
@@ -275,17 +289,17 @@
275289
"source": [
276290
"## ⏭️ Weiter geht's!\n",
277291
"\n",
278-
"Du hast Metriken. Du kannst messen. Aber was, wenn der **Computer die Prompts SELBST optimieren** könnte?\n",
292+
"Du hast Metriken. Du kannst messen. Aber was, wenn der **Computer die Prompts SELBST optimieren** könnte? \n",
279293
"\n",
280-
"Stell dir vor: du schreibst die Spezifikation (Signatur + Metrik), und ein Optimizer findet den besten Prompt dafür. Genau wie ein Compiler! Das ist das nächste Notebook."
294+
"Stell dir vor: du schreibst die Spezifikation (was du willst + was \"gut\" heisst), und das Werkzeug findet den besten Prompt dafür. Genau wie ein Compiler! Das ist Notebook 02."
281295
]
282296
}
283297
],
284298
"metadata": {
285299
"kernelspec": {
286-
"display_name": "Python 3 (ipykernel)",
300+
"display_name": "Python (notebooks/.venv)",
287301
"language": "python",
288-
"name": "python3"
302+
"name": "python-quart-vite-react-notebooks"
289303
},
290304
"language_info": {
291305
"codemirror_mode": {

notebooks/04_the_optimizer_is_your_compiler.ipynb renamed to notebooks/02_optimization.ipynb

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -229,11 +229,9 @@
229229
"source": [
230230
"## ⏭️ Weiter geht's!\n",
231231
"\n",
232-
"BOOM — der Optimizer hat den Prompt verbessert. Automatisch, messbar, reproduzierbar. Und schau dir an, was sich geändert hat — der Prompt-Diff zeigt genau, was passiert ist.\n",
232+
"Der Optimizer hat den Prompt verbessert — automatisch, messbar, reproduzierbar. Aber was passiert, wenn du **deine eigenen, echten Daten** benutzt?\n",
233233
"\n",
234-
"Aber was passiert, wenn du **deine eigenen, echten Daten** benutzt?\n",
235-
"\n",
236-
"Im nächsten Notebook nehmen wir die echten Ticket-Daten und zeigen: **Deine Daten sind dein Burggraben.** Das Modell ist gemietet — deine Daten gehören dir. Tuning macht den Unterschied, den kein Konkurrent kopieren kann."
234+
"Im nächsten Notebook nehmen wir die echten Ticket-Daten aus dem Projekt und zeigen: **Deine Daten sind dein Burggraben.** Ein generisches Modell + deine Domain-Daten + Tuning = etwas, das kein Konkurrent kopieren kann."
237235
]
238236
}
239237
],
Lines changed: 23 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -26,15 +26,18 @@
2626
"source": [
2727
"import sys; sys.path.insert(0, \".\")\n",
2828
"import dspy, pandas as pd, ipywidgets as widgets\n",
29-
"from IPython.display import display\n",
29+
"from IPython.display import display, HTML\n",
3030
"from dspy_tasks.tasks import get_task\n",
3131
"from dspy_tasks.actions import run_baseline, run_optimization, compare_models\n",
3232
"from dspy_tasks.visualize import *\n",
3333
"\n",
3434
"# Show the real ticket data\n",
3535
"df = pd.read_csv(\"../csv/data.csv\", encoding=\"latin-1\")\n",
36-
"print(f\"📊 Real ticket data: {len(df)} tickets\")\n",
37-
"print(f\"Columns: {', '.join(df.columns[:10])}...\")\n",
36+
"display(HTML(\n",
37+
" f'<div style=\"font-size:1.1em; padding:12px; background:#f3f2f1; border-radius:8px; margin:8px 0\">'\n",
38+
" f'<b>📊 Real ticket data:</b> <span style=\"color:#0078d4; font-weight:bold\">{len(df)}</span> tickets<br>'\n",
39+
" f'<span style=\"color:#605e5c; font-size:0.9em\">Columns: {\", \".join(df.columns[:10])}...</span></div>'\n",
40+
"))\n",
3841
"df[[\"Summary*\", \"Priority*\", \"Status*\", \"Assigned Group*+\"]].head(5)"
3942
]
4043
},
@@ -46,10 +49,22 @@
4649
"source": [
4750
"task = get_task(\"ticket_routing\")\n",
4851
"examples = task.load_examples()\n",
49-
"print(f\"Training data: {len(examples)} ticket examples\\n\")\n",
52+
"from IPython.display import display, HTML\n",
53+
"\n",
54+
"rows = \"\"\n",
5055
"for ex in examples[:3]:\n",
51-
" print(f\" Summary: {str(ex.summary)[:80]}...\")\n",
52-
" print(f\" → Category: {ex.category} | Priority: {ex.priority} | Team: {ex.assigned_group}\\n\")"
56+
" rows += (\n",
57+
" f'<div style=\"padding:8px 0; border-bottom:1px solid #edebe9\">'\n",
58+
" f'<div style=\"color:#605e5c; font-size:0.9em\">{str(ex.summary)[:80]}...</div>'\n",
59+
" f'<div style=\"margin-top:4px\">→ <b>Category:</b> {ex.category} | '\n",
60+
" f'<b>Priority:</b> {ex.priority} | <b>Team:</b> {ex.assigned_group}</div></div>'\n",
61+
" )\n",
62+
"display(HTML(\n",
63+
" f'<div style=\"margin:8px 0\">'\n",
64+
" f'<div style=\"font-size:1.1em; padding-bottom:8px\"><b>Training data:</b> '\n",
65+
" f'<span style=\"color:#0078d4; font-weight:bold\">{len(examples)}</span> ticket examples</div>'\n",
66+
" f'{rows}</div>'\n",
67+
"))"
5368
]
5469
},
5570
{
@@ -178,11 +193,9 @@
178193
"source": [
179194
"## ⏭️ Weiter geht's!\n",
180195
"\n",
181-
"**Das Modell ist gemietet. Die Daten gehören dir. Das Tuning ist dein Engineering.**\n",
182-
"\n",
183-
"Deine Daten + automatisches Tuning = ein Burggraben, den kein Konkurrent kopieren kann. Und das Beste: ein getuntes kleines Modell schlägt oft ein ungetuntes grosses — und kostet 10x weniger.\n",
196+
"Deine Daten + systematisches Tuning = dein Burggraben. Das Modell ist gemietet, deine Daten gehören dir. Das Tuning macht den Unterschied den kein Konkurrent kopieren kann.\n",
184197
"\n",
185-
"Aber können auch **Agenten** optimiert werden? Agenten, die Tools nutzen und Entscheidungen treffen? Das ist Notebook 06!"
198+
"Aber können auch **Agenten** optimiert werden? Agenten, die Tools nutzen und Entscheidungen treffen? Das ist Notebook 04!"
186199
]
187200
}
188201
],
Lines changed: 34 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -21,15 +21,20 @@
2121
"source": [
2222
"import sys; sys.path.insert(0, \".\")\n",
2323
"import dspy, ipywidgets as widgets\n",
24-
"from IPython.display import display\n",
24+
"from IPython.display import display, HTML\n",
2525
"from dspy_tasks.tasks import get_task, list_by_tier\n",
2626
"from dspy_tasks.tools import TOOL_REGISTRY, calculate, search_tickets, get_ticket_stats\n",
2727
"from dspy_tasks.actions import run_baseline, run_optimization\n",
2828
"from dspy_tasks.visualize import diagram, diagram_compare, display_score, display_results_table, display_improvement, display_prompt_diff, display_insight, model_picker, run_button, optimizer_picker\n",
2929
"\n",
30-
"print(\"🔧 Available Tools:\")\n",
30+
"rows = \"\"\n",
3131
"for name, fn in TOOL_REGISTRY.items():\n",
32-
" print(f\" • {name}: {fn.__doc__.strip().split(chr(10))[0]}\")"
32+
" doc = fn.__doc__.strip().split(chr(10))[0] if fn.__doc__ else \"\"\n",
33+
" rows += f'<tr><td style=\"padding:6px 12px; border-bottom:1px solid #edebe9; font-family:monospace; color:#0078d4; font-weight:bold\">{name}</td>' f'<td style=\"padding:6px 12px; border-bottom:1px solid #edebe9; color:#323130\">{doc}</td></tr>'\n",
34+
"display(HTML(\n",
35+
" f'<div style=\"margin:8px 0\"><div style=\"font-size:1.15em; font-weight:bold; padding-bottom:8px\">🔧 Available Tools:</div>'\n",
36+
" f'<table style=\"border-collapse:collapse; width:100%\">{rows}</table></div>'\n",
37+
"))"
3338
]
3439
},
3540
{
@@ -62,13 +67,24 @@
6267
"outputs": [],
6368
"source": [
6469
"# Tools are just Python functions — try them!\n",
65-
"print(\"calculate('(45 * 3) + 17'):\", calculate(\"(45 * 3) + 17\"))\n",
66-
"print()\n",
67-
"print(\"search_tickets('network'):\")\n",
68-
"print(search_tickets(\"network\"))\n",
69-
"print()\n",
70-
"print(\"get_ticket_stats('priority'):\")\n",
71-
"print(get_ticket_stats(\"priority\"))"
70+
"from IPython.display import display, HTML\n",
71+
"\n",
72+
"calc_result = calculate(\"(45 * 3) + 17\")\n",
73+
"search_result = search_tickets(\"network\")\n",
74+
"stats_result = get_ticket_stats(\"priority\")\n",
75+
"\n",
76+
"display(HTML(\n",
77+
" '<div style=\"margin:8px 0\">'\n",
78+
" '<div style=\"padding:12px; background:#f3f2f1; border-radius:8px; margin-bottom:8px; border-left:4px solid #0078d4\">'\n",
79+
" f'<div style=\"font-weight:bold; font-family:monospace\">calculate('(45 * 3) + 17')</div>'\n",
80+
" f'<div style=\"margin-top:4px; color:#323130\">{calc_result}</div></div>'\n",
81+
" '<div style=\"padding:12px; background:#f3f2f1; border-radius:8px; margin-bottom:8px; border-left:4px solid #107c10\">'\n",
82+
" f'<div style=\"font-weight:bold; font-family:monospace\">search_tickets('network')</div>'\n",
83+
" f'<pre style=\"margin-top:4px; color:#323130; white-space:pre-wrap; font-size:0.85em\">{search_result}</pre></div>'\n",
84+
" '<div style=\"padding:12px; background:#f3f2f1; border-radius:8px; border-left:4px solid #8764b8\">'\n",
85+
" f'<div style=\"font-weight:bold; font-family:monospace\">get_ticket_stats('priority')</div>'\n",
86+
" f'<pre style=\"margin-top:4px; color:#323130; white-space:pre-wrap; font-size:0.85em\">{stats_result}</pre></div></div>'\n",
87+
"))"
7288
]
7389
},
7490
{
@@ -190,22 +206,20 @@
190206
"\n",
191207
"Agenten können Tools nutzen UND ihr Verhalten kann optimiert werden. Du hast jetzt alle Bausteine gesehen:\n",
192208
"\n",
193-
"1. ✅ DATA, CALCULATIONS, ACTIONS trennen\n",
194-
"2. ✅ Module mit verschiedener Tiefe\n",
195-
"3. ✅ Metriken als Spezifikation\n",
196-
"4. ✅ Optimizer als Compiler\n",
197-
"5. ✅ Domain-Daten als Burggraben\n",
198-
"6. ✅ Agentic Optimization\n",
209+
"1. ✅ Metriken und Evaluation\n",
210+
"2. ✅ Automatische Prompt-Optimierung\n",
211+
"3. ✅ Domain-Daten als Wettbewerbsvorteil\n",
212+
"4. ✅ Agenten-Optimierung\n",
199213
"\n",
200-
"**Zeit für das Gesamtbild und das Quiz!** → Notebook 07"
214+
"**Zeit für das Gesamtbild und das Quiz!** → Notebook 05"
201215
]
202216
}
203217
],
204218
"metadata": {
205219
"kernelspec": {
206-
"display_name": "Python 3 (ipykernel)",
220+
"display_name": "Python (notebooks/.venv)",
207221
"language": "python",
208-
"name": "python3"
222+
"name": "python-quart-vite-react-notebooks"
209223
},
210224
"language_info": {
211225
"codemirror_mode": {
@@ -222,4 +236,4 @@
222236
},
223237
"nbformat": 4,
224238
"nbformat_minor": 4
225-
}
239+
}
Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -325,9 +325,14 @@
325325
"\n",
326326
"1. **Eigene Daten** — Bring deine eigenen Datasets mit und optimiere darauf\n",
327327
"2. **Neue Tasks** — Erweitere die `dspy_tasks/tasks/` mit eigenen Aufgaben\n",
328-
"3. **Andere Modelle** — Probier lokale Modelle via Ollama aus\n",
328+
"3. **Andere Modelle** — Probier verschiedene Modelle aus und vergleiche\n",
329329
"4. **Produktion** — Speichere optimierte Module und deploye sie\n",
330330
"\n",
331+
"### 📚 Optionale Appendix-Notebooks\n",
332+
"\n",
333+
"- **Appendix A: Grokking Simplicity** — Wie man LLM-Code in Data, Calculations und Actions aufteilt\n",
334+
"- **Appendix B: Deep Modules** — Warum `Predict`, `ChainOfThought` und `ReAct` das gleiche Interface haben\n",
335+
"\n",
331336
"*Evaluation ist die Spezifikation. Optimierung ist der Compiler. Daten sind der Quellcode.* 🚀"
332337
]
333338
}
@@ -353,4 +358,4 @@
353358
},
354359
"nbformat": 4,
355360
"nbformat_minor": 4
356-
}
361+
}

0 commit comments

Comments
 (0)