# DataSummarizer: Vinniga lokaldataprofilering

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

De flesta system gör samma misstag, de behandlar LLM som om det var en databas.

De kastar rader i sammanhanget. ,, lägger in bitar, ,, eller väljer representativa prover,” och hoppas att modellen kan dra slutsatser om strukturen, ,, kvalitet, M SK5, och sanning från anekdoter. . Det fungerar tillräckligt bra för att demonstrera, Mska7, och sen kollapsar det under skalan, M Ska8, integritetsbegränsningar, MSKA9, eller grundläggande frågor som: Är den här kolumnen skräp? ,

**DataSummarizer tar den motsatta vägen.**

Den räknar en **deterministisk statistikprofil** av din datauppsättning genom att använda DuckDB, *optionellt* lager ett **lokala LLM** överhuvudtaget för att kunna tolka dessa fakta.,; föreslå säkert läsbarhet.-; endast SQL.

Resultatet är:

* fast, privat profilering
* tillförlitlig automatisering (`tool` JSON)
* byggt-in drift-detektor
* och något som de flesta system inte kan göra alls **PII- fria syntetiska datasamlingar som bevarar statistisk form**

Allt utan att skicka rå rader till en modell.

Det bygger direkt på **[Hur man analyserar stora CSV-Dater med Lokala LLM i C#](/blog/analysing-large-csv-files-with-local-llms)**, som introducerade grundidén

> **LLMs borde generera frågor , inte konsumera data.**

Detta artikel driver den tanken vidare.

* don’ inte mata LLM-raden
* inte till och med mata den.
* föda den **statistisk form**
* låta DuckDB bearbeta fakta
* låter LLM resonera över dessa fakta - och fråga efter mer

---


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

> Den kompletta dokumentationen finns i
> **[DataSummarizer README](https://github.com/scottgal/mostlylucidweb/blob/main/Mostlylucid.DataSummarizer/README.md)**
> verktyget ser enkelt ut. *is’t* skickad till modellen.

> **Nota:** Det här är inte "’". 1.0", än. ".", det är avsiktligt. "M SK4" Interfejsen är stabil, ; Kanterna blir fortfarande skarpare.

---


## Problemet med “Chat med dina data”

När lag ger en LLM in i dataanalys, gör de vanligtvis en av tre saker:

1. kasta rader i sammanhanget (faller över snabbtM SK1 lektar data)
2. bädda in stycken och hämta dem ( ända rad - nivå
3. gå igenom “representativa mönster ” | | ( | ofta orepresentativa | , | fortfarande riskfyllda

Även med 200k token kontextfenster

LLMs är inte konstruerade för att bearbeta agregater , upptäcka motsägelser, eller att trovärdigt resonera om fördelningseigenheter genom att läsa rader

Det korrekta splittret är fortfarande:

**LLM skäl. Databasberäkningar.**

Men man kan ta ett steg längre genom att ändra *vad* LLM-motsägelserna över

---


## Nyckeluppgraderingen: Statistiker som gränssnitt

Istället för att ge modellen data **profil**.

Ett profil är en kompakt, deterministisk sammanfattning av ett dataset.

* schema + delat typer
* noll hastighet , unikhet, cardinalitet
* min / max / kvantiteter, skewM SK3 utvikelser
* toppvärden för säkra kategorier
* PII risksignaler (regex
* tid-serienstruktur (längdM SK2 luckor , granularitet
* optional drift deltas vs en basnivå

Profilet blir *gränssnitt* mellan resonemang och beräkning.

Modelet kan nu

* bestämma vad som är intressant
* föresla vettiga efterfrågan
* tolka resultat
* detektera drift

…oför att någonsin se rå rader

### Arkitektur

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

Detta bevarar den välkända **LLM → SQL → DuckDB** loop, men ancorar den i faktaM SK1

* profilering är deterministiskt
* LLM arbetar på bevis, inte anekdoter.

---


## Varför är profilet användbart? ( Även utan LLM

Ett profil besvarar tråkiga frågor omedelbart

* Vilka kolumner är skräp? (all -nullM SK2 konstant, näraMSC4konstantMST5
* Vilka pelare är risker för utsvämningar ( nära-unique identifiserM SK2
* Vilka kolumner är höga-null eller uteslutandeM SK1svåra ?
* Vilka är de dominerande kategorierna?
* Är denna tidsserie sammanhängande eller fylld av luckor?
* Är fördelningarna skiftade eller noll?

Det här är de frågor som du vanligtvis upptäcker 30 minuter i kalkylblads arkeologi

Profilet ger dem i sekunder.

---


## Varför Profilet gör LLM faktiskt användbar

Om du *göra* aktivera LLM, profilet är det som hindrar det från att vara performativt

Med profilen- endast kontexten , kan modellen

* fokuserar på höga-entropi eller höga≥-skew kolumner
* föreslå en vettig grupp
* undvika skräp SQL ( inga grupperingar på ♫ 95%- ♫ unika kolumner ♫ МSK2 ♫
* notice distributional drift
* fråga *riktade* följa "-" -statistiker istället för att be om mer data

Du behöver inte en större modell

Du behöver bättre bevis

---


## verktyget: DataSummarizer

Jag gjorde detta till en CLI så att jag kunde köra den på godtyckliga plier, inklusive cron och CI.

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

### Vinnig start

**Windows:** draga en file på `datasummarizer.exe`

**CLI:**

```bash
datasummarizer mydata.csv
```

### verktygsmöjlighet (JSON utgång )

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

Det `profile.json` är företaget:

* konsumerade av agenter
* lagd för driftdetektorer
* som används för syntetisk data generering

---


## Operationella standard (Explicit

* Ollama slutpunkt: `http://localhost:11434` (konfigurerbar)

* Standardmodell: `qwen2.5-coder:7b` (överrider med `--model`)

* Standardregistrer DB: `.datasummarizer.vss.duckdb`

* SQL säkerhetsbegränsningar:
  
  * max 20 rader återkom till LLM
  * förbjudet: `COPY`, `ATTACH`, `INSTALL`, `CREATE`, `DROP`, `INSERT`, `UPDATE`, `DELETE`, osäkra `PRAGMA`

Dom standarden är avsiktligt konservativa. Du kan frigöra dem - men du måste välja in

---


## Deterministisk profilering (Example )

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

utgång (974 patientregistrer med PII ):

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

Alerter Flaggläckarisker, högM SK1 tomma kolumner , konstanta fält , och misstänkta ID-identifisatorer - alla räknade av DuckDB

Ingen gissning . Inga hallucinationer.

---


## verktyg JSON för automatisering

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

Förkortad utgång:

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

Den är designad för att differas, lagras och kontrolleras.

---


## Automatisk driftdetektion (Cron-FriendlyM SK2

När profiler existerar, blir drift billig.

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

* KS avstånd för numeriska kolumner
* Jensen–Shannons skillnad för kategoriska
* schema-fingerprinted baselines

Det är den tråkiga infrastrukturen som är precis vad du vill ha.

---


## Killer Feature: Syntetiska kloner från form

När du har en statistisk form, kan du göra något verkligt användbart.

Generera syntetiska datasamlingar som

* innefatta **inga ursprungliga värden**
* innefatta **ingen PII**
* bevara **fördelning , cardinalitet, och sparsitetseffekter**

Det är idealt för demos, CI, support repros , och delabara prover

Tillförlitlighetsrapporten kvantifierar hur nära den syntetiska datan är - snarare än hand

---


## Tillitmodell

* **Deterministiskt:** alla statistiker, kvantiteter , driftscoresM SK2 och varningar är beräknade av DuckDB
* **Optionell LLM:** berättelse , resonemang, och bara SQL-suggestioner
* **Hermetisk mode:** `--no-llm` producerar fullt reviderade produkter som är lämpliga för CI eller reglerade miljöer.

LLM uppfinner aldrig fakta, det reagerar på dem.

---


## Ta det

**Repo:**
[https://~github~.~com~M SK2~scottgal~/~motillucidweb~ /~tree~MST5~main~Mstlylucid~M ST7~DataSummarizer](https://github.com/scottgal/mostlylucidweb/tree/main/Mostlylucid.DataSummarizer)

**Benötningar:**

* .NET  10
* DuckDB (
* optional: Ollama

**Related:**

* [Att analysera stora CSV-filer med lokala LLMs](/blog/analysing-large-csv-files-with-local-llms)
* [DocSummarizer](/blog/building-a-document-summarizer-with-rag)
* [Begränsad otydighetsmönster](/blog/constrained-fuzziness-pattern) - Den underliggande filosofin : determinismens beräkningar
* [Image Summarizer](/blog/constrained-fuzzy-image-intelligence) - Samma mönster som tillämpas på bild förståelse