Hands-on Beispiel LLM (2)¶
2. Fine-tuning - Anpassung an juristische Fachtexte¶
— Juristische Fragen an ein fine-tuned Modell (Lokale LLM)¶
In diesem Abschnitt fine-tunen wir das Modell dbmdz/german-gpt2 und stellen ihm die gleichen zwei juristischen Fragen zum AI Act wie im Baseline-Notebook.
Ziel ist es, dass das feingetunte Modell (llm-2) nun fundiertere und korrekte Antworten liefert.
[1]:
# falls noch nicht installiert
import sys
# !{sys.executable} -m pip install transformers datasets
# !{sys.executable} -m pip install 'accelerate>=1.10.0'
[2]:
import torch
from transformers import AutoTokenizer, AutoModelForCausalLM, Trainer, TrainingArguments, DataCollatorForLanguageModeling
from datasets import Dataset
[3]:
# Lade Modell und Tokenizer (das Basis-Modell bleibt identisch)
model_name = "dbmdz/german-gpt2"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(model_name)
model = model.bfloat16()
# Da GPT-2-Modelle oft keinen expliziten Padding-Token besitzen, setzen wir hier den EOS-Token als Padding-Token.
tokenizer.pad_token = tokenizer.eos_token
# Konfiguriere pad_token_id im Modell
# (braucht man, wenn das Modell noch nicht standardmäßig für den Umgang mit dem Padding-Token eingestellt ist)
model.config.pad_token_id = tokenizer.eos_token_id
model.generation_config.pad_token_id = tokenizer.pad_token_id
Warning: You are sending unauthenticated requests to the HF Hub. Please set a HF_TOKEN to enable higher rate limits and faster downloads.
GPT2LMHeadModel LOAD REPORT from: dbmdz/german-gpt2
Key | Status | |
----------------------------------------+------------+--+-
transformer.h.{0...11}.attn.masked_bias | UNEXPECTED | |
Notes:
- UNEXPECTED :can be ignored when loading from different task/architecture; not ok if you expect identical arch.
Domänenspezifischer Datensatz: Auszüge aus dem AI Act¶
Wir extrahieren zwei wichtige Absätze aus dem AI Act, die juristische Fachtermini und Anforderungen beinhalten.
Hinweis: Die folgenden Textabschnitte sind exemplarisch und basieren auf öffentlich zugänglichen Informationen zum AI Act, z.B.: „https://eur-lex.europa.eu/legal-content/DE/TXT/?uri=CELEX:32024R1689“
[4]:
# Ausgewählte Absätze aus dem AI Act (Beispiele)
ai_act_texts = [
"""Artikel 1 – Anwendungsbereich:
Diese Verordnung gilt für KI-Systeme, die in der Europäischen Union in Verkehr gebracht oder in Betrieb genommen werden, und legt die grundlegenden Anforderungen an Sicherheit, Transparenz und Verantwortlichkeit fest.""",
"""Artikel 2 – Risikoklassifizierung:
KI-Systeme werden in Abhängigkeit von ihrem potenziellen Risiko in verschiedene Kategorien eingeteilt. Hochrisiko-KI-Systeme unterliegen strengen Anforderungen an ihre Konzeption, Entwicklung und den Betrieb, um die Sicherheit und den Schutz der Grundrechte zu gewährleisten."""
]
[5]:
# Erstelle ein Dataset aus den Auszügen
data_dict = {"text": ai_act_texts}
dataset = Dataset.from_dict(data_dict)
print("Domänenspezifischer Datensatz erstellt:")
print(dataset)
Domänenspezifischer Datensatz erstellt:
Dataset({
features: ['text'],
num_rows: 2
})
[6]:
# %% [code]
# Tokenisiere den Datensatz
def tokenize_function(example):
return tokenizer(example["text"], truncation=True, padding="max_length", max_length=256)
tokenized_dataset = dataset.map(tokenize_function, batched=True)
tokenized_dataset = tokenized_dataset.remove_columns(["text"])
print("Tokenisierter Datensatz:")
print(tokenized_dataset)
Tokenisierter Datensatz:
Dataset({
features: ['input_ids', 'attention_mask'],
num_rows: 2
})
[7]:
# Erstelle einen DataCollator für das Language Modeling
data_collator = DataCollatorForLanguageModeling(tokenizer=tokenizer, mlm=False)
[8]:
# Definiere Trainingsargumente – das Fine-Tuning erfolgt exemplarisch über wenige Epochen
training_args = TrainingArguments(
output_dir="./llm_ai_act_finetuned",
num_train_epochs=3,
per_device_train_batch_size=1,
save_steps=5,
save_total_limit=2,
logging_steps=1,
learning_rate=5e-5,
weight_decay=0.01,
)
[9]:
# Initialisiere den Trainer für das Fine-Tuning
trainer = Trainer(
model=model,
args=training_args,
train_dataset=tokenized_dataset,
data_collator=data_collator,
)
[10]:
# Starte das Fine-Tuning
print("Starte das Fine-Tuning mit AI Act-Daten...")
trainer.train()
print("Fine-Tuning abgeschlossen.")
# Modell auf die CPU schieben und und alle Eingaben auf der CPU verarbeiten
model.to("cpu")
Starte das Fine-Tuning mit AI Act-Daten...
/Users/veit/cusy/trn/ai-tutorial/.venv/lib/python3.13/site-packages/torch/utils/data/dataloader.py:775: UserWarning: 'pin_memory' argument is set as true but not supported on MPS now, device pinned memory won't be used.
super().__init__(loader)
`loss_type=None` was set in the config but it is unrecognized. Using the default loss: `ForCausalLMLoss`.
[6/6 00:02, Epoch 3/3]
| Step | Training Loss |
|---|---|
| 1 | 2.830693 |
| 2 | 3.512209 |
| 3 | 2.700200 |
| 4 | 3.442378 |
| 5 | 2.657775 |
| 6 | 3.438793 |
Fine-Tuning abgeschlossen.
[10]:
GPT2LMHeadModel(
(transformer): GPT2Model(
(wte): Embedding(50265, 768)
(wpe): Embedding(1024, 768)
(drop): Dropout(p=0.0, inplace=False)
(h): ModuleList(
(0-11): 12 x GPT2Block(
(ln_1): LayerNorm((768,), eps=1e-05, elementwise_affine=True)
(attn): GPT2Attention(
(c_attn): Conv1D(nf=2304, nx=768)
(c_proj): Conv1D(nf=768, nx=768)
(attn_dropout): Dropout(p=0.0, inplace=False)
(resid_dropout): Dropout(p=0.0, inplace=False)
)
(ln_2): LayerNorm((768,), eps=1e-05, elementwise_affine=True)
(mlp): GPT2MLP(
(c_fc): Conv1D(nf=3072, nx=768)
(c_proj): Conv1D(nf=768, nx=3072)
(act): NewGELUActivation()
(dropout): Dropout(p=0.0, inplace=False)
)
)
)
(ln_f): LayerNorm((768,), eps=1e-05, elementwise_affine=True)
)
(lm_head): Linear(in_features=768, out_features=50265, bias=False)
)
Test: Juristische Fragen erneut stellen¶
Nun stellen wir wieder dieselben Fragen wie in llm-1, um zu prüfen, ob das feingetunte Modell (llm-2) bessere Antworten liefert.
[11]:
def ask_question(prompt):
input_ids = tokenizer.encode(prompt, return_tensors="pt")
output = model.generate(input_ids, max_length=150, temperature=0.7, do_sample=True)
generated_text = tokenizer.decode(output[0], skip_special_tokens=True)
return generated_text
[12]:
questions = [
"Welche Anforderungen stellt der AI Act an Hochrisiko-KI-Systeme?",
"Was versteht man unter Transparenz gemäß dem AI Act?"
]
[13]:
print("\n=== llm-2: Feingetuntes Modell ===\n")
for q in questions:
print("Frage:", q)
print()
answer = ask_question(q)
print("Antwort:", answer)
print("-" * 300)
=== llm-2: Feingetuntes Modell ===
Frage: Welche Anforderungen stellt der AI Act an Hochrisiko-KI-Systeme?
Antwort: Welche Anforderungen stellt der AI Act an Hochrisiko-KI-Systeme?
Die Sicherheitsanforderungen von AI Act und AI Act sind auf ein Minimum beschränkt.
Sie können die Software als Ganzes nicht ändern oder modifizieren, da nur ein Teil der Nutzer davon betroffen ist.
Dies ist ein Problem bei der Entwicklung von Software, die sich in der Regel nur in den Quellcode einfügt, nicht aber in Maschinencode.
Die Software kann sich auch überschreiben oder zu Fehlfunktionen führen.
Das ist vorprogrammiert, wenn die Nutzung von AI Act, AI Act, AI Act, AI Act, AI Act, AI Act, AI Act, AI Act, AI Act, AI Act
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Frage: Was versteht man unter Transparenz gemäß dem AI Act?
Antwort: Was versteht man unter Transparenz gemäß dem AI Act?
Der Ausschuss nimmt die Bedenken der Experten zur Kenntnis, welche die IAAF zu diesem Thema haben.
Die IAAF hat in der Vergangenheit bereits ein Dokument mit dem Titel “The Compliance of IAAF members“ veröffentlicht.
Darin wird die IAAF aufgefordert, das Vertrauen der Öffentlichkeit in die IAAF zu garantieren und die Überwachung der IAAF zu verstärken.
Dies sind die allgemeinen Merkmale des IAAF-Statuts.
Der Ausschuss ist der Ansicht, dass die IAAF ihre Aufsichtspflicht verletzt hat.
Die IAAF ist jedoch der Meinung, dass die IAAF diese Verpflichtungen nicht verletzt hat.
Die IAAF ist der
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------