Hopp til hovedinnhold
PULSEN_
ESC Tilbake til strømmen
GitHub · 2T SIDEN · verktøy

Sqlsure stopper KI-generert SQL som teller inntekter dobbelt, før spørringen kjører

SYNOPSIS_GENERERT

Sqlsure sjekker KI-generert SQL mot semantikken teamet allerede har erklært i dbt, og avviser spørringer som dobbeltteller etter en én-til-mange-join. Deterministisk, uten LLM-kall.

Databasen sier ja. Linteren sier ja. LLM-en som gjennomgår sin egen SQL sier også ja. Likevel kan spørringen returnere et tall som er stille feil: inntekter dobbelttelt av en join, et gjennomsnitt som er summert, en pasient-ID eksponert i output. Sqlsure, et Apache-2.0-lisensiert Python-verktøy, angriper akkurat den feilklassen, og gjør det deterministisk før spørringen kjører.

Poenget er at verktøyet ikke finner opp ny sannhet. Det leser semantikken teamet ditt allerede har erklært: unique-tester i dbt blir til grain, relationships-tester blir til join-kardinalitet, og enkle meta-tagger markerer hva som er trygt å summere. Har du ingen semantisk lag i det hele tatt, kan sqlsure.introspect bygge regelboka fra databasekatalogen via SQLite-PRAGMA-er eller information_schema. Reglene er oppslag i ordbøker, ikke LLM-kall, så samme input gir samme dom hver gang, offline og uten nettverkstilgang.

Regelsettet dekker ni mønstre. FANOUT fanger SUM av et additivt mål etter en én-til-mange-join, CHASM fanger to fan-out-joins som multipliserer hverandre, ADDITIVITY fanger summering av rater og gjennomsnitt, og SENSITIVE_COLUMN flagger PHI- og PII-kolonner i output. Når verktøyet ikke kan verifisere noe, sier det «kan ikke verifisere», ikke «ser greit ut».

Tallene i prosjektets egen dokumentasjon er sterke: 2 568 ekspertskrevne gullspørringer fra Spider og BIRD, 45 flagg, null falske alarmer, og et gullsvar i BIRD som angivelig er feil med faktor 8. Dette er utviklerens egne målinger, ikke uavhengig etterprøvd, men repoet lenker hver påstand til en kjørbar måling.

For deg som bygger en text-to-SQL-agent er MCP-serveren det interessante: agenten må passere kontroll før den får kjøre. Hver avvisning bærer med seg et maskinlesbart fiks, så løkka blir utkast, sjekk, fiks, sjekk, kjør.

Hva bør du gjøre?

  1. Har du en dbt-repo: kjør python -m sqlsure.scan path/to/dbt-repo --report report.md og se hva som flagges før du binder deg til verktøyet.
  2. Bygger du en SQL-agent: registrer sqlsure som MCP-server, så agenten må bestå kontrollen før den utfører spørringen.

KI-KURATERT — INNHOLD GENERERT AV KI-AGENTER BASERT PÅ ORIGINALKILDEN