Wat is Generative AI, Kort Uitgelegd
Traditionele machine learning modellen zijn discriminatief: ze voorspellen een label of waarde bij een gegeven input — fraude ja/nee, een churn-kans, een omzetprognose. Generative AI-modellen doen iets fundamenteel anders: ze leren de onderliggende verdeling van hun trainingsdata en genereren daaruit nieuwe, plausibele voorbeelden — tekst, code, afbeeldingen, of synthetische tabeldata.
Large Language Models zoals GPT-4 en Claude zijn de bekendste vorm, maar de familie is breder: diffusiemodellen genereren afbeeldingen, en generatieve tabulaire modellen genereren synthetische datasets. Voor data engineers zijn vooral twee toepassingen relevant: Retrieval-Augmented Generation (RAG) — een LLM laten antwoorden op basis van jouw eigen data — en synthetic data generation voor test- en ontwikkelomgevingen. Voor de basis van LLM's zelf, zie Wat is een LLM?
In één zin
Generative AI verandert de rol van de data engineer niet fundamenteel — het voegt nieuwe pipeline-componenten toe (embeddings, vector stores, generatieve modellen) bovenop dezelfde discipline van betrouwbare, geteste en gemonitorde datapipelines.
Waarom Generative AI Relevant Is voor Data Engineers
Vier concrete raakvlakken tussen generative AI en het dagelijkse werk van een data engineer:
RAG-pipelines bouwen
- Documenten en data ophalen, chunken, embedden
- Vector database vullen en actueel houden
- Klassieke ETL/ELT-discipline, nieuwe componenten
Synthetic data generation
- Test- en dev-omgevingen zonder productiedata
- Representatieve datasets delen zonder privacyrisico
- Schaarse edge cases aanvullen voor testing
Pipeline- en codegeneratie
- SQL- en dbt-modellen genereren op basis van schema
- Data quality-tests automatisch voorstellen
- Zie ook Datakwaliteit & Testen
Metadata & documentatie
- Kolombeschrijvingen genereren bij ingestion
- Data dictionaries automatisch actueel houden
- Sluit aan op Data Governance
RAG-Architectuur: De Pipeline Achter het Antwoord
Een RAG-systeem bestaat uit twee losse pipelines: een ingestion-pipeline die de kennisbron omzet naar doorzoekbare vectoren, en een query-pipeline die bij elke vraag de meest relevante fragmenten ophaalt en aan het LLM meegeeft. De ingestion-pipeline is het domein van de data engineer.
1. Chunking
Documenten worden opgesplitst in kleinere fragmenten (meestal 200-800 tokens, met overlap) omdat embeddingmodellen en LLM-context een limiet hebben, en omdat kleinere chunks precisere retrieval opleveren.
2. Embedding
Elke chunk wordt omgezet naar een vector (een lijst van getallen) die de semantische betekenis representeert, via een embeddingmodel.
3. Opslag in een vector database
Vectoren worden opgeslagen met een index die snelle similarity search mogelijk maakt (approximate nearest neighbor), samen met de originele tekst en metadata.
4. Retrieval & generatie
Bij een vraag wordt die eerst geëmbed, de meest gelijkende chunks worden opgehaald, en samen met de vraag als context aan het LLM gegeven om een antwoord te genereren.
# Vereenvoudigde ingestion-pipeline: chunken, embedden, opslaan in pgvector import psycopg2 from openai import OpenAI client = OpenAI() def chunk_text(text: str, chunk_size: int = 500, overlap: int = 50) -> list[str]: """Splits tekst in overlappende chunks van ~chunk_size tekens.""" chunks = [] start = 0 while start < len(text): end = start + chunk_size chunks.append(text[start:end]) start += chunk_size - overlap return chunks def embed_and_store(document_id: str, text: str, conn): """Chunkt een document, genereert embeddings en slaat ze op in pgvector.""" chunks = chunk_text(text) response = client.embeddings.create( model="text-embedding-3-small", input=chunks, ) with conn.cursor() as cur: for i, (chunk, embedding) in enumerate(zip(chunks, response.data)): cur.execute( """INSERT INTO document_chunks (document_id, chunk_index, content, embedding) VALUES (%s, %s, %s, %s)""", (document_id, i, chunk, embedding.embedding), ) conn.commit()
Waarom dit een data engineering probleem is
De kwaliteit van een RAG-systeem hangt minder af van het LLM en meer van de ingestion-pipeline: chunk-grootte, actualiteit van de index, en of verwijderde of gewijzigde brondocumenten correct worden bijgewerkt in de vector store. Dit zijn dezelfde problemen als bij een klassieke incremental load-pipeline, alleen met vectoren in plaats van rijen.
Vector Databases: Een Vergelijking
De keuze voor een vector database hangt vooral af van wat je al gebruikt: een losstaand systeem toevoegen, of vector search inbouwen in een platform dat je al hebt.
| Oplossing | Type | Sterk in | Wanneer kiezen |
|---|---|---|---|
| pgvector | PostgreSQL-extensie | Geen nieuw systeem, transactionele consistentie | Je gebruikt al Postgres en volumes zijn beperkt (< enkele miljoenen vectoren) |
| Pinecone | Managed vector database | Schaal, lage latency, weinig beheer | Productie-RAG op grote schaal zonder eigen infrastructuur |
| Weaviate | Open-source vector database | Hybrid search (keyword + vector), self-hosting | Je wilt controle over hosting en geavanceerde filtering |
| Snowflake Cortex Search | Ingebouwd in Snowflake | Geen aparte pipeline nodig als data al in Snowflake staat | Je bent al een Snowflake-shop en wilt RAG zonder dataduplicatie |
| Databricks Vector Search | Ingebouwd in Databricks | Automatische synchronisatie met Delta-tabellen | Je bronnen zijn al Delta-tabellen op Databricks |
De laatste twee opties zijn vaak de pragmatische keuze: als je data al in Snowflake of Databricks staat, voorkom je een aparte synchronisatiepipeline door vector search binnen hetzelfde platform te gebruiken.
Synthetic Data Generation voor Test- en Ontwikkelomgevingen
Een ander, minder besproken toepassingsgebied: generatieve modellen gebruiken om synthetische data te produceren die statistisch lijkt op productiedata, zonder de gevoelige waarden te bevatten. Dit is met name waardevol voor test- en ontwikkelomgevingen, waar productiedata om privacyredenen niet zomaar gekopieerd mag worden.
# Synthetische klantdata genereren met SDV (Synthetic Data Vault) from sdv.metadata import SingleTableMetadata from sdv.single_table import GaussianCopulaSynthesizer import pandas as pd # 1. Leer de statistische structuur van de echte (productie)dataset real_data = pd.read_csv("productie_klanten_sample.csv") metadata = SingleTableMetadata() metadata.detect_from_dataframe(real_data) synthesizer = GaussianCopulaSynthesizer(metadata) synthesizer.fit(real_data) # 2. Genereer een nieuwe, synthetische dataset met dezelfde verdelingen synthetic_data = synthesizer.sample(num_rows=50_000) # 3. Valideer dat statistische eigenschappen behouden zijn from sdv.evaluation.single_table import evaluate_quality quality_report = evaluate_quality(real_data, synthetic_data, metadata) print(f"Kwaliteitsscore: {quality_report.get_score():.2%}")
Deze aanpak — leren van de verdeling en daaruit nieuwe rijen samplen — is conceptueel hetzelfde principe als een LLM dat tekst genereert, alleen toegepast op tabulaire data. Het resultaat: realistische test-fixtures, geen persoonsgegevens, en dezelfde edge cases (nulls, outliers, correlaties tussen kolommen) als in productie.
Embedding-Pipelines in Productie
Zodra een RAG-pipeline productie ingaat, gelden dezelfde eisen als voor elke andere datapipeline: orchestratie, monitoring en een strategie voor incrementele updates.
- Incrementele re-embedding: embed alleen gewijzigde of nieuwe documenten, niet de hele corpus bij elke run — vergelijkbaar met incremental load vs full load.
- Orchestratie: een embedding-job past prima in bestaande tooling zoals Airflow, Azure Data Factory of dbt Python-modellen — het is functioneel een transformatiestap, geen apart AI-systeem.
- Kostenbeheersing: embedding-API's rekenen per token; batch documenten en cache embeddings van ongewijzigde chunks om herhaalde kosten te voorkomen.
- Versiebeheer van embeddingmodellen: een modelupgrade kan de vectorruimte veranderen — bij een modelwissel moet de hele index opnieuw worden gegenereerd, niet alleen de nieuwe documenten.
Veelgemaakte fout
Embeddings van twee verschillende modellen (of modelversies) door elkaar in dezelfde index opslaan. De vectorruimtes zijn niet compatibel, waardoor similarity search stille, moeilijk te debuggen kwaliteitsverlies oplevert. Behandel een modelwissel als een breaking schema change, met een volledige herindexering.
Risico's en Beperkingen
Hallucinatie, ook met RAG
- RAG vermindert hallucinatie, elimineert het niet
- Slechte retrieval leidt tot slechte antwoorden
- Oplossing: citaties naar brondocumenten tonen
Data leakage via prompts
- Gevoelige data in de context van externe API's
- Logging bij LLM-providers
- Zie ook Data Security
Evaluatie is lastig
- Geen simpele accuracy-metric zoals bij classificatie
- Nodig: retrieval-precisie én antwoordkwaliteit apart meten
- Oplossing: golden-question test sets met menselijke review
RAG, Fine-Tuning of Gewoon Prompten?
- Kennis verandert vaak of is organisatie-specifiek? Kies RAG — je werkt alleen de index bij, niet het model.
- Je wilt structureel ander gedrag, toon of output-formaat op een stabiele taak? Fine-tuning is dan effectiever dan steeds grotere prompts.
- De taak is generiek en het model heeft de kennis al? Gewone prompt engineering volstaat — begin daar altijd eerst mee.
- Je hebt beide nodig — domeinkennis én consistente output? RAG en fine-tuning zijn te combineren: fine-tune voor formaat/toon, RAG voor actuele feiten.
Vuistregel
Begin met prompt engineering. Voeg RAG toe zodra het model feitelijk misgrijpt op jouw eigen data. Overweeg fine-tuning pas als prompting en RAG samen nog steeds niet het gewenste, consistente gedrag opleveren — het is de duurste en minst flexibele optie van de drie.
Conclusie
Generative AI voegt voor data engineers vooral nieuwe pipeline-componenten toe — chunking, embeddings, vector databases, synthetische datageneratie — bovenop dezelfde fundamenten die al gelden voor elke betrouwbare datapipeline: incrementele verwerking, versiebeheer, monitoring en testen. Wie al ETL/ELT-pipelines bouwt, heeft het grootste deel van de benodigde vaardigheden al in huis.
Wil je hulp bij het ontwerpen van een RAG-architectuur of een synthetic data-strategie voor jouw organisatie? Neem contact op. Bekijk ook Wat is een LLM? voor de basis van de modellen zelf, en het gratis Data Engineering Handboek voor de bredere pipeline-fundamenten.
Veelgestelde vragen
Wat is het verschil tussen generative AI en traditionele machine learning?
Traditionele (discriminatieve) modellen voorspellen een label of waarde op basis van input. Generative AI-modellen genereren nieuwe content — tekst, code, afbeeldingen of synthetische data — door de verdeling van de trainingsdata te leren en daaruit nieuwe voorbeelden te samplen.
Wat is RAG (Retrieval-Augmented Generation)?
RAG haalt eerst relevante fragmenten op uit een vector database en geeft die als context mee in de prompt, voordat het LLM een antwoord genereert. Dit vermindert hallucinaties en maakt actuele, organisatie-specifieke antwoorden mogelijk zonder het model te hertrainen.
Wat doet een data engineer in een RAG-pipeline?
De ingestion-pipeline: documenten ophalen, chunken, embedden, opslaan in een vector database en de index actueel houden. Functioneel een klassieke ETL/ELT-pipeline met een embeddingmodel en vector store als extra componenten.
Wat is synthetic data generation en wanneer gebruik je het?
Het genereren van kunstmatige data die statistisch lijkt op een echte dataset, zonder de originele gevoelige waarden. Handig voor test- en ontwikkelomgevingen, het delen van representatieve datasets zonder privacyrisico, en het aanvullen van schaarse trainingsdata.
Wanneer kies je voor RAG en wanneer voor fine-tuning?
RAG wanneer kennis vaak verandert of organisatie-specifiek is — je werkt alleen de index bij. Fine-tuning wanneer je gedrag, toon of formaat structureel wilt aanpassen op een stabiele taak. RAG is voor de meeste toepassingen de eerste keuze vanwege lagere kosten en makkelijker onderhoud.