# DataSummarizer: Profilazione veloce dei dati locali

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

La maggior parte “ chiacchierare con i vostri dati” i sistemi fanno lo stesso errore : trattano un LLM come se fosse una base di dati

Mettono le sequenze nel contesto, inseriscono frammenti, o prelevano M SK2 campioni rappresentativi ” e sperano che il modello possa dedurre la strutturaMST4 qualitàM ST5 e verità da aneddotiM st6 Funziona abbastanza bene per mostrare MST7 e poi collassa sotto la scalaMSt8 restrizioni sulla privacyMst9 o domande di base come MSST10 è questa colonna spazzaturaMSST11

**DataSummarizer ha l'approccio opposto.**

E' un sistema di calcolo. **Profilo statistico deterministico** il vostro set di dati usando DuckDB, persiste quel profilo, e *optionally* a strati. **LLM locale** in più per interpretare quei fatti, propone leggere in modo sicuroM SK1 solo SQL , e seguire il manuale- l'analisi di fondoMSC4 La leva pesante è numericaMST5 verificabileM ST6 e veloceM st7 Il LLM è deliberatamente limitato al ragionamento e alla narrazioneMst8

Il risultato è:

* Fast, profilazione privata
* Automatizzazione affidabile (`tool` JSON)
* costruita-in rilevamento della deriva
* E qualcosa che la maggior parte dei sistemi non può fare. **PII-set di dati sintetici liberi che conservano la forma statistica**

Tutto senza mandare linee brutte a un modello.

Questo è costruito direttamente su **[Come analizzare grandi file CSV con local LLM in C#](/blog/analysing-large-csv-files-with-local-llms)**, che ha introdotto l'idea centrale:

> **I LLM dovrebbero generare domande, non consumare dati.**

Questo articolo fa avanzare l'idea.

* don’ non alimenta le righe LLM
* Non lo fate nemmeno mangiare “esempiM SK2 a meno che non dovete
* La nutrire. **forma statistica.**
* Lasciare DuckDB calcolare i fatti
* Lasciate che il LLM spieghi questi fatti - e chieda di più.

---


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

> La dokumentazione completa vive in
> **[DataSummarizer README](https://github.com/scottgal/mostlylucidweb/blob/main/Mostlylucid.DataSummarizer/README.md)**
> L'outil sembra semplice. Non è’tM SK2 La maggior parte del lavoro è in quello *isn’t* spedito al modello.

> **Nota:** Questo non è’t 1.0 ancoraM SK2 Quello che ’ è intenzionaleMST4 L'interfaccia è stabileMSC5 i bordi sono ancora afficciatiMSV6

---


## Il problema con “Chat con i vostri dati”

Quando le squadre collegano un LLM all'analisi dei dati, di solito fanno una delle tre cose.

1. gettare le sequenze nel contesto (caduti in frettaM SK1 ricavi di dati)
2. inserire dei frammenti e recuperare i frammenti (riga ancora- livelloM SK2 ancora inaccessibile )
3. passare “esemplari rappresentativi” (o spesso non rappresentativeM SK3 ancora rischiosoMSC4

Anche con 200k token context windows

I LLM non sono progettati per calcolare gli aggregati, rilevare gli squali, o ragionare affidabilmente sulle proprietà di distribuzione leggendo le sequenzeM SK2 Hanno l'allucinazione perché loro ’ vengono chiamati a lavorare sulla base di datiMSC4

La divisione corretta è ancora:

**Le ragioni del LLM. I calcoli della base di dati.**

Ma si può fare un passo avanti cambiando. *Che cosa?* Le ragioni del LLM su .

---


## L'aumento chiave: Statistiche come interfaccia

Invece di dare i dati del modello, dategli un **Profili**.

Un profilo è un sommesso deterministico compacto di un set di dati.

* schema + tipi inferrati
* tasso nullo, unicità, cardinalità
* min / max / quantile, skewM SK3 anomalie
* I valori più alti per categorie sicure
* Signali di rischio PII (regex + classificatore
* tempo- struttura di serie M SK1spansione, differenze , granularitàMSC4
* Deltas del drift opzionale contro una linea di base.

Questo profilo diventa il *Interfaccia* tra ragionamento e calcolo.

Il modello può ora:

* Decidere cosa sia interessante.
* Proporre domande di follow-up sensate.
* interpretare i risultati.
* individuare la deriva.

… senza mai vedere le linee brutteM SK1

### L'architettura

```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
```

Questo preserva il familiare. **LLM → SQL → DuckDB** loop, ma l'ancora nei fatti:

* Il profiling è deterministico.
* LLM opera su prove, non aneddoti.

---


## Perché il profilo è utile ( Anche senza un LLM)

Un profilo risponde alle domande noiose.

* Quali colonne sono spazzatura (tutto-nulloM SK2 costante , vicinoMST4constanteMSV5
* Quali colonne sono i rischi di fuga ( vicinoM SK1 identificatori unici)?
* Quali colonne sono alte-nule o estraneeM SK1 pesanti?
* Quali sono le categorie dominanti?
* Questa serie temporale è contigua o piena di lacune?
* Le distribuzioni sono skewed o zero-inflatedM SK1

Queste sono le domande che normalmente si scoprono 30 minuti nell'archeologia dei fogli di calcolo

Il profilo le dà in secondi.

---


## Perché il profilo rende l'LLM effettivamente utile

Se *Lo stesso vale per le persone che vivono in Africa.* accendere il LLM, il profilo è ciò che lo impedisce di essere performativo.

Con il profilo- solo il contesto, il modello puòM SK2

* focalizzarsi sulle colonne high-entropia o high -skew.
* suggerire un gruppo sensato-parli M SK1bassa-cardinalità categoricaMSC3
* evitar garbage SQL (no grouping on 95%-unique columns)
* Nota il flusso di distribuzione.
* chiedersi *obiettivo* Seguire le statistiche - invece di chiedere altri dati

Non c'è bisogno di un modello più grande.

Avete bisogno di prove migliori.

---


## L'Tool: DataSummarizer

L'ho trasformato in un CLI così che potevo farla funzionare su file arbitrari - compresi nei cron e i CI - senza usare la mano

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

### Inizia veloce

**Windows:** trascinare un file su. `datasummarizer.exe`

**CLI:**

```bash
datasummarizer mydata.csv
```

### Modo di strumento (Output JSON)

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

Quello. `profile.json` è il contratto:

* Consumato da agenti.
* Sono conservati per la rilevazione del flusso.
* usata per generare dati sintetici.

---


## Defaults Operational (Explicit)

* Il punto finale Ollama: `http://localhost:11434` (configurabile)

* Modello standard: `qwen2.5-coder:7b` (override con `--model`)

* Registro di base DB: `.datasummarizer.vss.duckdb`

* Contratimenti di sicurezza SQL:
  
  * max 20 sequenze restituite al LLM
  * proibito: `COPY`, `ATTACH`, `INSTALL`, `CREATE`, `DROP`, `INSERT`, `UPDATE`, `DELETE`, insicura `PRAGMA`

I default sono intenzionalmente conservativi. Potete liberarli M SK1 ma dovete scegliere in.

---


## Profilazione deterministica (Esempio)

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

Output (974 registri dei pazienti con PII):

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

Alerts flag leakage risks, highM SK1 null columns, constant fields , and suspicious identifiers MSC4 all'indice di DuckDBMSL5

No guessing. No hallucination.

---


## Tool JSON per l'automazione

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

Output ristretto:

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

Questo è progettato per essere diffido, conservato, e controllato .

---


## Detezione Automatica del Drift (Cron-FriendlyM SK2

Una volta che esistono i profili, la deriva diventa economicaM SK1

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

* La distanza KS per le colonne numeriche
* Jensen–Shannon divergenza per le categorie
* schema-linee di base stampate a dito

È l'infrastruttura noiosa di ’ - che è esattamente quello che volete.

---


## La funzione Killer: Cloni sintetici dalla forma

Una volta che avete una forma statistica, potete fare qualcosa di veramente utile:

Generare set di dati sintetici che:

* contenere **Niente valori originali.**
* contenere **Niente PII**
* conservare **Distribuzione, cardinalitàM SK1 ed effetti di sparsità**

Questo è ideale per i demos, CI, support repros , e campioni condivisiM SK3

Il rapporto di fideltà quantifichezza quanto siano vicini i dati sintetici - piuttosto che a manoM SK1in onda “realistico”.

---


## Il modello di fiducia

* **Determinista:** Tutte le statistiche, quantileM SK1 punteggi di drift, e gli allarmi sono calcolati da DuckDBMSC3
* **LLM opzionale:** narrazione, ragionamento, e solo suggerimenti SQLM SK2
* **Mode Hermetico:** `--no-llm` Produisce prodotti completamente controllabili, adatti a CI o a ambienti regolati.

Il LLM non inventa mai i fatti.

---


## Lo prendi.

**Repo:**
[https://githubMSC1comM SK2scottgal/mostlylucidweb /treeMST5mainMSP6Mostly LucidMSM7DataSummarizer](https://github.com/scottgal/mostlylucidweb/tree/main/Mostlylucid.DataSummarizer)

**Requisite:**

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

**Related:**

* [Analizzare grandi file CSV con LLM locali](/blog/analysing-large-csv-files-with-local-llms)
* [DocSummarizer](/blog/building-a-document-summarizer-with-rag)
* [Patterno di Fuzzine Constretto](/blog/constrained-fuzziness-pattern) - La filosofia sottostante : i calcoli del determinismo M SK2 propone la probabilità
* [Summarizatore dell'immagine](/blog/constrained-fuzzy-image-intelligence) - Lo stesso schema applicato alla comprensione dell'immagine