はじめに
SQLite-Utils-Askは、SQLiteデータベースやCSV/JSONファイルに対して、LLM(Large Language Model)の助けを借りて質問と回答のデータクエリを実行するために設計された強力なツールです。このツールは、ユーザーの質問に基づいて適切なSQLクエリを自動的に生成し、クエリを実行して結果を返すことができ、データ分析と処理のプロセスを大幅に簡素化します。
機能一覧
- 自然言語による質問データベースのデータについて自然言語で質問すると、対応するSQLクエリをツールが自動的に生成します。
- データベースの互換性SQLite データベースをサポートし、データ管理とクエリを容易にします。
- CSV/JSONファイルの取り扱いCSV、TSV、JSONファイルの直接クエリをサポートします。
- マルチドキュメント検索複数の文書に対する連合クエリをサポートします。
- コマンドラインツール使いやすいコマンドラインインターフェイスで、クエリーを素早く実行できます。
- プラグイン対応sqlite-utils などのツールと統合して、機能やアプリケーションシナリオを拡張できます。
ターミナルでSQLiteデータベースとCSV/JSONファイルについて質問する
のCLIツールsqlite-utilsを開発中です。コンピュータ上のSQLiteデータベースやCSV/JSONファイルに直接人間の言葉で質問できる新しいプラグインを作りました。
その名前はsqlite-utils-askである。次のようにインストールする:
sqlite-utils インストール sqlite-utils-ask
環境変数OPENAI_API_KEY
または、LLMをインストールしてllmキーセット openaiキーをコンフィギュレーション・ファイルに保存する。
そうすれば、こんな風に使うことができる:
curl -O https://datasette.io/content.db
sqlite-utilsはcontent.dbに " 2024年のsqlite-utils pypiのダウンロード数は?" と尋ねました。
このコマンドは、提供されたデータベースファイルのSQLスキーマを抽出し、あなたの質問とともにLLMに送信し、SQLクエリを返し、それを実行して結果を出そうとします。
うまくいけば、次のような答えが返ってくる:
SELECT SUM(downloads)
FROM stats
WHERE package = 'sqlite-utils' AND date >= '2024-01-01' AND date < '2025-01-01'.
[
{
"SUM(downloads)": 4300221
}
]
SQLクエリの実行が(何らかの構文エラーによって)失敗した場合、そのエラーを修正するためにモデルに戻し、あきらめる前に最大3回まで再試行する。
増加-v/--冗長
をクリックすると、プロンプトが表示されます:
システムプロンプト。
SQLiteスキーマの後に質問が表示されます。 その質問に答えるSQLクエリを1つ生成してください。
その質問に答えるSQLクエリを1つ生成する。 そのクエリを ``sql ...'' で返す。 そのクエリを ``sql ...'' で返す。
そのクエリを ``sql ...'' で囲んで返す。
例: レポジトリはいくつありますか?
答え: ``sql ...'' フェンスで囲ったコードブロックの中にクエリを記述する。
``sql
select count(*) from repos
プロンプト
...
CREATE TABLE [stats] (
[パッケージ] TEXT、
[日付] TEXT、
[ダウンロード数] INTEGER、
PRIMARY KEY ([パッケージ], [日付])
);
...
2024年のsqlite-utils pypiのダウンロード数は?
上記は関連するテーブルのみを含むように切り捨てていますが、実際にはそのデータベースの各テーブルの完全なスキーマが含まれています。
デフォルトでは、このツールはそのデータベーススキーマとあなたの質問のみをLLMに送信します。また、`-e/--examples`オプションを追加すると、そのスキーマの各テキストカラムの平均長さが32文字未満の公開値を5つ含むようになります。例えば、`state`カラムに "CA "と "FL "と "TX "という値を送ると、モデルはフルネームではなく、州の略称を使用することを示唆します。を使うべきであると示唆することができる。
#### CSV や JSON データを要求する際の問題点
コアの `sqlite-utils` CLI は通常 SQLite ファイルに対して直接実行されますが、3 年前に [sqlite-utils memory](https://simonwillison.net/2021/Jun/19/sqlite-utils-memory/) コマンドを使用して直接実行できるようにしました。3年前、[sqlite-utils memory]()コマンドを使ってCSVやJSONファイルに対してSQLクエリを直接実行する機能を追加しました。これはSQLクエリを実行する前にインメモリSQLiteデータベースにデータをロードすることで動作します。
この仕組みを再利用して、CSVやJSONデータに対して直接LLMヒントを使えるようにすることにしました。
sqlite-utilsのask-files``コマンドは以下のようになる:
シェル
sqlite-utils ask-files transaction.csv "年ごとの売上合計"
このコマンドは1つ以上のファイルを受け付け、CSV、TSV、JSON形式を組み合わせて指定することができます。提供されたファイルはそれぞれ異なるテーブルにインポートされ、必要に応じてモデルが結合クエリを構築できるようになります。
実施要項
プラグインのコアとなる実装はおよそ以下の通りである。250行のPythonコード用途sqlite-utils
register_commands()追加するプラグインフック尋ねる
歌で応える質問ファイル
命令だ。
LLMを依存関係として追加し、LLMのPython APIモデルとの対話の詳細を抽象化する。つまりsqlite-utils-ask
LLMやそのプラグインでサポートされているモデルであれば、どのようなモデルでも使うことができます。 クロード 3.5 Sonnetがプロンプトを表示し、以下のことができます:
sqlite-utils は llm-claude-3 をインストールします。
sqlite-utils ask content.db "ニューステーブルの行数を数える" -m claude-3.5-sonnet
同じスキーマに対して複数の質問を実行すると、同じ長いヒントプレフィックスを複数回送信することになり、OpenAIのヒントキャッシングが自動的に働き、これらの入力トークンに対して50%の割引を提供します。
そして、実際の数字を計算してみると、こうなった。gpt-4o-mini
4,000のトークンヒント(これはかなり大きなSQLスキーマである)をキャッシュしなくても、コストは10分の1以下になるはずだ。つまり、これらのキャッシュの節約は言及する価値すらないのだ!