# DataSummarizer: Vinnige lokale dataprofielen

<!--category-- Data Analysis, DuckDB, C#, LLM -->
<datetime class="hidden">2025-12-22T18:30</datetime>

De meeste “chat met je data”systemen maken dezelfde foutenM SK2 ze behandelen een LLM alsof het een database is.

Ze schuiven rijtjes in context.,, ze inbedden stukjes, ,, of ze kiezen representatieve voorbeelden en hopen dat het model de structuur kan infereren,,, kwaliteit,,, en waarheid uit anekdotes,M SK6 Het werkt goed genoeg om te demonstreren, -, en dan ineenstort, onder de schaal.,, privacybeperkingen,MSC9, of fundamentele vragen zoals: "Is deze kolom afval?"

**DataSummarizer gebruikt de tegenovergestelde aanpak.**

Het berekent een **deterministische statistisch profiel.** van je dataset met DuckDB, blijft dat profiel, en *optioneel.* Laaders een **Lokale LLM** Bovenop om die feiten te interpreteren, voorstellen veilig te lezen- alleen SQL , en leidend te volgenM SK3 analyse nagaanMSC4 De zware lifting is numeriekMST5 auditeerbaarM ST6 en snelM st7 De LLM is bewust beperkt tot redeneren en verhaallijnenMst8

Het resultaat is:

* fast, private profiling
* betrouwbare automatisering (`tool` JSON)
* Gebouwd-in drift-detectie
* En iets wat de meeste systemen niet kunnen doen. **PII-free synthetische datasets die statistische vorm behouden**

Alles zonder ruwe rijtjes naar een model te sturen.

Dit bouwt rechtstreeks op **[Hoe analyseer je grote CSV-bestanden met lokale LLMs in C#](/blog/analysing-large-csv-files-with-local-llms)**, die het kernidee invoerde:

> **LLMs moeten vragen genereren, geen gegevens verbruiken.**

Dit artikel duwt dat idee verder.

* don’feed de LLM-rijen niet
* don’doe het zelfs niet aan te voeden “samplesM SK2 tenslotte moet je dat doen.
* Je moet het voeden. **Statistische vorm.**
* Laat DuckDB feiten berekenen.
* Laat de LLM over deze feiten redeneren - en meer vragen.

---


[![Release van GitHub](https://img.shields.io/github/v/release/scottgal/mostlylucidweb?filter=datasummarizer*&label=datasummarizer)](https://github.com/scottgal/mostlylucidweb/releases?q=datasummarizer)

> De volledige dokumentatie leeft in de
> **[DataSummarizer README](https://github.com/scottgal/mostlylucidweb/blob/main/Mostlylucid.DataSummarizer/README.md)**
> Het werktuig ziet er eenvoudig uit. *is’t* gestuurd naar het model.

> **Nota:** Dit is nog niet.

---


## Het probleem met “Chat met je gegevens”

Als teams een LLM op de dataanalyse zetten, doen ze meestal één van drie dingen.

1. Voeg rijen in de context. (val over snel.
2. Inbed stukjes en haal ze terug. (nog steeds rij-niveauM SK2 nog steeds leekbaar )
3. Passen “representatieve monsters” ( vaak onrepresentatiefM SK3 nog steeds risicovolMSC4

Zelfs met 200k token context vensters, is dit de verkeerde abstractie

LLM's zijn niet ontworpen om agregaten te berekenen, scheuringen te detecteren, of om verspreidingseigenschappen betrouwbaar te verklaren door rijen te lezen.

De correcte split is nog steeds:

**LLM redenen. Databasiscomputes.**

Maar je kunt een stap verder gaan door te veranderen. *Wat?* De redenen voor LLM over.

---


## De sleutelopgradering: Statistieken als interface

In plaats van de modelgegevens te geven, geef het een **Profiel**.

Een profiel is een compacte, deterministische samenvatting van een dataset.

* schema + afgeleide types
* Null-ratio, uniekheid, cardinaliteit
* min / max / quantielen, skewM SK3 uitwijkingen
* Bovenste waarden voor veilige categorieën
* PII-risicosignalen (regex
* tijd-seriesstructuur (spanningM SK2 gaten , granulariteit
* Opsionele drift deltas tegen een basislijn.

Dit profiel wordt de *interface.* tussen redeneren en berekeningen.

Het model kan nu:

* We moeten beslissen wat interessant is.
* Voorstellen van verstandige follow-up-vragen
* interpreteren van resultaten.
* detecteren drift

… zonder ooit ruwe rijtjes te zien

### Architectuur

```mermaid
flowchart LR
    A[Data file] --> B[DuckDB profiles]
    B --> C[Statistical Profile JSON]
    C --> D[LLM reasoning step]
    D --> E[SQL/tool calls]
    E --> F[DuckDB executes locally]
    F --> G[Aggregate results]
    G --> H[LLM synthesis]

    style B stroke:#333,stroke-width:4px
    style D stroke:#333,stroke-width:4px
    style F stroke:#333,stroke-width:4px
```

Dit bewaart het bekende. **LLM → SQL → DuckDB** loop, maar aankert het in feiten.

* Profiling is deterministisch.
* De LLM werkt op bewijsmateriaal, niet anekdotes.

---


## Waarom het profiel nuttig is ( Zelfs zonder LLM)

Een profiel beantwoordt de saaie vragen.

* Welke kolommen zijn junk (alle-nulM SK2 konstante , dichtbijMska4constanteM Ska5
* Welke kolommen zijn lekkenrisico's (naar-unieke identificatorenM SK2
* Welke kolommen zijn hoog?
* Wat zijn de dominante categorieën?
* Is deze tijdsserie aaneenlopend of vol gaten?
* Zijn de distributies skewed of nul-inflated?

Dit zijn de vragen die je normaal ontdekt. 30 minuten in een spreadsheet archeologie.

Het profiel geeft ze in seconden.

---


## Waarom het profiel de LLM eigenlijk nuttig maakt

Als je *Doe* Aktiveer de LLM, het profiel is wat het performatief stopt.

Met het profiel-onzeer context, kan het modelM SK2

* concentreren op hoge-entropie of hoge -skew kolommen.
* Ze suggereren een gevoelige groep-doorsteken (zwaarM SK2cardinaliteit categorisches )
* Vermijden van vuilnis SQL ( geen groepering op 95%- unieke kolommen)
* let op de distributiedreef.
* vragen *doelgericht.* We volgen statistieken in plaats van meer gegevens te vragen.

Je hebt geen groter model nodig.

Je hebt beter bewijs nodig.

---


## Het Tool: DataSummarizer

Ik veranderde dit in een CLI zodat ik het kon runnen op willekeurige lêers - inclusief in cron en CI - zonder hand te gebruiken

[![Release van GitHub](https://img.shields.io/github/v/release/scottgal/mostlylucidweb?filter=datasummarizer*&label=datasummarizer)](https://github.com/scottgal/mostlylucidweb/releases?q=datasummarizer)

### Vinnige start

**Windows:** Trek een lêer op. `datasummarizer.exe`

**CLI:**

```bash
datasummarizer mydata.csv
```

### gereedschapsmodus (JSON uitvoer)

```bash
datasummarizer tool -f mydata.csv > profile.json
```

Dat `profile.json` is het contract:

* Verbruikt door de agenten.
* opgeslagen voor drift-detectie.
* gebruikt voor synthetische datageneratie.

---


## Operatieverschillen (Explicit)

* Ollama-endpunt: `http://localhost:11434` (configureerbaar)

* Verstek model: `qwen2.5-coder:7b` (overskryf met `--model`)

* Default registry DB: `.datasummarizer.vss.duckdb`

* SQL-veiligheids beperkingen:
  
  * max 20 rijen teruggestuurd naar de LLM
  * verboden: `COPY`, `ATTACH`, `INSTALL`, `CREATE`, `DROP`, `INSERT`, `UPDATE`, `DELETE`, onveilig `PRAGMA`

De verstek is opzettelijk conservatief. Je kunt ze lossen - maar je moet kiezen inM SK2

---


## Deterministische Profiling (Beeld)

```bash
datasummarizer -f patients.csv --no-llm --fast
```

Uitgang (974 patiëntenbestand met PII):

```
── Summary ────────────────────────────────────────────────
974 rows, 20 columns. 4 columns have >10% nulls. 8 warnings.
```

Alerts vlaggieukenrisico's, hoogM SK1nul kolommen , constante velden, en vermoedelijke identificeerders MSC4 allemaal berekend door DuckDBMSL5

Geen gok. Geen hallucinatie.

---


## gereedschap JSON voor automatisering

```bash
datasummarizer tool -f patients.csv --store > profile.json
```

Verkortde output:

```json
{
  "Profile": {
    "RowCount": 974,
    "ColumnCount": 20,
    "ExecutiveSummary": "974 rows, 20 columns. 18 alerts."
  },
  "Metadata": {
    "ProfileId": "0ae8dcc4d79b",
    "SchemaHash": "44d9ad8af68c1c62"
  }
}
```

Dit is ontworpen om te differen, te bewaren, en te auditeren .

---


## Automatische Drift-Detektie (Cron-FriendlyM SK2

Zodra profielen bestaan, zal drift goedkoper worden.

```bash
datasummarizer tool -f daily_export.csv --auto-drift --store
```

* KS afstand voor numerieke kolommen
* Jensen–Shannon-verschil voor categorieën
* schema-fingerprinted basislijnen

Het is een saaie infrastructuur, precies wat je wilt.

---


## De Killer Feature: Synthetische klonen van vorm

Zodra je een statistische vorm hebt, kan je iets echt nuttigs doen.

Genereer synthetische datasets die:

* Bevatten **Geen oorspronkelijke waardes.**
* Bevatten **Geen PII**
* bewaren **Verspreiding, cardinaliteit , en sparsiteiteffecten**

Dit is ideaal voor demo's, CI, support repros , en gedeelde monsters.

De betrouwbaarheidsrapport kwantificeert hoe dicht de synthetische data zijn - in plaats van handM SK1waving “realistisch”.

---


## vertrouwensmodel

* **Deterministische:** Alle statistieken, quantielenM SK1 driftscores, en waarschuwingen worden berekend door DuckDB .
* **Opsionele LLM:** Verteller, redenering, en SQL-suggestionen alleenM SK2
* **Hermetische modus:** `--no-llm` produceert volledig auditeerbare outputs geschikt voor CI of gereguleerde omgevingen.

De LLM uitvindt nooit feiten.

---


## Zie het.

**Repo:**
[https://githubM SK1com/scottgalMSC3mostlylucidwebMST4treeMSP5mainMSV6Mostly LucidMSS7DataSummarizer](https://github.com/scottgal/mostlylucidweb/tree/main/Mostlylucid.DataSummarizer)

**Benodigheden:**

* .NET  10
* DuckDB (embedded)
* optioneel: Ollama

**Verwant:**

* [Analyseren van grote CSV-bestanden met lokale LLMs](/blog/analysing-large-csv-files-with-local-llms)
* [DocSummarizer](/blog/building-a-document-summarizer-with-rag)
* [Beperkte duisternispatroon](/blog/constrained-fuzziness-pattern) - De onderliggende filosofie: Berekeningen van determinismeM SK2 stelt waarschijnlijkheid voor.
* [Beeldsomvattender](/blog/constrained-fuzzy-image-intelligence) - Hetzelfde patroon wendt zich aan het beeld begrijpen.