Compiled on: 2026-10-22 — printable version
Every choice about an AI-powered system implies a trade-off among:
There is no option dominating all the others: governance is about choosing the right compromise for the use case at hand, and writing down why
Recall the running example (PhD admission committee assistant):
Three main deployment options, differing in who runs the model, and where data goes:
(cf. on-premise vs. on-cloud in the LLM-as-a-Service lecture)
| Proprietary cloud API | Hosted open model | On-premise | |
|---|---|---|---|
| Quality | highest (frontier models) | good (best open models lag the frontier) | limited by the hardware (smaller models) |
| Cost structure | pay per token, no fixed costs | pay per token or per GPU-hour | hardware purchase + energy + staff; ~zero marginal cost |
| Scalability | virtually unlimited (within rate limits) | high | bounded by owned hardware |
| Control | low: models may change or be retired; no access to weights | medium: model is portable, provider is replaceable | full: versions pinned, runs offline |
| Privacy | data processed by provider (contracts, retention, jurisdiction matter) | same concerns, possibly with an EU provider | data stays in-house |
| Lock-in | high (proprietary features, prices) | low | low (but lock-in on hardware skills) |
| Time-to-market | minutes | hours | days to weeks (procurement, setup) |
| Footprint | energy per token hidden in the price | as for cloud APIs | power use measurable (and billed to you) |
Let’s estimate the yearly cost of the running example, under explicit (and rough) assumptions:
| Option | Price (USD per 1M input / output tokens) | Yearly cost |
|---|---|---|
| frontier proprietary model (e.g. Claude Opus 5.5) | \$4 / \$20 | 17.5 × 4 + 2.5 × 20 ≈ \$120 |
| small proprietary model (e.g. Claude Haiku 4.5) | \$1 / \$5 | ≈ \$30 |
| hosted open model, in the EU (e.g. Mistral Small 4, multimodal, Apache 2.0, on Mistral’s La Plateforme) | \$0.15 / \$0.60 | 17.5 × 0.15 + 2.5 × 0.6 ≈ \$4 |
| rented GPU, on demand (e.g. 24 GB GPU on RunPod) | ~\$0.35–0.75 per hour | a few hours per year ≈ \$5 (+ setup effort) |
| on-premise (a 24 GB GPU workstation) | ~€2–2.5k for the GPU alone | €2.5k+ upfront, + energy, + maintenance |
(prices as of September 2026: they change every few months, always re-check them)
At this scale, cost is not the deciding factor: compliance and control are. Things change at scale: e.g. one 80 GB GPU rented 24/7 costs ~\$2k/month, which buys ~100M output tokens of a frontier model per month. The break-even depends on volume, utilization, and model size
AI-powered software is subject to (at least) four layers of rules, each with a different object:
plus contracts (e.g. providers’ terms of service, data processing agreements) and licenses (of models, and of data)
Disclaimer: this is an engineer’s overview, not legal advice: in real projects, involve your organization’s legal office and Data Protection Officer (DPO)
| Provider | EU data residency | Zero data retention (ZDR) |
|---|---|---|
| OpenAI | yes (new projects, EU regional endpoints, surcharge) | for eligible customers, upon agreement |
| Anthropic | not on the first-party API; yes via cloud partners (AWS Bedrock, Google Vertex) | upon agreement |
| Google Vertex AI | yes (EU multi-region) | yes, disabling default caching |
| Microsoft Azure | yes (“Data Zone EU” deployments) | upon request (modified abuse monitoring) |
| Mistral | yes (EU or US regional inference) | upon request (default: 30 days retention for abuse monitoring) |
Our running example is high-risk: it contributes to deciding admission to a PhD programme. The same LLM, used to summarize news, would be minimal risk: the Act regulates the use, not the technology
| Role | Who is it? | Main obligations (for high-risk systems) |
|---|---|---|
| Provider | who develops the system and puts it on the market / into service under its name | risk management (Art. 9), data governance (Art. 10), technical documentation (Art. 11), automatic logging (Art. 12), instructions for use (Art. 13), human oversight by design (Art. 14), accuracy & robustness (Art. 15), quality management, conformity assessment, registration, post-market monitoring |
| Deployer | who uses the system under its authority | use it as instructed; assign human oversight to competent, trained people; ensure input data are relevant; monitor it; keep logs for ≥ 6 months; inform affected people (Art. 26); public bodies: fundamental rights impact assessment (Art. 27) |
| Affected person | e.g. the candidate | right to an explanation of decisions based on high-risk AI output (Art. 86) |
| Date | What applies |
|---|---|
| 1 Aug 2024 | entry into force |
| 2 Feb 2025 | prohibitions (Art. 5), AI literacy (Art. 4) |
| 2 Aug 2025 | GPAI model obligations, governance structures |
| 2 Aug 2026 | general application, including transparency (Art. 50) |
| 2 Dec 2026 | new prohibitions (Art. 5(1)(ba)–(bb)): AI generating non-consensual intimate imagery (“nudifiers”) or child sexual abuse material; end of the grace period for the Art. 50(2) marking duty, for generative systems already on the market before 2 Aug 2026 |
| 2 Dec 2027 | high-risk systems of Annex III (e.g. education), postponed from 2 Aug 2026 |
| 2 Aug 2028 | high-risk systems of Annex I (safety components of regulated products), postponed from 2 Aug 2027 |
For the running example: scores must remain suggestions to the committee, candidates’ data must not go to consumer chatbots, and the University is accountable for the whole process
A model release is a bundle of separately openable artifacts: downloading one of them (usually the weights) says little about the others
| Component | What a useful release contains | What it enables |
|---|---|---|
| Weights | final parameters (ideally also intermediate checkpoints) | local inference, fine-tuning, independent hosting |
| Inference code | architecture, tokenizer, generation code, configuration | actually running the weights |
| Training code & recipe | data processing, hyper-parameters, training and post-training (SFT, RL) pipelines | understanding how the weights arose; re-training |
| Training data | the actual training mixture, in training-ready form | data auditing, contamination analysis, exact reproduction |
| Data information | provenance, sources, filtering and selection processes | a (weaker) substitute when data cannot be redistributed |
| Documentation | model card, technical report, evaluations, limitations | auditability, downstream risk assessment |
| Licenses | separate licenses for weights, code, and data | knowing what you may legally do with all the above |
| Framework | Question it answers |
|---|---|
| Liesenfeld & Dingemanse, FAccT 2024 | how open is a release in practice? (14 dimensions, 40 text LLMs + 6 text-to-image models) |
| European Open Source AI Index | which open-science artifacts were actually released? (graded score; top ranks in July 2026: YuLan-Mini, BLOOMZ, OLMo 3, Apertus) |
| Stanford Foundation Model Transparency Index (Dec. 2025) | how transparent are providers? (mean score 41/100, down 17 from 2024; IBM 95, DeepSeek 32, Alibaba 26: open weights $\neq$ transparency) |
| OSI Open Source AI Definition | does a system meet a normative definition of “open source AI”? (next slide) |
| Category | Examples | What is open | Main limitation |
|---|---|---|---|
| Closed (API-only) | GPT, Claude, Gemini, Mistral’s “Premier” models | API + documentation | no weights; usage governed by terms of service |
| Open weights, restrictive license | Llama 4, Gemma 3, Teuken v0.6, BLOOM (RAIL) | weights, inference code | use-based, geographic, commercial, or downstream restrictions: not “any purpose” |
| Open weights, permissive license | Gemma 4, Qwen3, DeepSeek-R1, gpt-oss, Mistral Large 3 / Small 4 | weights under Apache 2.0 or MIT | training data and full pipeline not released |
| Fully (or nearly) open | OLMo 3, Apertus, Minerva | weights + code + data (or data pipeline) + docs | reproduction still needs enormous compute |
| Model | Before | Now |
|---|---|---|
| Gemma | Gemma 3: custom Gemma Terms, with cascading use restrictions | Gemma 4 (2026): Apache 2.0 |
| DeepSeek-V3 | original V3: custom DeepSeek Model Agreement | V3-0324: relicensed under MIT (March 2025) |
| Mistral | historically mixed | still mixed: Large 3 and Small 4 Apache 2.0, Medium 3.5 “Modified MIT”, several models proprietary |
| Teuken | v0.4-commercial: Apache 2.0 | v0.6: non-commercial (“newer” does not mean “more permissive”) |
| iGenius → Domyn | Italia 9B: MIT; Italia 10B: custom, non-open license | rebranded Domyn (June 2025); Domyn Small 10B (May 2026): MIT |
| License | On-premise use | Fine-tuning | Hosted service | Redistribution |
|---|---|---|---|---|
| Llama 4 (license, AUP) | yes, except multimodal models for individuals/companies based in the EU | yes | yes (EU end users of products are carved out) | “Built with Llama” attribution; derived models named “Llama…”; separate license above 700M monthly active users |
| Gemma 3 (terms) | yes, within the prohibited-use policy | yes, derivatives inherit the restrictions | counts as distribution | restrictions must be passed to downstream users; Google may restrict use “remotely or otherwise” (a contractual right, not a kill switch) |
| OpenRAIL (OpenRAIL-M) | yes, for permitted purposes | yes, for permitted purposes | yes, users bound to use restrictions | use restrictions must be passed on |
| Apache 2.0 / MIT | yes | yes | yes | yes, with attribution/notices (and patent clauses, for Apache) |
Running example: the admission assistant must read passport pictures, hence needs a multimodal model. The University of Bologna is an EU organization: under Llama 4’s acceptable use policy, it is not granted the right to use Llama 4’s multimodal models. Gemma 4, Qwen3, or Mistral’s Apache models raise no such issue
| GPAI provider duty (Art. 53) | Ordinary GPAI | Free/open-source GPAI |
|---|---|---|
| (a) technical documentation (for the AI Office) | required | exempt |
| (b) information for downstream providers | required | exempt |
| (c) policy to comply with EU copyright law (incl. text-and-data-mining opt-outs) | required | still required |
| (d) public summary of training content (AI Office template) | required | still required |
| systemic-risk obligations (Art. 55) | if > 1025 FLOPs (presumption of Art. 51(2)) | no exemption |
The AI Act gives open-source GPAI a documentation discount: not a copyright exemption, not a training-data-summary exemption, and not a systemic-risk exemption
Skeptical reading: for an engineer, where the model runs and what its license allows matter much more than who trained it. The evidence (next slides) suggests that EU and Italian models are mostly small, late, and not competitive with the frontier, nor with the best global open-weights models
Data from the Stanford AI Index 2026 (2025 figures):
| United States | China | Europe | Italy | |
|---|---|---|---|---|
| Notable AI models released (Epoch AI, Fig. 1.1.13) | 59 | 35 | 1 (France); 1 more in the UK | none listed |
| Private AI investment (Quid, Fig. 4.2.8, 4.2.11) | \$285.9B | \$12.4B | \$20.9B (France \$4.4B, Germany \$3.9B) | < \$1B (not in the top 15) |
| … of which generative AI (Fig. 4.2.10) | \$163.6B | \$1.5B | \$3.2B | — |
| Newly funded AI companies (Fig. 4.2.9) | 1,953 | 161 | e.g. Germany 92, France 84 | 38 |
| Growth of private AI investment, 2024 $\rightarrow$ 2025 (Fig. 4.2.11) | +160% | +32% | +7% | — |
| Model | Who | What | License | Status (Sep. 2026) |
|---|---|---|---|---|
| Minerva | Sapienza NLP, within the FAIR PNRR project; trained on CINECA’s Leonardo | 350M, 1B, 3B, and 7B, from scratch; 1.14T Italian + 1.14T English + 200B code tokens | Apache 2.0, open data | 7B presented in Nov. 2024; still the flagship, research-grade |
| LLaMAntino / ANITA | Univ. of Bari | fine-tunes of Llama, Mistral, gpt-oss for Italian (not trained from scratch) | inherited; ANITA-NEXT’s metadata says Apache 2.0, its card says “research only” | active research project; license hygiene is weak |
| Velvet | Almawave (private); trained on Leonardo | 2B and 14B, 6 languages (~23% Italian for the 14B) | Apache 2.0 | released Jan.–Feb. 2025, static since |
| Italia → Domyn Small | iGenius (private), renamed Domyn in June 2025 | Italia 9B (2024), then 10B; Domyn Small 10B (May 2026), 50+ languages | Italia 9B: MIT; Italia 10B: custom, non-open; Domyn Small: MIT | company focus moved to proprietary large models |
| Initiative | Who | What | License | Status (Sep. 2026) |
|---|---|---|---|---|
| EuroLLM | IST Lisbon, Univ. of Edinburgh, Unbabel, et al.; EuroHPC and Horizon Europe funding | 1.7B, 9B, 22B; 35 languages (all 24 EU ones), ~4T tokens | Apache 2.0 | 22B released Feb. 2026 |
| OpenEuroLLM | 20 members, led by Charles University and AMD Silo AI; Digital Europe grant (Feb. 2025, 3 years) | “truly open” models for all EU languages | open (planned) | so far only small reference models (e.g. 38 monolingual 2.15B, with HPLT); flagship still pending |
| OpenLLM-France | French consortium, Bpifrance funding | Lucie-7B, then Luciole 1B/8B/23B (~30% French) | open data, weights, code | research project |
| Teuken / OpenGPT-X | Fraunhofer, FZ Jülich, et al.; ~€14M from the German government | 7B, 24 EU languages | v0.4: Apache 2.0; v0.6: non-commercial | project ended in March 2025; models still downloadable |
| Apertus | ETH Zurich, EPFL, CSCS (Swiss AI Initiative: CHF 20M + 10M GPU-hours) | 8B, 70B; 1.5 (July 2026) adds images, reasoning, tools | Apache 2.0, fully open | the most complete open release in Europe; 2.0 planned for 2027 |
| Mistral AI | French private company | from small to large MoE models | mixed: Apache 2.0, Modified MIT, proprietary | the European vendor closest to the frontier; little training disclosure |
Leaderboard positions change every few months: when citing a rank, always write the snapshot date
These initiatives are valuable for research, openness, and language coverage; they are (still) not a production-grade alternative to global models. An EU organization can get operational control by running a global open-weights model on EU infrastructure
The compliance unit is checkpoint + license version + code licenses + data licenses + deployment + intended use, not a brand name
| Question | What to check |
|---|---|
| exactly which artifact? | repository, checkpoint hash, release date, license version |
| commercial use? | Apache/MIT: yes; CC-BY-NC: no; custom licenses: read the use restrictions |
| on-premise use? | the license, not the availability of files (e.g. Llama 4 multimodal in the EU) |
| fine-tuning, distillation, merging? | whether derivatives inherit restrictions; license of each parent model |
| hosted service or redistribution? | whether serving an API counts as distribution (it does for Gemma 3); attribution and naming duties |
| geography or scale limits? | e.g. Llama 4: EU multimodal clause, 700M monthly users |
| training and fine-tuning data? | provenance, licenses (e.g. ODC-By), personal data |
| AI Act role? | are we becoming a GPAI provider (e.g. by fine-tuning and distributing)? does the open-source exemption apply? |
| reproducibility needed? | self-hosting: permissive weights suffice; audit or research: prefer fully open models (OLMo 3, Apertus) |
Mnemonic: weights → license → recipe → data → regulatory role: a model is only as open as the layer that matters for your use
| Technique | Quality | Cost | Control | Compliance | Time-to-market |
|---|---|---|---|---|---|
| Prompting | good, if the model knows enough | low (but long prompts cost tokens at each request) | high: prompts are versioned text | easy to audit | fastest |
| Tools / agents | high for tasks needing actions or live data | medium (more requests per task) | medium: behaviour is less predictable | needs least privilege and logging | medium |
| RAG | high for knowledge-intensive tasks | medium (indexing + longer prompts) | high: knowledge base is inspectable and updatable | data stays in your store; access control needed | medium |
| Skills | high, if the agent picks the right skill | low–medium | medium: the agent decides when to apply them | depends on the tools the skill allows | fast (write a document) |
| Workflows | high and consistent | medium | highest: steps are fixed by the engineer | easy to audit step by step | slow (more code) |
| Fine-tuning | highest for narrow tasks, if data suffice | high (data, training, re-training at each model update) | low–medium: behaviour baked into weights | training data must be lawful; license must allow it | slowest |
Recall the rule of thumb: start with prompting, measure, and add complexity only when evaluations show that it is needed
(cf. model zoos in the LLM-as-a-Service lecture)
As models saturate classic benchmarks, new ones try to measure what models cannot (yet) do:
Source: Stanford AI Index 2026, ch. 2, Figure 2.1.1 (CC BY-ND 4.0)
Engineering take-away: frontier benchmarks tell you where the state of the art is, not whether a model is good for your task
Source: METR, time horizons, retrieved October 2026
Source: METR, time horizons, retrieved October 2026
Source: ARC Prize leaderboard, retrieved October 2026
Rule of thumb: start from the smallest/cheapest model satisfying the hard constraints, measure its quality on your task, and move to bigger models only if needed
usage)Goal: the admission committee wants to pick the model to be used for letter scoring (cf. Example 1 of the Prompt Engineering lecture), based on evidence rather than on hype
Code: put your solution in
snippets/lecture_governance/exercise1/oflab-snippets, and run it viapoetry run python -m snippets -l governance -x 1
OPENAI_MODEL (and OPENAI_BASE_URL=http://localhost:11434/v1 for Ollama)response.usage), hence costtime.perf_counter() before and after the requestscore_letter(...) only returns the parsed LetterInfo: adapt it to also return the whole response (or its usage)usage.prompt_tokens and usage.completion_tokens by the prices listed in the zoo (Open Router also reports usage.cost directly)0 vs. 1) should visibly affect the varianceSolution: a walkthrough follows in the next (vertical) column — try on your own first!
⚠️ The walkthrough of a possible solution is about to start
master branch of lab-snippets (while you cloned the exercises branch)Step 1: shortlist 3 models (and fix a reference to compare them against)
# step 1: the shortlist (free models are rate-limited: retries below)
DEFAULT_MODELS = ["google/gemma-4-26b-a4b-it:free", "nvidia/nemotron-3-super-120b-a12b:free", "llama3.2@http://localhost:11434/v1"]
REPETITIONS = int(os.environ.get("REPETITIONS", 5))
TEMPERATURE = os.environ.get("TEMPERATURE")
# the reference: the committee's OWN scores, by reading the letters (without it, one can tell whether models agree, not who is right)
REFERENCE = {"mario-rossi": 5, "jean-dupont": 3, "mohammed-ali": 2}
OUTPUT = Path(os.environ.get("COMMITTEE_OUTPUT", "output")) / "model-comparison.csv"
def client_for(model: str) -> tuple[OpenAI, str]:
"""e.g. 'llama3.2@http://localhost:11434/v1' -> a client for Ollama, and 'llama3.2'."""
name, _, url = model.partition("@")
return OpenAI(base_url=url or base_url, api_key=api_key if not url else "local", max_retries=0), name
MODEL (Open Router) or MODEL@BASE_URL (e.g. Ollama): one script, many providers, thanks to OpenAI-compatible APIsREFERENCE = the committee’s own scores: without it, one can tell whether models agree, not who is rightmax_retries=0: retries are handled explicitly (next slide)base_url, api_key: imported from Example 1 of the Prompt Engineering lecture (i.e. OPENAI_BASE_URL, OPENAI_API_KEY)REPETITIONS (runs per letter), TEMPERATURE (default: the provider’s), COMMITTEE_OUTPUT (directory of the CSV file)Step 2: adapt
score_letter(...)to return the whole response, not just the parsedLetterInfo
def score_letter(client: OpenAI, model: str, letter_text: str):
"""As in Example 1, but returns the WHOLE response (i.e. also its usage), not just the parsed LetterInfo."""
options = dict(temperature=float(TEMPERATURE)) if TEMPERATURE else {}
return with_retries(lambda: client.chat.completions.parse( # retries upon rate limits (cf. Exercise 2 of the LLM-as-a-Service lecture)
model=model,
messages=[
dict(role="system", content=general_instructions),
dict(role="user", content=f"Score the following letter:\n\n<letter>\n{letter_text}\n</letter>"),
],
response_format=LetterInfo,
**options,
), retries=5, initial_delay=5)
usage, hence tokens and costwith_retries (from Exercise 2 of the LLM-as-a-Service lecture) copes with rate limits of free modelsSteps 2–3: run once, and collect score, failures, latency, tokens, and cost
def run_once(model: str, candidate: str, repetition: int) -> dict:
"""Step 2-3: one run, as a row of the CSV file. Failures are rows too: they must be counted, not hidden."""
client, name = client_for(model)
row = dict(model=model, candidate=candidate, repetition=repetition, score=None, error=None, latency=None, prompt_tokens=None, completion_tokens=None, cost=None)
start = time.perf_counter()
try:
response = score_letter(client, name, data.letter(candidate).read_text())
row["latency"] = round(time.perf_counter() - start, 2) # wall-clock time, retries included
row["score"] = response.choices[0].message.parsed.score # may fail, e.g. upon refusals or invalid JSON
row["prompt_tokens"], row["completion_tokens"] = response.usage.prompt_tokens, response.usage.completion_tokens
row["cost"] = getattr(response.usage, "cost", None) # in USD, reported by Open Router (not part of OpenAI's API)
except Exception as e:
row["error"] = f"{type(e).__name__}: {e}"[:200]
return row
time.perf_counter(): wall-clock, retries included (what users would actually wait)usage.cost is an Open Router extension: elsewhere, multiply tokens by the prices in the zooStep 4: one line per model, comparing mean ± sd against the reference
def summarise(rows: list[dict]) -> list[dict]:
"""Step 4: one line per model."""
summary = []
for model in dict.fromkeys(row["model"] for row in rows): # models, in order of appearance
ok = [row for row in rows if row["model"] == model and row["error"] is None]
scores = {c: [row["score"] for row in ok if row["candidate"] == c] for c in REFERENCE}
means = {c: statistics.mean(s) for c, s in scores.items() if s}
summary.append(dict(
model=model,
**{c: f"{means[c]:.1f} ± {statistics.pstdev(s):.1f}" if s else "n/a" for c, s in scores.items()}, # consistency
error=round(statistics.mean(abs(row["score"] - REFERENCE[row["candidate"]]) for row in ok), 2) if ok else None, # w.r.t. the reference
ranking=" > ".join(sorted(means, key=means.get, reverse=True)), # agreement among models: compare these
failures=sum(row["model"] == model for row in rows) - len(ok),
latency=round(statistics.mean(row["latency"] for row in ok), 1) if ok else None,
tokens=sum((row["prompt_tokens"] or 0) + (row["completion_tokens"] or 0) for row in ok),
cost=round(sum(row["cost"] or 0 for row in ok), 4),
))
return summary
statistics (Python’s standard library): mean, and pstdev (population standard deviation)dict.fromkeys(...): the models, de-duplicated but in orderAutomate the runs: models × letters × repetitions, raw data to CSV, summary as a table
if __name__ == "__main__":
models = sys.argv[1:] or DEFAULT_MODELS
rows = []
for model in models:
for candidate in REFERENCE:
for repetition in range(REPETITIONS):
rows.append(row := run_once(model, candidate, repetition))
outcome = row["error"] or f"score {row['score']} in {row['latency']}s"
print(f"# {model} | {candidate} #{repetition + 1}: {outcome}")
OUTPUT.parent.mkdir(parents=True, exist_ok=True)
with OUTPUT.open("w", newline="") as f: # raw data: one row per run, for further analysis
writer = csv.DictWriter(f, fieldnames=list(rows[0]))
writer.writeheader()
writer.writerows(rows)
print(f"\nRuns written to {OUTPUT}, reference scores: {REFERENCE}\n")
print(markdown(summarise(rows)))
output/model-comparison.csv for further analysiscsv.DictWriter (standard library): writes dicts as CSV rows, one column per keymarkdown(...), a tiny helper in the same file): ready to be pasted into the decision record of Exercise 2TEMPERATURE=0 vs. TEMPERATURE=1: the variance should change visiblyFiles of this solution, in the lab-snippets repository (master branch):
lab-snippets/
├── data/
│ ├── letter-jean-dupont.txt # inputs (running example)
│ ├── letter-mario-rossi.txt
│ ├── letter-mohammed-ali.txt
│ └── __init__.py # helpers to locate data files
├── snippets/
│ ├── lecture_llmaas/
│ │ └── exercise2/
│ │ └── repl_chat_retry.py # with_retries (reused)
│ ├── lecture_prompting/
│ │ └── example1/
│ │ └── letter_scoring_openai.py # prompt and schema (reused)
│ └── lecture_governance/
│ └── exercise1/
│ └── compare_models.py # the solution
└── pyproject.toml # dependencies of all snippetspoetry run python -m snippets -l governance -x 1 # default shortlist
poetry run python -m snippets -l governance -x 1 MODEL1 MODEL2@URL ... # custom shortlist
OPENAI_API_KEY (and OPENAI_BASE_URL), REPETITIONS (default 5), TEMPERATURE, COMMITTEE_OUTPUT (default output/)Question: when we envelop the world for AI, who decides what changes, and does anyone notice?
| What is adapted | How | For which AI |
|---|---|---|
| Websites | llms.txt files, Markdown versions of pages, agent-friendly APIs |
LLM crawlers, coding assistants |
| Web content | generative engine optimisation: content rewritten to be cited in LLM answers (Aggarwal et al., 2024) | AI search engines |
| Software | MCP servers, tool docstrings, structured outputs (cf. agents lecture) | agents |
| Code bases | AGENTS.md / CLAUDE.md files, skills (cf. skills lecture) |
coding assistants |
| Processes | forms, documents, and tickets re-designed to be machine-readable | extraction pipelines |
| People | applicants writing CVs for screening software, authors hiding prompts for AI reviewers in their papers | classifiers, scorers |
Rule of thumb: if the world must adapt to the AI, make the adaptation visible and contestable: an artefact, not a habit
Recall the running example (PhD admission committee assistant):
The last item is no longer about the world adapting to AI, but about the people using it: see next slides
Responsibility remains human: systems must be designed so that humans can exercise it, not just sign for it
| Bias | What happens | LLM-specific twist |
|---|---|---|
| Over-trust (automation bias, complacency) | humans accept automated outputs without checking them: they miss errors, or follow wrong advice (Parasuraman & Manzey, 2010) | outputs are fluent and look like expert work; checking a long output costs more than accepting it |
| Artificial salience | what the system shows or highlights becomes what humans attend to, the rest is ignored (anchoring) | summaries, scores, and rankings frame the decision before the human reads the sources |
| False certainty | humans read confidence where there is none | LLMs use the same assertive tone whether right or wrong; their verbalised confidence is poorly calibrated (Xiong et al., 2024) |
| Countermeasure | Against | How, in practice |
|---|---|---|
| Evidence next to outputs | over-trust | show the source (picture, sentence, document) supporting each field or claim: no evidence $\rightarrow$ no claim |
| Surfaced uncertainty | false certainty | flag low-agreement fields (cf. self-consistency), never pre-fill them |
| Independent judgement first | salience | humans judge (at least a sample) before seeing the AI output, then compare |
| Neutral presentation | salience | do not rank, sort, or colour by AI score until humans have reviewed |
| Friction for irreversible actions | over-trust | require an approval with a written motivation (cf. human-in-the-loop tools) |
| Monitoring of overrides | rubber-stamping | too many overrides: the AI is unreliable; too few: humans may have stopped checking |
| Training | all | teach the system’s failure modes (e.g. prompt injection), not just its features |
| Logging and tracing | lack of accountability | who decided what, based on which output, with which model and prompt version |
Oversight is a feature to engineer, with its own requirements and tests, not a checkbox
These choices are part of the human oversight decision of Exercise 2
Goal: the University asks the committee to justify the adoption of the admission assistant, before using it on real applications
Deliverable: a document (e.g.
decision-record.md), insnippets/lecture_governance/exercise2/oflab-snippets
Write a short (2–4 pages) decision record, answering:
Solution: a walkthrough follows in the next (vertical) column — try on your own first!
⚠️ The walkthrough of a possible solution is about to start
master branch of lab-snippets (while you cloned the exercises branch):
decision-record.md, an ADR-like document (status, context, sections 1–6, consequences)Decision 1: the system is high-risk, and the University is both its provider and its deployer
Decision 2: the five dimensions as criteria; 500 applications/year ≈ 17.5M input + 2.5M output tokens/year
| Option | Quality | Cost per year | Control | Compliance | Time-to-market |
|---|---|---|---|---|---|
| A. proprietary API (e.g. Claude Haiku 4.5) | high | ≈ \$30 | low: snapshots can be pinned, but are retired by the vendor | DPA + transfer safeguards; data leaves the University | days |
| B. open-weights model, hosted by an EU provider (e.g. Mistral La Plateforme, Scaleway, OVHcloud) | medium-high | ≈ \$1–10 (cf. the worked example) | medium: pinned checkpoint | DPA; data stays in the EU | days |
| C. open-weights model, on-premise (24 GB GPU) | medium | ≈ €2.5k upfront + energy + maintenance | full | data never leaves the University | weeks |
gpt-4o-2024-08-06 in LLM-as-a-Service) are retired on the vendor’s schedule, forcing re-validation; and data would leave the UniversityDecision 5: what is reviewed by whom, who is accountable, and how automation bias is countered
Decision 6: what is logged, and when the decision is re-assessed
Consequence: the committee’s workload moves from reading to reviewing, and reviews must be real, not rubber stamps
Files of this solution, in the lab-snippets repository (master branch):
lab-snippets/
└── snippets/
└── lecture_governance/
├── exercise1/
│ └── compare_models.py # produces the results table (Exercise 1)
└── exercise2/
└── decision-record.md # the decision record (this solution)poetry run python -m snippets -l governance -x 1, and paste the printed tableAnswer in your own words, motivating your conclusions and using examples where useful.
Questions asking whether something is possible or desirable require more than a yes/no answer.
Implementation questions can be answered with an explanation or pseudocode unless executable code is explicitly requested.
Labels identify the primary learning target:
Practical answers should identify the technology used, without requiring memorisation of product-specific details (model names, prices, API signatures, versions, limits).
[notions, theoretical] What is AI governance in an organisation, and which decisions belong to it? Explain why choosing an architecture or model can be a governance decision even before a legal question arises.
[reasoning, theoretical] How would you compare two plausible designs when one offers better quality and faster delivery, while the other offers more control and easier compliance? Explain how quality, cost, control, compliance, and time-to-market can conflict, and what evidence would justify your choice.
[know-how, practical] A university wants to process applicants’ documents with an LLM. How would you compare a proprietary API, a third-party host of an open model, and an on-premise deployment? Identify who handles the data and operations in each case, and when a hybrid arrangement would help.
[reasoning, practical] How would you estimate whether paying per request or running your own model is cheaper for a particular workload? State the assumptions you would need, including volume, token use, hardware utilisation, labour, and maintenance, and explain why the cheapest option may still be unsuitable.
[notions, practical] Which different questions are answered by data-protection law, AI-specific regulation, national law, institutional policy, provider contracts, and model licenses? Explain why satisfying one layer does not settle the others.
[know-how, practical] Before sending identifiable application documents to an external LLM provider, what would you investigate and document? Discuss purpose and minimisation, the controller–processor relationship, retention and logs, international transfers, impact assessment, and the possibility of significant automated decisions.
[reasoning, practical] Why can the same model be used in one minimal-risk application and in another application subject to high-risk obligations? Apply this distinction to a system that scores applicants, and explain what changes if its output merely informs a committee rather than automatically rejecting people.
[know-how, practical] An organisation builds an admission assistant on top of a third-party general-purpose model. How would you identify the model provider, the system provider, the deployer, and affected people? What kinds of duties would you examine for each role, including human oversight, documentation, monitoring, and transparency?
[reasoning, practical] An AI system seems permissible under a general EU rule, but a national rule or the organisation’s policy imposes tighter conditions. How should engineers handle this during design and procurement, and who should help resolve uncertain interpretations?
[notions, theoretical] In what different senses can an AI model be called “open”? Explain what weights, code, training recipe, data or data information, documentation, and licenses each let a user inspect or do, and why downloadable weights alone do not establish reproducibility.
[reasoning, practical] A model is advertised as “open source.” How would you examine that claim for both practical reuse and auditability? Explain why a normative definition of open-source AI and a regulatory exemption for open general-purpose models may set different thresholds.
[know-how, practical] A team plans to fine-tune, merge, or distil an open-weights model and sell access to the result. What exactly would you check before proceeding? Include the checkpoint and license version, upstream models, training data, outputs, downstream distribution, and the team’s possible regulatory role.
[reasoning, theoretical] What might an organisation mean by “sovereign AI”? Distinguish where a model was developed, where it runs, and how much of its construction can be audited. How would you assess a local-language or nationally developed model without assuming its origin makes it better, more open, or more suitable for production?
[know-how, theoretical] A system fails because it lacks current facts, must perform actions, follows a repeatable procedure, and sometimes produces the wrong style. Which of prompting, RAG, tools or agents, skills, workflows, and fine-tuning might address each problem? Explain how you would add complexity only where evidence warrants it.
[know-how, practical] How would you form a shortlist of models for a real application? Separate hard constraints from qualities you would rank, and explain what model cards, system cards, dataset documentation, provider terms, and your own tests can and cannot establish.
[reasoning, theoretical] Why might a model that leads a public benchmark or leaderboard perform poorly in your application? Discuss benchmark saturation, contamination, changing test conditions, task mismatch, and the difference between a reported capability and a dependable workflow outcome.
[know-how, practical] How would you compare several models for scoring applicants’ letters? Design a small evaluation that considers a human reference, repeated runs, disagreement, invalid outputs, latency, and cost, and explain how you would choose a model and know when to revisit the choice.
[reasoning, theoretical] What does it mean to adapt a process or its users to an AI system? Contrast an explicit, contestable change to an admission procedure with a silent change that favours what the model handles well. Who should be able to notice and challenge such adaptations?
[reasoning, theoretical] Why can placing a human “in the loop” fail to provide meaningful oversight? Explain the responsibility gap, automation bias, artificial salience, and false certainty, and how a nominal approver can end up bearing blame without real control.
[know-how, practical] Design the committee’s review of AI-extracted facts and suggested scores so that members can exercise independent judgement. Explain what evidence they see, when they see the AI’s ranking, how uncertainty and overrides are handled, and how you would detect rubber-stamping over time.
[know-how, practical] What would you put in a governance decision record before deploying an admission assistant? Explain how a colleague could reconstruct the regulatory classification, alternatives, deployment and model choice, evaluation evidence, human responsibilities, monitoring plan, and conditions that trigger reconsideration.
Compiled on: 2026-10-22 — printable version