From 67db5b13f1f947633a1b38167242ee9270af8497 Mon Sep 17 00:00:00 2001 From: "Ashwin V. Mohanan" Date: Wed, 30 Sep 2026 08:28:32 +0200 Subject: [PATCH 01/10] Remove TODO, see #29 --- content/index.md | 1 - 1 file changed, 1 deletion(-) diff --git a/content/index.md b/content/index.md index 30d34f1..316f9a4 100644 --- a/content/index.md +++ b/content/index.md @@ -122,7 +122,6 @@ simply teaching you how to use these tools, we help you understand: ## See also - [OpenSSF Security Guide for AI Code Assistants](https://best.openssf.org/Security-Focused-Guide-for-AI-Code-Assistant-Instructions) -- TODO Add more references here ## Credits From 107fefaaeacb1c93f100d402c7a3191b1cbf1f9c Mon Sep 17 00:00:00 2001 From: "Ashwin V. Mohanan" Date: Wed, 30 Sep 2026 08:47:58 +0200 Subject: [PATCH 02/10] Add stochastic parrot quote and format using attrs --- content/conf.py | 2 ++ content/introduction.md | 28 +++++++++++++++------------- 2 files changed, 17 insertions(+), 13 deletions(-) diff --git a/content/conf.py b/content/conf.py index 38e344f..150ee57 100644 --- a/content/conf.py +++ b/content/conf.py @@ -50,6 +50,8 @@ # https://myst-parser.readthedocs.io/en/latest/syntax/optional.html myst_enable_extensions = [ "colon_fence", + "attrs_inline", + "attrs_block" ] # Settings for sphinx-copybutton diff --git a/content/introduction.md b/content/introduction.md index 25c0b48..22a4740 100644 --- a/content/introduction.md +++ b/content/introduction.md @@ -38,33 +38,35 @@ excel at common patterns but can confidently produce incorrect code for novel or complex problems. **Always verify AI-generated code**. ::: -:::{admonition} Richard Stallman's view on "AI" +:::{admonition} Stochastic parrots :class: tip -"So I've come up with the term Pretend Intelligence. We could call it PI. And if we start saying this more often, we might help overcome this marketing hype campaign that wants people to trust those systems, and trust their lives and all their activities to the control of those systems and the big companies that develop and control them." +{attribution="Emily M. Bender and Timnit Gebru"} +> LM \[Language Model\] is a system for haphazardly stitching together sequences of linguistic forms it has observed in its vast training data, according to probabilistic information about how they combine, but without any reference to meaning: a stochastic parrot. -- [Dr. Richard Stallman cited in Slashdot](https://news.slashdot.org/story/26/01/25/1930244/richard-stallman-critiques-ai-connected-cars-smartphones-and-drm) +Source: ::: :::{admonition} Practitioner's perspective: Simon Willison :class: tip -*"My current favorite mental model is to think of them as an over-confident +{attribution="Simon Willison"} +> My current favorite mental model is to think of them as an over-confident pair programming assistant who's lightning fast at looking things up, can churn out relevant examples at a moment's notice and can execute on tedious -tasks without complaint.* - -*Over-confident is important. They'll absolutely make mistakes—sometimes -subtle, sometimes huge. These mistakes can be deeply inhuman—if a human +tasks without complaint. +> +> **Over-confident** is important. They'll absolutely make mistakes --- sometimes +subtle, sometimes huge. These mistakes can be deeply inhuman --- if a human collaborator hallucinated a non-existent library or method you would -instantly lose trust in them.* - -*Don't fall into the trap of anthropomorphizing LLMs and assuming that +instantly lose trust in them. +> +> **Don't fall into the trap of anthropomorphizing LLMs and assuming that failures which would discredit a human should discredit the machine in the -same way."* +same way.**" -— [Simon Willison, "How I use LLMs to help me write code"](https://simonwillison.net/2025/Mar/11/using-llms-for-code/) +Source: ["How I use LLMs to help me write code"](https://simonwillison.net/2025/Mar/11/using-llms-for-code/) ::: From c85e9c13ed55066b0b0fb3e6f1f45fc9cdcc1bbd Mon Sep 17 00:00:00 2001 From: "Ashwin V. Mohanan" Date: Wed, 30 Sep 2026 08:53:30 +0200 Subject: [PATCH 03/10] Rm dummy rst files --- content/guide.rst-if-wanted | 37 ----------------- content/index.rst-if-wanted | 60 --------------------------- content/quick-reference.rst-if-wanted | 2 - 3 files changed, 99 deletions(-) delete mode 100644 content/guide.rst-if-wanted delete mode 100644 content/index.rst-if-wanted delete mode 100644 content/quick-reference.rst-if-wanted diff --git a/content/guide.rst-if-wanted b/content/guide.rst-if-wanted deleted file mode 100644 index 89553fb..0000000 --- a/content/guide.rst-if-wanted +++ /dev/null @@ -1,37 +0,0 @@ -Instructor's guide -================== - -Why we teach this lesson ------------------------- - - - -Intended learning outcomes --------------------------- - - - -Timing ------- - - - -Preparing exercises -------------------- - -e.g. what to do the day before to set up common repositories. - - - -Other practical aspects ------------------------ - - - -Interesting questions you might get ------------------------------------ - - - -Typical pitfalls ----------------- diff --git a/content/index.rst-if-wanted b/content/index.rst-if-wanted deleted file mode 100644 index f981650..0000000 --- a/content/index.rst-if-wanted +++ /dev/null @@ -1,60 +0,0 @@ -LESSON NAME -=========== - -Intro - - - -.. prereq:: - - prerequisites - - - -.. csv-table:: - :widths: auto - :delim: ; - - 20 min ; :doc:`filename` - - -.. toctree:: - :maxdepth: 1 - :caption: The lesson - - -.. toctree:: - :maxdepth: 1 - :caption: Reference - - quick-reference - guide - - - -.. _learner-personas: - -Who is the course for? ----------------------- - - - - - -About the course ----------------- - - - - - - -See also --------- - - - - - -Credits -------- diff --git a/content/quick-reference.rst-if-wanted b/content/quick-reference.rst-if-wanted deleted file mode 100644 index 492da1e..0000000 --- a/content/quick-reference.rst-if-wanted +++ /dev/null @@ -1,2 +0,0 @@ -Quick Reference -=============== From 41ba0f03b2671d3883a5a08e80c71ec4c03289ab Mon Sep 17 00:00:00 2001 From: "Ashwin V. Mohanan" Date: Wed, 30 Sep 2026 09:01:33 +0200 Subject: [PATCH 04/10] Add a note on size of training data --- content/introduction.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/content/introduction.md b/content/introduction.md index 22a4740..a610843 100644 --- a/content/introduction.md +++ b/content/introduction.md @@ -92,6 +92,12 @@ During pre-training, the model learns: - Relationships between code and comments/documentation - How different parts of a codebase relate to each other +The size of typical datasets also implies that to train a model from the scratch +is a heavy commitment. It is expensive, both in terms of time (person-hours) and +compute. Which in turn means that very few actors do this and most users rely on +such pre-trained "frontier" models for their specific use cases, such as +coding. + ### 2. Fine-tuning and instruction tuning After pre-training, models are often further refined: From 6a996202134b4a82f14e3a209afe27b5fea508c4 Mon Sep 17 00:00:00 2001 From: "Ashwin V. Mohanan" Date: Wed, 30 Sep 2026 10:22:38 +0200 Subject: [PATCH 05/10] A more precise mental model for an LLM --- content/img/llm_blocks.excalidraw | 744 ++++++++++++++++++++++++++++++ content/img/llm_blocks.png | Bin 0 -> 60129 bytes content/img/llm_blocks.svg | 4 + 3 files changed, 748 insertions(+) create mode 100644 content/img/llm_blocks.excalidraw create mode 100644 content/img/llm_blocks.png create mode 100644 content/img/llm_blocks.svg diff --git a/content/img/llm_blocks.excalidraw b/content/img/llm_blocks.excalidraw new file mode 100644 index 0000000..83e4acf --- /dev/null +++ b/content/img/llm_blocks.excalidraw @@ -0,0 +1,744 @@ +{ + "type": "excalidraw", + "version": 2, + "source": "https://excalidraw.com", + "elements": [ + { + "id": "W5JJ4pzMDaNO-Nyjh1os-", + "type": "line", + "x": 1085, + "y": 333.75, + "width": 271.25, + "height": 381.25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b2s", + "roundness": { + "type": 2 + }, + "seed": 1691872828, + "version": 42, + "versionNonce": 1970605615, + "isDeleted": true, + "boundElements": [], + "updated": 1789064543146, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -271.25, + 381.25 + ] + ], + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null, + "polygon": false, + "created": null + }, + { + "id": "v93xHqgu3Qb6Mk0il3CUp", + "type": "line", + "x": 812.5, + "y": 718.75, + "width": 526.25, + "height": 1.25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b2t", + "roundness": { + "type": 2 + }, + "seed": 538243076, + "version": 32, + "versionNonce": 315453505, + "isDeleted": true, + "boundElements": [], + "updated": 1789064543146, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 526.25, + 1.25 + ] + ], + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null, + "polygon": false, + "created": null + }, + { + "id": "qVRv1aYw_02xFGbAjkDoc", + "type": "line", + "x": 1337.5, + "y": 720, + "width": 256.25, + "height": 391.25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b2u", + "roundness": { + "type": 2 + }, + "seed": 1643358396, + "version": 55, + "versionNonce": 1597075535, + "isDeleted": true, + "boundElements": [], + "updated": 1789064543146, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -256.25, + -391.25 + ] + ], + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null, + "polygon": false, + "created": null + }, + { + "id": "e-LPdi8xJ3pEmwwbI5zqx", + "type": "text", + "x": 1002.7503997525362, + "y": 292.020800020622, + "width": 158.27999877929688, + "height": 25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b2w", + "roundness": null, + "seed": 1614611460, + "version": 71, + "versionNonce": 2065154081, + "isDeleted": true, + "boundElements": [], + "updated": 1789064543146, + "link": null, + "locked": false, + "text": "Lack of tracking", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Lack of tracking", + "autoResize": true, + "lineHeight": 1.25, + "labelPosition": null, + "created": null, + "baseFontSize": null + }, + { + "id": "4vW5pXxaYxr9qKQ9QFUt5", + "type": "text", + "x": 744.0970667629026, + "y": 724.416799917512, + "width": 46.47999954223633, + "height": 25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b2x", + "roundness": null, + "seed": 1366572604, + "version": 42, + "versionNonce": 861703791, + "isDeleted": true, + "boundElements": [], + "updated": 1789064543146, + "link": null, + "locked": false, + "text": "Cost", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Cost", + "autoResize": true, + "lineHeight": 1.25, + "labelPosition": null, + "created": null, + "baseFontSize": null + }, + { + "id": "NtBAuvidyDsAVnN6vGkx9", + "type": "text", + "x": 1347.9861333195854, + "y": 729.375199876268, + "width": 93.36000061035156, + "height": 25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b2y", + "roundness": null, + "seed": 2058620804, + "version": 37, + "versionNonce": 692917249, + "isDeleted": true, + "boundElements": [], + "updated": 1789064543146, + "link": null, + "locked": false, + "text": "Capability", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Capability", + "autoResize": true, + "lineHeight": 1.25, + "labelPosition": null, + "created": null, + "baseFontSize": null + }, + { + "id": "VBpKoAlJjXNnz_l1RvMzK", + "type": "text", + "x": 810.3139990720102, + "y": 496.2087997112922, + "width": 127.94666290283203, + "height": 29.027733360829263, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b30", + "roundness": null, + "seed": 1154447676, + "version": 167, + "versionNonce": 750708879, + "isDeleted": true, + "boundElements": [], + "updated": 1789064543146, + "link": null, + "locked": false, + "text": "llm-gateway", + "fontSize": 23.22218668866341, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "llm-gateway", + "autoResize": true, + "lineHeight": 1.25, + "labelPosition": null, + "created": null, + "baseFontSize": null + }, + { + "id": "m5L52WkQWGwz8Fufr2G5E", + "type": "text", + "x": 1220.1569623600049, + "y": 496.2781331133657, + "width": 43.33333206176758, + "height": 26.80546672165854, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b32", + "roundness": null, + "seed": 536877956, + "version": 214, + "versionNonce": 829221857, + "isDeleted": true, + "boundElements": [], + "updated": 1789064543146, + "link": null, + "locked": false, + "text": "ITS", + "fontSize": 21.444373377326833, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "ITS", + "autoResize": true, + "lineHeight": 1.25, + "labelPosition": null, + "created": null, + "baseFontSize": null + }, + { + "id": "GMokk_87ZLcq0v5zQ6gxj", + "type": "text", + "x": 979.6128522554902, + "y": 731.2919044463467, + "width": 207.82666015625, + "height": 28.020800020622126, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b33", + "roundness": null, + "seed": 547594628, + "version": 89, + "versionNonce": 420544175, + "isDeleted": true, + "boundElements": [], + "updated": 1789064543146, + "link": null, + "locked": false, + "text": "AI experimentation", + "fontSize": 22.416640016497702, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "AI experimentation", + "autoResize": true, + "lineHeight": 1.25, + "labelPosition": null, + "created": null, + "baseFontSize": null + }, + { + "id": "fEeJe5fBV97kr2nvVtgWn", + "type": "rectangle", + "x": 586.25, + "y": 342.5, + "width": 93.75, + "height": 396.25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b34", + "roundness": { + "type": 3 + }, + "seed": 1102718881, + "version": 105, + "versionNonce": 112163407, + "isDeleted": false, + "boundElements": null, + "updated": 1789064552081, + "created": 1789064548585, + "link": null, + "locked": false + }, + { + "id": "PjPpNkkCpJ0heQXw9Olh3", + "type": "text", + "x": 442.25, + "y": 455.5, + "width": 127.97333526611328, + "height": 25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b35", + "roundness": null, + "seed": 1237254625, + "version": 60, + "versionNonce": 193320271, + "isDeleted": false, + "boundElements": null, + "updated": 1789064667761, + "created": 1789064559812, + "link": null, + "locked": false, + "text": "Input tokens", + "fontSize": 20, + "baseFontSize": null, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Input tokens", + "autoResize": true, + "lineHeight": 1.25, + "labelPosition": null + }, + { + "id": "P6zvJ3iPKR-cfsdI9yaQS", + "type": "rectangle", + "x": 593.75, + "y": 350, + "width": 78.75, + "height": 276.25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#b2f2bb", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b36", + "roundness": { + "type": 3 + }, + "seed": 1858335887, + "version": 63, + "versionNonce": 109792641, + "isDeleted": false, + "boundElements": null, + "updated": 1789064654915, + "created": 1789064565093, + "link": null, + "locked": false + }, + { + "id": "jS7n0RYG5zRFtkLXmZgHX", + "type": "rectangle", + "x": 1121.2633323669434, + "y": 341.625, + "width": 93.75, + "height": 396.25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b37", + "roundness": { + "type": 3 + }, + "seed": 36731535, + "version": 418, + "versionNonce": 823790593, + "isDeleted": false, + "boundElements": [], + "updated": 1789064585028, + "created": 1789064571394, + "link": null, + "locked": false + }, + { + "id": "t0JbQR-IC4JcJ2NSJ3aYg", + "type": "text", + "x": 1227.2633323669434, + "y": 639.625, + "width": 143.9066619873047, + "height": 25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b38", + "roundness": null, + "seed": 780161199, + "version": 397, + "versionNonce": 1772776929, + "isDeleted": false, + "boundElements": [], + "updated": 1789064651561, + "created": 1789064571394, + "link": null, + "locked": false, + "text": "Output tokens", + "fontSize": 20, + "baseFontSize": null, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Output tokens", + "autoResize": true, + "lineHeight": 1.25, + "labelPosition": null + }, + { + "id": "2xqlwmwARE2wsQ1HA7PuG", + "type": "rectangle", + "x": 1127.5133323669434, + "y": 349.125, + "width": 78.75, + "height": 276.25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#b2f2bb", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b39", + "roundness": { + "type": 3 + }, + "seed": 179331791, + "version": 375, + "versionNonce": 2124718401, + "isDeleted": false, + "boundElements": [], + "updated": 1789064659044, + "created": 1789064571394, + "link": null, + "locked": false + }, + { + "id": "BJ4_mrIziqNWYtMyk7ULp", + "type": "rectangle", + "x": 714.3749999999998, + "y": 341.625, + "width": 372.5000000000001, + "height": 396.25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b3A", + "roundness": { + "type": 3 + }, + "seed": 32208751, + "version": 485, + "versionNonce": 1302594177, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "sgQFDPiU25poqHRh3uUYv" + } + ], + "updated": 1789064608760, + "created": 1789064589606, + "link": null, + "locked": false + }, + { + "id": "sgQFDPiU25poqHRh3uUYv", + "type": "text", + "x": 873.2983341217039, + "y": 527.25, + "width": 54.6533317565918, + "height": 25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b3AV", + "roundness": null, + "seed": 1201338351, + "version": 7, + "versionNonce": 1416432335, + "isDeleted": false, + "boundElements": null, + "updated": 1789064609711, + "created": 1789064608760, + "link": null, + "locked": false, + "text": "Model", + "fontSize": 20, + "baseFontSize": null, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "BJ4_mrIziqNWYtMyk7ULp", + "originalText": "Model", + "autoResize": true, + "lineHeight": 1.25, + "labelPosition": null + }, + { + "id": "PD7JMc86COi9laI_JHx-k", + "type": "text", + "x": 790, + "y": 503.5, + "width": 8, + "height": 25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b3B", + "roundness": null, + "seed": 1006217551, + "version": 3, + "versionNonce": 2002191073, + "isDeleted": true, + "boundElements": null, + "updated": 1789064606517, + "created": 1789064605914, + "link": null, + "locked": false, + "text": "", + "fontSize": 20, + "baseFontSize": null, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "", + "autoResize": true, + "lineHeight": 1.25, + "labelPosition": null + }, + { + "id": "Sms9BHY2H2LUP2G8uceyx", + "type": "rectangle", + "x": 1127.513332, + "y": 634.375, + "width": 78.75, + "height": 25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#ffc9c9", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b3C", + "roundness": { + "type": 3 + }, + "seed": 2141762849, + "version": 549, + "versionNonce": 1361644911, + "isDeleted": false, + "boundElements": [], + "updated": 1789064661688, + "created": 1789064615720, + "link": null, + "locked": false + } + ], + "appState": { + "gridSize": 20, + "gridStep": 5, + "gridModeEnabled": false, + "viewBackgroundColor": "#ffffff", + "lockedMultiSelections": {} + }, + "files": {} +} \ No newline at end of file diff --git a/content/img/llm_blocks.png b/content/img/llm_blocks.png new file mode 100644 index 0000000000000000000000000000000000000000..3bcb2b87b43626b91d47dd013ba1a7d652bd08d7 GIT binary patch literal 60129 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 z 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 VWOOYvN){-`;OXk;vd$@?2>?Q#;O_tc literal 0 HcmV?d00001 diff --git a/content/img/llm_blocks.svg b/content/img/llm_blocks.svg new file mode 100644 index 0000000..ee65a23 --- /dev/null +++ b/content/img/llm_blocks.svg @@ -0,0 +1,4 @@ + + +Input tokensOutput tokensModel \ No newline at end of file From 6b031b6d2ff6cee6d8be61a1d994f0d3ba444fb9 Mon Sep 17 00:00:00 2001 From: "Ashwin V. Mohanan" Date: Wed, 30 Sep 2026 10:40:04 +0200 Subject: [PATCH 06/10] Dropdown for limitations in intro --- content/introduction.md | 54 ++++++++++++++++++++++++++++++++--------- 1 file changed, 43 insertions(+), 11 deletions(-) diff --git a/content/introduction.md b/content/introduction.md index a610843..2a3139a 100644 --- a/content/introduction.md +++ b/content/introduction.md @@ -17,16 +17,45 @@ ## What is a Large Language Model? A Large Language Model (LLM) is a type of artificial intelligence trained on -vast amounts of text data to predict and generate human-like text. At their -core, these models learn statistical patterns in language: given a sequence of -words (or better *tokens*: fragments of words, commas, and anything in text), -they predict what comes next. +vast amounts of text data to predict and generate human-like text. + ```{figure} img/llm.png :alt: general concept of LLM for code generation :width: 100% ``` + + +At their core, these models learn statistical patterns in language: given a +sequence of words (or better *tokens*: fragments of words, commas, and anything +in text), they predict what comes next. In order to do so, text must first be +converted into numerical representations, then transformer layers update those +representations using the surrounding context and finally back to text. + +```text +text + -> tokens + -> token IDs + -> embeddings + -> transformer blocks + -> output logits + -> next-token probabilities + -> tokens + -> text +``` + +```{figure} img/llm_blocks.png +:alt: Input tokens -> Model -> Input tokens + output token +:width: 100% + +A simplistic mental model for an LLM performing probabilistic next token prediction. +Source: [Simo Tuomisto](https://simo-tuomisto.github.io/understanding-ai-landscape-lecture/#3) +``` + When applied to code, LLMs benefit from the fact that programming languages are highly structured and follow consistent patterns. The model doesn't "understand" code in the way humans do, but it has learned enough patterns to generate @@ -287,13 +316,10 @@ To-Do: This section needs expanding and/or kept up to date with data on current - From: [Jellyfish AI Engineering Trends](https://jellyfish.co/newsroom/jellyfish-reveals-ais-real-impact-on-engineering-teams/) (17 March 2026) survey on 700 companies, 200K engineers, 20M pull requests: more than half use AI assisted coding, 64% generate a majority of their code with AI assistance. -## Limitations to keep in mind - -Before diving into specific scenarios, remember these fundamental limitations: - -### What LLMs *cannot* do +## Limitations: what LLMs *cannot* do -A typical generative AI system based on LLMs, without `toolcall` capabilities, cannot: +Before diving into specific scenarios, remember fundamental limitations. +A typical generative AI system based on LLMs, without *tool-calling* capabilities, cannot: 1. **Verify their own output**: They cannot run code or check if it works. 2. **Access real-time information**: Knowledge is frozen at training cutoff. @@ -303,13 +329,19 @@ A typical generative AI system based on LLMs, without `toolcall` capabilities, c 3. **Understand your specific context**: They don't know your data, infrastructure, or requirements unless you tell them. 4. **Guarantee correctness**: They optimize for "plausible", not "correct". -### Common failure modes +An LLM with *tool-calling* can alleviate some of these limitations, but does not +necessarily solve it. + +:::{admonition} Common failure modes +:class: dropdown - **Hallucinated packages**: Suggesting libraries that don't exist - **Outdated APIs**: Using deprecated functions or old syntax - **Subtle bugs**: Code that looks right but has edge-case failures - **Security vulnerabilities**: Not considering injection, authentication, etc. +::: + :::{exercise} Exercise: Explore an AI chatbot Go to [duck.ai](https://duck.ai) (no account needed) and try the following: From 8c5accdff258c106f8b892d572b37697c937255c Mon Sep 17 00:00:00 2001 From: "Ashwin V. Mohanan" Date: Wed, 30 Sep 2026 10:53:36 +0200 Subject: [PATCH 07/10] Move current adoption and rm see also todo see #29 --- content/introduction.md | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/content/introduction.md b/content/introduction.md index 2a3139a..b5abb48 100644 --- a/content/introduction.md +++ b/content/introduction.md @@ -307,14 +307,6 @@ for an extended taxonomy. ::: -## Current adoption and trends - -:::{warning} -To-Do: This section needs expanding and/or kept up to date with data on current adoption trends. -::: - -- From: [Jellyfish AI Engineering Trends](https://jellyfish.co/newsroom/jellyfish-reveals-ais-real-impact-on-engineering-teams/) (17 March 2026) survey on 700 companies, 200K engineers, 20M pull requests: more than half use AI assisted coding, 64% generate a majority of their code with AI assistance. - ## Limitations: what LLMs *cannot* do @@ -376,9 +368,6 @@ In this section, we covered the foundations of AI-assisted coding: ## See also -:::{warning} -To-Do: This section needs expanding with more links and/or kept up to date. -::: - [StarCoder: A State-of-the-Art LLM for Code](https://huggingface.co/blog/starcoder) - BigCode project blog - [The Stack v2 Paper](https://arxiv.org/abs/2402.19173) - Technical details on training data @@ -386,6 +375,11 @@ To-Do: This section needs expanding with more links and/or kept up to date. - [Awesome-Code-LLM](https://github.com/codefuse-ai/Awesome-Code-LLM) - Curated list of code LLM resources - [Simon Willison: How I use LLMs to help me write code](https://simonwillison.net/2025/Mar/11/using-llms-for-code/) - Practical insights from an experienced practitioner +Current adoption and trends + +- [Jellyfish AI Engineering Trends](https://jellyfish.co/newsroom/jellyfish-reveals-ais-real-impact-on-engineering-teams/) (17 March 2026) survey on 700 companies, 200K engineers, 20M pull requests: more than half use AI assisted coding, 64% generate a majority of their code with AI assistance. + + :::{keypoints} - LLMs are pattern-matching systems trained on billions of lines of code From 2f4bcef2b98c88b6654fbcf87359d070b6cc2fa3 Mon Sep 17 00:00:00 2001 From: "Ashwin V. Mohanan" Date: Wed, 30 Sep 2026 11:10:51 +0200 Subject: [PATCH 08/10] Change admonition on reco duck.ai --- content/introduction.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/introduction.md b/content/introduction.md index b5abb48..afd8d41 100644 --- a/content/introduction.md +++ b/content/introduction.md @@ -216,8 +216,8 @@ General-purpose AI assistants accessed via web interface: | [Claude](https://claude.ai) | Anthropic | Large context window, artifacts | | [Gemini](https://gemini.google.com) | Google | Multimodal, Google integration | -:::{admonition} Recommended for exercises: Duck.ai -:class: tip +:::{admonition} Recommended tool for exercises: Duck.ai +:class: note For the exercises in this course, we recommend [Duck.ai](https://duck.ai) by DuckDuckGo. DuckDuckGo is known for its privacy-first philosophy—their search From abf26fa97321bee03d502fe849aff2629597de86 Mon Sep 17 00:00:00 2001 From: "Ashwin V. Mohanan" Date: Wed, 30 Sep 2026 11:23:10 +0200 Subject: [PATCH 09/10] Mention CodeCommons --- content/introduction.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/content/introduction.md b/content/introduction.md index afd8d41..0fd9937 100644 --- a/content/introduction.md +++ b/content/introduction.md @@ -191,7 +191,8 @@ Understanding what data models are trained on helps us understand their capabili Consider these implications: - It is useful for teaching models to follow **coding instructions**, not just predict the next token - Because much of the data is **synthetic**, model behavior may reflect the style and biases of the generator models -- It complements **large code pretraining corpora such as The Stack** rather than replacing them +- It complements **large code pretraining corpora** such as [The Stack](https://huggingface.co/datasets/bigcode/the-stack) rather than replacing them +- In the future maybe there might more alternate datasets such as [CodeCommons](https://codecommons.org/) which respect creators' rights. ::: From 6c46f190ec7c02c1b264f0a80ec44ece1c3b077f Mon Sep 17 00:00:00 2001 From: "Ashwin V. Mohanan" Date: Wed, 30 Sep 2026 11:42:59 +0200 Subject: [PATCH 10/10] Dropdown pitfalls in scenario 1 --- content/scenario-full-control.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/content/scenario-full-control.md b/content/scenario-full-control.md index 6e4fdeb..b8a77f0 100644 --- a/content/scenario-full-control.md +++ b/content/scenario-full-control.md @@ -326,7 +326,10 @@ Once satisfied with data loading, move to summary statistics: > for reaction_time and accuracy, grouped by condition." -## Common pitfalls and how to avoid them +:::{admonition} Common pitfalls and how to avoid them +:class: warning, dropdown + +Some of the following will be covered and revisited in the [episode on risks](./security.md). ### Pitfall 1: Accepting code without understanding it @@ -359,6 +362,7 @@ explain the code to a colleague, you shouldn't use it. - Search GitHub for the repository - Be especially suspicious of packages you've never heard of +::: ## When to relax the rules: Learning and exploration