CBS StatLine Mechanisme
SBI RAG Pipeline
AI Chat Engine
Research Tools
Volledige Architectuur
CBS StatLine
Officiele Nederlandse statistieken via OData API — gekoppeld aan SBI-codes
Wat is CBS StatLine? Het CBS (Centraal Bureau voor de Statistiek) biedt alle officiele Nederlandse statistieken gratis via een OData REST API. Per SBI-code kun je branchestatistieken, omzetdata, personeelscijfers, marktgroottes en regionale data ophalen. Dit maakt per-bedrijf benchmarking mogelijk zonder betaalde databronnen.
CBS OData API — Onderzoeksmechanisme
opendata.cbs.nl/ODataApi/odata/[dataset]/[filter]
✓ GRATIS
OData v4
Stap 1 · SBI → Dataset mapping
Input: SBI code 4100
// Zoek relevante CBS datasets:
GET /ODataCatalog/Tables
?$filter=contains(ShortDescription,
'bouw')
Relevante datasets:
→ 83931NED (Omzet bouw)
→ 81573NED (Werknemers bouw)
→ 84583NED (Marktprijzen)
→ 37308 (Regionale stats)
// Zoek relevante CBS datasets:
GET /ODataCatalog/Tables
?$filter=contains(ShortDescription,
'bouw')
Relevante datasets:
→ 83931NED (Omzet bouw)
→ 81573NED (Werknemers bouw)
→ 84583NED (Marktprijzen)
→ 37308 (Regionale stats)
Stap 2 · Data ophalen per SBI
// Omzetdata bouwnijverheid:
GET /odata/83931NED/UntypedDataSet
?$filter=BedrijfstakkenBranchesSBI
eq 'A1010004' (= SBI 41)
&$select=Perioden,Omzet,Bedrijven
Output:
→ Gemiddelde omzet per bedrijf
→ Groeipercentage YoY
→ Aantal actieve bedrijven NL
GET /odata/83931NED/UntypedDataSet
?$filter=BedrijfstakkenBranchesSBI
eq 'A1010004' (= SBI 41)
&$select=Perioden,Omzet,Bedrijven
Output:
→ Gemiddelde omzet per bedrijf
→ Groeipercentage YoY
→ Aantal actieve bedrijven NL
Stap 3 · Regionale benchmark
// Rijswijk = gemeente Rijswijk
// CBS regiocodes:
GET /odata/37308/Observations
?$filter=RegioS eq 'GM0603'
and Perioden eq '2024JJ00'
Output:
→ Lokale marktgrootte
→ Bouw-activiteit regio
→ Vergelijking landelijk gem.
// CBS regiocodes:
GET /odata/37308/Observations
?$filter=RegioS eq 'GM0603'
and Perioden eq '2024JJ00'
Output:
→ Lokale marktgrootte
→ Bouw-activiteit regio
→ Vergelijking landelijk gem.
Stap 4 · AI Synthesis
// CBS data → Claude prompt:
"Analyseer dit bedrijf op basis
van CBS branchedata SBI 4100:
{cbs_data_json}
Vergelijk met bedrijf:
{kvk_data}
Genereer: marktpositie,
groeipotentieel, risico-score."
"Analyseer dit bedrijf op basis
van CBS branchedata SBI 4100:
{cbs_data_json}
Vergelijk met bedrijf:
{kvk_data}
Genereer: marktpositie,
groeipotentieel, risico-score."
// === VOLLEDIGE CBS STATLINE INTEGRATIE === //
// 1. Dataset ontdekking voor SBI 4100
const discoverCBSDatasets = async (sbiCode) => {
const res = await fetch(
`https://opendata.cbs.nl/ODataCatalog/Tables?$filter=
contains(ShortDescription,'${sbiToKeyword(sbiCode)}')`
);
return res.json(); // → array van relevante datasets
};
// 2. Branche-omzetdata ophalen
const getCBSBrancheData = async (datasetId, sbiFilter) => {
const url = `https://opendata.cbs.nl/ODataApi/odata/
${datasetId}/UntypedDataSet
?$filter=${sbiFilter}
&$select=Perioden,Omzet,AantalBedrijven`;
const data = await fetch(url).then(r => r.json());
return data.value; // → [{Perioden, Omzet, AantalBedrijven}]
};
// 3. Regionale data (gemeente Rijswijk = GM0603)
const getCBSRegioData = async (gemeenteCode) => {
return fetch(
`https://opendata.cbs.nl/ODataApi/odata/37308/Observations
?$filter=RegioS eq '${gemeenteCode}'
&$orderby=Perioden desc&$top=5`
).then(r => r.json());
};
// 4. Benchmark berekening
const benchmarkBedrijf = (bedrijf, cbsData) => ({
omzetPositie: bedrijf.omzet / cbsData.gemOmzet,
groeiverschil: bedrijf.groei - cbsData.brancheGroei,
marktaandeel: bedrijf.omzet / cbsData.totaleMarkt * 100,
regioScore: cbsData.regioActiviteit / cbsData.nationaalGem
});
| CBS Dataset | ID | Methode | Gebruik | Update | Kosten |
|---|---|---|---|---|---|
| Bouwnijverheid omzet | 83931NED | GET | Branche benchmark | Kwartaal | Gratis |
| Werkzame personen SBI | 81573NED | GET | Werkgelegenheid | Jaar | Gratis |
| Regionale kerncijfers | 70072NED | GET | Gemeente benchmark | Jaar | Gratis |
| Bedrijfsdemografie | 81589NED | GET | Marktgroei | Jaar | Gratis |
| Conjunctuurmeter bouw | 83625NED | GET | Marktsentiment | Maand | Gratis |
| Prijsindex nieuwbouw | 83662NED | GET | Prijsbenchmark | Kwartaal | Gratis |
SBI RAG Index
Retrieval-Augmented Generation op de volledige SBI-classificatietabel (1.847 codes)
Waarom RAG voor SBI? De SBI-tabel (Standaard Bedrijfsindeling) bevat 1.847 codes met beschrijvingen, maar AI-modellen kennen deze niet altijd precies. Door alle SBI-codes + beschrijvingen + branche-kenmerken te vectoriseren in een lokale database (Chroma/Qdrant), kan het systeem razendsnel de meest relevante SBI context ophalen voor elke bedrijfsanalyse — zonder de AI te "hallucineren" over branchedetails.
RAG Pipeline — SBI Kennisbank
Embed → Index → Query → Augment → Generate
Vector DB
Embeddings
1
Document Ingestie — SBI brondata
Bronnen: CBS SBI-2008 PDF + website · KvK SBI lookup tabel · RVO branchebeschrijvingen
Per SBI code: code · omschrijving · voorbeeldbedrijven · typische diensten · doelgroepen · risicofactoren
Chunking strategie: 1 document per SBI code (~300-500 tokens) + metadata: sector, divisie, groep, klasse
Per SBI code: code · omschrijving · voorbeeldbedrijven · typische diensten · doelgroepen · risicofactoren
Chunking strategie: 1 document per SBI code (~300-500 tokens) + metadata: sector, divisie, groep, klasse
2
Vectorisatie — text-embedding-3-large
Model: OpenAI text-embedding-3-large (3072 dimensies) of lokaal: all-MiniLM-L6-v2 (384d, gratis)
1.847 SBI codes × embedding → opslaan in Chroma (lokaal) of Qdrant (cloud)
Eenmalige kosten: ~$0.04 voor volledige SBI tabel · Daarna: gratis queries
1.847 SBI codes × embedding → opslaan in Chroma (lokaal) of Qdrant (cloud)
Eenmalige kosten: ~$0.04 voor volledige SBI tabel · Daarna: gratis queries
3
Query Processing — Semantisch zoeken
Input: "onderhoudsbedrijf gevelbekleding utiliteitsbouw Rijswijk"
→ embed query → cosine similarity search in vectorstore → top-5 SBI matches terugkrijgen
Hybrid search: BM25 (keyword) + vector similarity gecombineerd voor beste recall
→ embed query → cosine similarity search in vectorstore → top-5 SBI matches terugkrijgen
Hybrid search: BM25 (keyword) + vector similarity gecombineerd voor beste recall
4
Context Augmentation — Prompt samenstelling
Ophalen top-5 chunks → injecteren in Claude prompt als context
Prompt structuur: [system: jij bent expert SBI-analyst] + [context: {sbi_chunks}] + [vraag: {user_query}]
Result: Claude antwoordt met precieze SBI-kennis, geen hallucinaties over branchedetails
Prompt structuur: [system: jij bent expert SBI-analyst] + [context: {sbi_chunks}] + [vraag: {user_query}]
Result: Claude antwoordt met precieze SBI-kennis, geen hallucinaties over branchedetails
5
Output + Citaties — Traceerbaar antwoord
Elke claim wordt teruggeleid naar bronchunk + SBI-code
Output: {antwoord, bronnen: [{sbi, score, snippet}], confidence_score}
Re-ranking: Cohere Rerank API (optioneel) voor betere precisie bij complexe queries
Output: {antwoord, bronnen: [{sbi, score, snippet}], confidence_score}
Re-ranking: Cohere Rerank API (optioneel) voor betere precisie bij complexe queries
// === SBI RAG SYSTEEM IMPLEMENTATIE === //
// STAP 1: SBI data inladen en chunken
async function ingestSBIData() {
const sbiTable = await fetchSBIClassification();
const chunks = sbiTable.map(entry => ({
id: entry.code,
text: `SBI ${entry.code}: ${entry.omschrijving}
Sector: ${entry.sector}
Typische bedrijven: ${entry.voorbeelden}
Diensten: ${entry.diensten}
Doelgroepen: ${entry.doelgroepen}
Naastgelegen SBI's: ${entry.verwant}`,
metadata: { code: entry.code, sector: entry.sector, niveau: entry.niveau }
}));
await chromaCollection.add({
ids: chunks.map(c => c.id),
documents: chunks.map(c => c.text),
metadatas: chunks.map(c => c.metadata),
embeddings: await embedBatch(chunks.map(c => c.text))
});
}
// STAP 2: RAG query voor een bedrijf
async function querySBIContext(bedrijfsOmschrijving, topK = 5) {
const queryEmbedding = await embed(bedrijfsOmschrijving);
const results = await chromaCollection.query({
queryEmbeddings: [queryEmbedding],
nResults: topK,
where: { niveau: { "$in": ["klasse", "groep"] } }
});
return results.documents[0].map((doc, i) => ({
sbi: results.metadatas[0][i].code,
tekst: doc,
score: results.distances[0][i],
sector: results.metadatas[0][i].sector
}));
}
// STAP 3: Augmented generation via Claude
async function analyseMetRAG(bedrijf, vraag) {
const sbiContext = await querySBIContext(
`${bedrijf.naam} ${bedrijf.activiteiten} ${bedrijf.locatie}`
);
const prompt = `Je bent een expert in de Nederlandse bedrijfsclassificatie.
BRANCHE CONTEXT (uit SBI kennisbank):
${sbiContext.map(s => `[SBI ${s.sbi} - score ${s.score.toFixed(2)}]: ${s.tekst}`).join('\n\n')}
BEDRIJF: ${JSON.stringify(bedrijf)}
VRAAG: ${vraag}
Baseer je antwoord ALLEEN op de bovenstaande SBI context.
Citeer welke SBI-codes je gebruikt (formaat: [SBI XXXX]).`;
return claudeComplete(prompt);
}
AI Chat Engine
Hoe werkt de chat — welke bronnen worden gecombineerd, hoe worden tools aangeroepen
Orchestratie model: De AI chat gebruikt tool-use / function calling. Claude beslist zelf welke tools te gebruiken op basis van de vraag. Per vraag worden automatisch 1-6 databronnen bevraagd, gecombineerd en gesynthetiseerd in een antwoord met bronvermelding.
Chat Mechanisme — Tool Orchestratie
Vraag → Tool selectie → Parallel execution → Synthesis → Antwoord
Tool 1 · KvK Lookup
// Trigger: bedrijfsnaam/kvk-nr
function kvkLookup(query) {
→ GET KvK API
→ naam, adres, SBI
→ nevenactiviteiten
→ bestuurders
}
Kosten: gratis (1 call)
function kvkLookup(query) {
→ GET KvK API
→ naam, adres, SBI
→ nevenactiviteiten
→ bestuurders
}
Kosten: gratis (1 call)
Tool 2 · CBS StatLine
// Trigger: branche/markt vragen
function cbsQuery(sbi, regio) {
→ Dataset discovery
→ Omzet + groei data
→ Regionale benchmark
→ Conjunctuurdata
}
Kosten: gratis
function cbsQuery(sbi, regio) {
→ Dataset discovery
→ Omzet + groei data
→ Regionale benchmark
→ Conjunctuurdata
}
Kosten: gratis
Tool 3 · SBI RAG
// Trigger: altijd (achtergrond)
function sbiRAGQuery(tekst) {
→ Embed query
→ Vector similarity
→ Top-5 SBI chunks
→ Branche context
}
Kosten: ~$0.0001
function sbiRAGQuery(tekst) {
→ Embed query
→ Vector similarity
→ Top-5 SBI chunks
→ Branche context
}
Kosten: ~$0.0001
Tool 4 · Google Places
// Trigger: locatie/GMB vragen
function placesSearch(naam, loc) {
→ Nearby competitors
→ GMB rating + reviews
→ Openingstijden
→ Foto's, website
}
Kosten: ~€0.03/call
function placesSearch(naam, loc) {
→ Nearby competitors
→ GMB rating + reviews
→ Openingstijden
→ Foto's, website
}
Kosten: ~€0.03/call
AI Research Chat
claude-sonnet · tools: kvk, cbs, sbi-rag, places, rvo
Bronnen:
KvK API
CBS StatLine
SBI RAG
Google Places
RVO Subsidies
Research Tools
Beschikbare tools die de AI automatisch kan inzetten
CBS Branche Benchmark
STATISTIEK
Vergelijk een bedrijf met CBS branchegemiddelden: omzet, groei, personeel, regionale positie.
CBS OData
SBI RAG
GRATIS
KvK Bedrijfsanalyse
BEDRIJFSDATA
Zoek op KvK-nummer of naam. Krijg SBI-codes, vestigingen, bestuurders en activiteiten.
KvK API
SBI RAG
GRATIS
RVO Subsidie Finder
SUBSIDIES
Vind relevante subsidies op basis van SBI-code, locatie en bedrijfstype via RVO open data.
RVO Data
SBI RAG
AI Match
GRATIS
Concurrentie Radar
MARKTANALYSE
Vind concurrenten in dezelfde regio + SBI-code via Google Places, KvK en CBS data.
KvK
Places API
CBS
Markt Trend Analyse
TRENDS
Analyseer markttrends per branche: groei, conjunctuur, seizoenspatronen uit CBS tijdreeksen.
CBS TimeSeries
AI Analyse
GRATIS
Geo Markt Explorer
GEOGRAFIE
Combineer PDOK geodata + CBS regionale cijfers voor geografische marktanalyse per gemeente.
PDOK
CBS Regio
GRATIS
Volledige Architectuur
Hoe alle componenten samenwerken in het AI Research platform
System Architecture — Data Flow
Gebruiker
→
AI Chat Engine
→
Tool Router
→
KvK API
+
CBS OData
+
SBI RAG
+
Places API
→
AI Synthesis
→
Antwoord + Bronnen
Gratis databronnen
✓ CBS StatLine (OData v4)
✓ KvK Open Data API
✓ RVO Subsidie Database
✓ PDOK Geodata (Kadaster)
✓ OpenStreetMap Nominatim
✓ Wikidata SPARQL
✓ SBI RAG Index (lokaal)
✓ KvK Open Data API
✓ RVO Subsidie Database
✓ PDOK Geodata (Kadaster)
✓ OpenStreetMap Nominatim
✓ Wikidata SPARQL
✓ SBI RAG Index (lokaal)
Betaalde services
• Claude API (analyse, synthesis)
• OpenAI Embeddings (vectorisatie)
• Google Places API (locatie)
• Cohere Rerank (optioneel)
Geschatte kosten per analyse:
~€0.02-0.05 per bedrijfsanalyse
• OpenAI Embeddings (vectorisatie)
• Google Places API (locatie)
• Cohere Rerank (optioneel)
Geschatte kosten per analyse:
~€0.02-0.05 per bedrijfsanalyse