プログラミング
Show HN: Sqlsure – AI生成SQLの決定論的セマンティックチェック
Show HN: Sqlsure – deterministic semantic checks for AI-generated SQL (github.com)
要約
Sqlsureは、AIが生成したSQLクエリに対して、実行前に決定論的なセマンティックチェックを行うツールです。データベースやリンターが見逃すような、論理的な誤り(例:二重計上、誤った集計)を検出します。dbtテストやスキーマ定義などの既存の事実に基づいてルールを定義し、高速かつオフラインで動作します。
全文翻訳
sqlsure AIがSQLを作成します。sqlsureがそれを正しくします。
クエリは完全に有効であり、エラーなく実行され、サイレントに間違った数値を返す可能性があります — 結合による収益の二重計上、平均値の合計、患者識別子の漏洩などです。データベースはこれを検出しません。リンターはこれを検出しません。自身のSQLをレビューするLLMもこれを検出しません。
sqlsureは、クエリが実行される前に、決定論的に0.1ミリ秒でこれを検出します。
約束ではなく証明:私たちは、すべてのテキストto SQLモデルが評価される2つのベンチマークのゴールドアンサーに対してsqlsureを実行しました。2,568の専門家が書いたクエリ、45のフラグ、ゼロの誤検知 — SQLがターゲットとするバグクラスによって8倍も証明可能な誤りがあるBIRD devのゴールドアンサーや、すでにアップストリームに提出されたスキーマの欠陥を含みます。
仕組み
sqlsureは、チームがすでに宣言した事実に基づいてSQLを判断します — dbtのユニークテストは粒度(grain)になり、リレーションシップテストは結合カーディナリティ(join cardinality)になり、1行のメタタグは合計しても安全なものをマークします。学習する新しい言語はなく、手でメンテナンスするモデルもありません。ルールは辞書ルックアップであり、LLM呼び出しではありません — 同じ入力、同じ判定、常に、オフラインで。
すべての却下には機械で処理可能な修正が伴うため、AIエージェントは自己修復します:ドラフト → チェック → 修正 → チェック → 実行。私たちのベンチマークでは、修正をそのまま適用すると、10回中10回パスするクエリが生成されました。
クイックスタート
pip install sqlsure
from sqlsure import SemanticModel, check
violations = check(sql, model) # [] はセマンティックに安全であることを意味します
またはクローンして30秒のデモを実行します:
python check.py # 5つの間違ったクエリが却下され、1つが承認されました — 修正付き
python -m sqlsure.scan path/to/dbt-repo --report report.md # 任意のdbtリポジトリを監査します
3つのドア、1つのエンジン
1. CIゲート — PRが二重計上した場合、マージをブロックします:
python -m sqlsure.cli --model model.json query.sql # 違反があった場合、終了コード1
2. MCPサーバー — AIエージェントは実行前に検査に合格する必要があります:
claude mcp add sqlsure -- python -m sqlsure.mcp_server --model /abs/path/model.json
ツールリファレンスとエージェントループパターンについては、docs/MCP.mdをご覧ください。
3. ライブラリ — check() を任意のテキストto SQL製品またはエージェントフレームワークに埋め込みます。ドロップインのSemanticGateはVanna/WrenAIスタイルのジェネレーターをラップし、セマンティック評価メトリックは実行精度が不明なNL2SQL出力をスコアリングします。
ルール(v0.1)
ルール | 重大度 | カテゴリ | キャッチするもの
---|---|---|---
FANOUT | error | | 1対多結合後の加算可能なメジャーの合計/カウント
CHASM | error | | 2つ以上のファナウト結合がお互いを乗算している
ADDITIVITY | error | | 非加算可能なメジャー(レート、平均値)の合計
SEMI_ADDITIVE | error | | 残高/センサスをスナップショット次元にわたって合計
JOIN_KEY | error | | 宣言されたリレーションシップに一致しない列での結合
CROSS_JOIN | error | | 述語のない結合
WEIGHTED_AVG | warning | | ファナウトによる平均値のサイレントな再加重
UNDECLARED_JOIN | warning | | 宣言されたリレーションシップのない結合(検証不能 ≠ 安全)
SENSITIVE_COLUMN | policy | | クエリ出力で公開されたPHI/PII列
sqlsureは何かを検証できない場合、「検証できません」と言います — 「問題なさそうです」とは決して言いません。正直な不確実性は機能です。
信頼性のプロパティ
決定論的 — 同じSQL + 同じルールブック = 同じ判定、常に;ルールは辞書ルックアップであり、行ごとに監査可能です
オフライン — ネットワーク呼び出しゼロ;SQLはあなたのマシンから離れません
データアクセスなし — クエリテキストを解析します;データベースに接続しません
テレメトリなし — 一切収集しません(SECURITY.md)
サプライチェーン — リリースは、タグ付けされたコミットからの公開CI実行によるPyPI Trusted Publishing(OIDC)を通じてのみ出荷されます;2つのランタイム依存関係
ルールブックの出所
dbt(今日から動作):manifest.jsonまたはschema.yml — チームがすでに書いたテストが強制力のあるセマンティクスになります、ゼロコンフィグ
プレーンPK/FK宣言(今日から動作 — ベンチマーク監査を強化)
ライブデータベース自体(今日から動作):セマンティックレイヤーは全くありませんか?sqlsure.introspectはカタログからルールブックを構築します — SQLite PRAGMAsまたはinformation_schema PK/FK(postgres/mysql)。BIRD自身のデータベースファイルからのイントロスペクションは、ベンチマークの公開スキーマに見落とされていた2つの外部キーを回復しました(bird-bench/mini_dev#37)
from sqlsure.introspect import model_from_sqlite
model = model_from_sqlite("app.db") # PK -> grain, FK -> join edges
手書きJSON — model.example.json
OSIおよびWrenAI MDL(インテグレーション/に動作するローダー):OSIは仕様の公開例で実証されました;WrenAI MDLはWrenAI自身の出荷済み例で実証されました
マニフェスト — primaryKey -> grain, relationship joinType + condition -> join edges, cube measures -> additivity
Cube, Snowflake Semantic Views — ロードマップ上のアダプター;エンジンは常に1つのSemanticModelのみを参照します
16/16のルールテストで検証済み、ペアのベンチマークで100%のリコール / 0%の誤検知(docs/METRICS.md)
実際のプロダクションリポジトリ(Mattermostのウェアハウス、Fivetranパッケージ、dbtのjaffle shop) — docs/TEST-REPORTS.md
Spider + BIRDゴールドクエリ — 上記のゼロノイズ外部監査
詳細はこちら
docs/EVIDENCE.md — あなたのために何をするか、すべての主張は再実行可能な測定にリンクされています
docs/ARCHITECTURE.md — 物理的にどのように機能するか、ELI5 → 神レベル、実際の中間出力付き
docs/FOR-DUMMIES.md — ゼロからすべての概念
docs/INTEGRATIONS.md — GitHub Action, pre-commit, MCP, Snowflake UDF / Cortex Agentツール, query-history audit
docs/MCP.md — MCPサーバーのドキュメント
CONTRIBUTING.md — ルールとローダーの追加
Apache-2.0 · sqlsure.ai
mcp-name: io.github.sqlsure/sqlsure