Terug naar Blog
Blog

LLM's nauwkeurig afstellen: AI jouw taal leren spreken

Aug 17, 2025·8 min read·Shranya Mahna
#custom AI#domain-specific AI#fine-tuning LLMs#language models#personalized AI
LLM's nauwkeurig afstellen: AI jouw taal leren spreken

Deel 3 van 5: Voorgetrainde modellen aanpassen

Welkom terug! In ons vorige artikel hebben we een RAG-systeem gebouwd dat AI toegang geeft tot uw specifieke informatie. Vandaag gaan we een stap verder — we gaan daadwerkelijk wijzigen hoe een AI-model denkt en reageert door het af te stemmen. Ik zal een open-source model voor dit demovoorbeeld gebruiken.

RAG versus Fine-tuning: wat is het verschil?

Denk er zo over na:

RAG is als iemand een naslagwerk geven. Ze zijn nog steeds dezelfde persoon, maar nu hebben ze toegang tot specifieke informatie bij het beantwoorden van vragen.

Fine-tuning is als iemand naar gespecialiseerde training sturen. U verandert daadwerkelijk hoe ze denken en reageren op basis van uw specifieke vereisten.

Wanneer moet u fine-tuning gebruiken?

Fine-tuning is krachtig, maar het is niet altijd nodig. Overweeg fine-tuning wanneer:

  • U wilt dat de AI een specifieke toon of stijl aanneemt
  • Uw domein gespecialiseerde terminologie of concepten heeft
  • U consistente reacties in veel verschillende scenario's wilt
  • RAG geeft u niet de kwaliteit van reacties die u nodig hebt
  • U voldoende trainingsgegevens hebt (meestal honderden voorbeelden)
  • U wilt dat het model offline of in geïsoleerde omgevingen werkt

Uw omgeving instellen

We gebruiken Google Colab met een T4 GPU voor deze zelfstudie, maar u kunt dit aanpassen voor elke CUDA-compatibele omgeving:

# Install required packages

!pip install bitsandbytes
import os import torch from datasets import Dataset from transformers import ( AutoModelForCausalLM, AutoTokenizer, TrainingArguments, Trainer, BitsAndBytesConfig ) from peft import LoraConfig, get_peft_model, prepare_model_for_kbit_training, PeftModel

Het juiste model kiezen

Voor deze zelfstudie gebruiken we TinyLlama-1.1B, maar hier zijn enkele uitstekende opties voor verschillende behoeften:

# Ultra-light models (good for experimentation)

# model_name = "distilgpt2"                          # 82M parameters

# model_name = "gpt2"                                # 124M parameters

# model_name = "EleutherAI/gpt-neo-125M"            # 125M parameters
# Small but capable models # model_name = "microsoft/DialoGPT-medium" # 355M parameters # model_name = "microsoft/DialoGPT-large" # 762M parameters model_name = "TinyLlama/TinyLlama-1.1B-Chat-v1.0" # 1.1B parameters - choosing this one # For production use (if you have more GPU memory) # model_name = "microsoft/phi-2" # 2.7B parameters # model_name = "stabilityai/stablelm-2-1_6b" # 1.6B parameters

Uw trainingsgegevens voorbereiden

De sleutel tot succesvol fine-tuning zijn trainingsgegevens van hoge kwaliteit. Hier ziet u hoe we ze structureren:

# Sample dataset for MyNextDeveloper (MND)

data = {

"text": [

"User asks: Write a 3-bullet overview of MND.nAssistant: - Remote-first, founded 2022 in Mumbain- Staff augmentation + full-cycle web/API, UI/UX, AI/MLn- Agile/TDD, POSH culture, transparent pricing",

"User asks: Where is MND headquartered?nAssistant: Malabar Hill, Mumbai",

"User asks: What services does MND offer?nAssistant: Staff augmentation, API development, web development, UI/UX design, AI/ML solutions",

"User asks: What is MND's tech stack?nAssistant: Angular, React, Next.js, Node.js, Django, Python, Docker, AWS",

"User asks: What is MND's pricing model?nAssistant: Project pricing starting at $10,000 with hourly rates between $25 and $49",

"User asks: What is MND's mission?nAssistant: To solve the trust gap between startups and engineers by emphasizing empathy, communication, and transparency",

"User asks: What is MND's culture like?nAssistant: Agile practices, test-driven development, and POSH-compliant culture",

"User asks: When was MND founded?nAssistant: 2022"

]

}
# Convert to HuggingFace dataset dataset = Dataset.from_dict(data)

Kernprincipes voor trainingsgegevens:

  • Gebruik consistent formatteren (let op het "User asks:" en "Assistant:" patroon)
  • Houd reacties feitelijk en beknopt
  • Behandel de belangrijkste informatie over uw domein
  • Kwaliteit boven kwantiteit: 50 perfecte voorbeelden beter dan 500 middelmatige

Efficiënt trainen met LoRA en kwantisering

In plaats van het hele model af te stemmen (wat enorm GPU-geheugen vereist), gebruiken we twee efficiëntietechnieken:

1. Kwantisering (4-bit)

Kwantisering is een compressietechniek die wordt gebruikt om grote taalmodellen (LLMs) kleiner en sneller te maken zonder de nauwkeurigheid aanzienlijk te verminderen.

  • Normaal gesproken worden LLM-gewichten opgeslagen als 32-bits drijvende-kommagetallen (FP32).
  • Kwantisering vermindert deze precisie tot 16-bits (FP16/BF16), 8-bits (INT8), 4-bits (INT4) of nog lager.

👉 Voorbeeld:

  • Een model met 10 miljard parameters in FP32 heeft ongeveer 40 GB geheugen nodig.
  • Als we het kwantiseren tot INT8 (8-bits) → heeft het slechts ongeveer 10 GB nodig.
  • Als we naar INT4 (4-bits) gaan → slechts ongeveer 5 GB.

Waarom is het nuttig?

  • Maakt modellen op kleinere GPU's (of zelfs CPU's) werken.
  • Versnelt gevolgtrekking.
  • Lichte afruil in nauwkeurigheid, maar vaak verwaarloosbaar.
# Configure 4-bit quantization

bnb_config = BitsAndBytesConfig(

load_in_4bit=True,

bnb_4bit_quant_type="nf4",

bnb_4bit_use_double_quant=True,

bnb_4bit_compute_dtype=torch.float16

)
# Load model with quantization model = AutoModelForCausalLM.from_pretrained( model_name, quantization_config=bnb_config, device_map="auto", torch_dtype=torch.float16 )

2. LoRA (Low-Rank Adaptation)

LoRA is een parametrisch efficiënte fine-tuning (PEFT) methode.

Normaal gesproken zouden we honderden GB GPU-geheugen nodig hebben om een groot LLM af te stemmen (zoals LLaMA-65B of GPT-J). LoRA lost dit op door:

  • Het originele modelgewicht in te vriezen.
  • Kleine trainbare matrices (low-rank adapters) in de modellagen toe te voegen.
  • Tijdens fine-tuning worden alleen deze kleine matrices bijgewerkt.

👉 Voorbeeld:

  • Volledig afstemmen van een 65B-model kan ongeveer 1 TB GPU-geheugen vereisen.
  • Met LoRA trainen u alleen een paar miljoen parameters → heeft < 20 GB GPU-geheugen nodig.

Waarom is het nuttig?

  • Maakt fine-tuning van enorme LLMs mogelijk op consumentenhard-ware (1–2 GPU's).
  • Eenvoudig om adapters te "samenvoegen" of "ontkoppelen" → u kunt snel van taak wisselen.
  • Bereikt vaak prestaties dicht bij volledig fine-tuning.
# Configure LoRA based on model architecture

if "TinyLlama" in model_name or "Llama" in model_name:

target_modules = ["q_proj", "k_proj", "v_proj", "o_proj"]

elif "gpt" in model_name.lower() or "DialoGPT" in model_name:

target_modules = ["c_attn", "c_proj"]

else:

target_modules = ["q_proj", "v_proj"]
lora_config = LoraConfig( r=8, # Rank of adaptation lora_alpha=16, # LoRA scaling parameter target_modules=target_modules, lora_dropout=0.05, bias="none", task_type="CAUSAL_LM" ) # Apply LoRA to the model model = get_peft_model(model, lora_config) model.print_trainable_parameters()

We trainen slechts 0,2% van de parameters!

Het model trainen

# Tokenize the data

def tokenize_function(examples):

tokenized_inputs = tokenizer(

examples["text"],

truncation=True,

padding="max_length",

max_length=512,

return_tensors="pt"

)

# Create labels by copying input tokens

tokenized_inputs["labels"] = tokenized_inputs["input_ids"].clone()

return tokenized_inputs
# Split dataset train_dataset = dataset.select(range(8)) eval_dataset = dataset.select(range(8, 11)) # Apply tokenization train_dataset = train_dataset.map(tokenize_function, batched=True) eval_dataset = eval_dataset.map(tokenize_function, batched=True) # Configure training training_args = TrainingArguments( output_dir="./mnd-finetune-outputs", num_train_epochs=5, per_device_train_batch_size=4, per_device_eval_batch_size=4, gradient_accumulation_steps=2, warmup_steps=10, learning_rate=3e-4, weight_decay=0.01, logging_steps=1, save_steps=30, eval_strategy="steps", eval_steps=15, save_total_limit=2, load_best_model_at_end=True, fp16=True, report_to=None # Disable wandb logging ) # Create trainer and start training trainer = Trainer( model=model, args=training_args, train_dataset=train_dataset, eval_dataset=eval_dataset, tokenizer=tokenizer, ) print("Starting training...") trainer.train() # Save the adapter adapter_dir = "./mnd-finetune-outputs/final_adapter" model.save_pretrained(adapter_dir) tokenizer.save_pretrained(adapter_dir)

Het afgestemde model testen

def load_model_for_inference():

"""Load the fine-tuned model for inference"""

# Load base model

base_model = AutoModelForCausalLM.from_pretrained(

model_name,

quantization_config=bnb_config,

device_map="auto",

torch_dtype=torch.float16

)

# Load the fine-tuned adapter

model = PeftModel.from_pretrained(base_model, adapter_dir)

model = model.merge_and_unload()

# Load tokenizer

tokenizer = AutoTokenizer.from_pretrained(adapter_dir)

return model, tokenizer

def generate_response(model, tokenizer, prompt, max_length=256, temperature=0.7):

"""Generate response for a given prompt"""

formatted_prompt = f"User asks: {prompt}nAssistant:"

inputs = tokenizer.encode(formatted_prompt, return_tensors="pt")

inputs = inputs.to(model.device)

with torch.no_grad():

outputs = model.generate(

inputs,

max_length=max_length,

temperature=temperature,

top_p=0.9,

do_sample=True,

pad_token_id=tokenizer.eos_token_id,

repetition_penalty=1.1

)

response = tokenizer.decode(outputs[0], skip_special_tokens=True)

assistant_response = response.split("Assistant:")[-1].strip()

return assistant_response

# Load fine-tuned model and test

model, tokenizer = load_model_for_inference()

test_prompts = [

"What makes MND different from other development companies?",

"Can you tell me about MND's team?",

"What is the company culture at MND?"

]

for prompt in test_prompts:

response = generate_response(model, tokenizer, prompt)

print(f"Q: {prompt}")

print(f"A: {response}n")

Google Colab

Hier is de Google Colab-koppeling voor dit artikel dat u in één klik kunt uitvoeren: koppeling

De werkelijke kosten

In tegenstelling tot commerciële API's zijn uw kosten voornamelijk:

  1. Initiële configuratie: GPU-tijd voor training
  2. Opslag: Modelgewichten (ongeveer 4GB voor TinyLlama met LoRA-adapters)
  3. Gevolgtrekking: Uw eigen hardware of cloud GPU-exemplaren

Voor een klein model zoals TinyLlama kunt u gevolgtrekking uitvoeren op:

  • Google Colab (gratis laag met beperkingen)
  • AWS t3.medium met GPU (ongeveer $0,05/uur)
  • Uw eigen hardware (RTX 3060 of beter)

Best practices uit echte ervaring

1. Begin klein en schaal op Begin met distilgpt2 of gpt2 om uw gegevens en proces te testen, ga dan over op grotere modellen.

2. Monitor op overfitting Met kleine datasets kunnen modellen onthouden in plaats van leren. Controleer uw evaluatieverlies.

3. Formaatconsistentie is kritiek De exacte indeling van uw trainingsgegevens is enorm belangrijk. Wees consistent met leestekens, spatiëring en structuur.

4. Test met onzichtbare vragen Test altijd met vragen die niet in uw trainingsgegevens voorkomen om ervoor te zorgen dat gegeneraliseerd.

5. Sla regelmatige controlepunten op Training kan worden onderbroken. Sla regelmatig op en test tussenliggende controlepunten.

Veelvoorkomende fouten en oplossingen

Probleem: Het model genereert repetitieve of onzinnige tekst Oplossing: Verlaag de leersnelheid, verhoog de regularisatie, of verbeter de kwaliteit van trainingsgegevens

Probleem: Het model vergeet algemene kennis Oplossing: Voeg enkele algemene voorbeelden toe aan uw trainingsgegevens of gebruik een groter basismodel

Probleem: Reacties zijn te algemeen Oplossing: Maak uw trainingsvoorbeelden specifieker en gedetailleerder

Probleem: GPU-geheugen problemen Oplossing: Verklein batchgrootte, gebruik meer agressieve kwantisering, of gradiëntcontrole

Combineren met RAG

Hier is het krachtige onderdeel: u kunt uw afgestemde model combineren met RAG voor het beste van beide werelden:

  1. Stem af voor domeinbegrip, toon en algemene bedrijfskennis
  2. Gebruik RAG voor actuele informatie, specifieke documenten of gedetailleerde technische specificaties

Dit geeft u een model dat "denkt" zoals uw bedrijf maar toegang heeft tot actuele informatie.

Wat volgt

In ons volgende artikel gaan we helemaal custom — we bouwen een taalmodel van nul af, helemaal van u, draaiend op uw hardware met uw gegevens.

Fine-tuning van open-source modellen geeft u ongekende controle over uw AI-assistent. U kunt ervoor zorgen dat het uw domein begrijpt, in uw stem spreekt en nooit uw gegevens naar derden verzendt. Met moderne efficiëntietechnieken zoals LoRA en kwantisering is het toegankelijker dan ooit.

De toekomst van AI gaat niet alleen over het gebruik van iemand anders model — het gaat erom AI echt van u te maken.


Komend: Artikel 4 — "Het bouwen van uw eigen taalmodel: klein maar krachtig"