SQL DB tbls Go

もう人間がクエリを書く時代じゃない!SQLクエリの組み立てを自動化するSlack botを開発・導入しました

SQL DB tbls Go

こんにちは。SUZURI事業部の@kromiiiと申します。

私のメインの業務はWebアプリケーションの開発ですが、大学院時代のスキルを活かして並行してデータ分析業務も行っています。

データ分析業務ではデータベースのクエリを書くことが多いのですが、私自身SUZURI事業部に配属されたばかりで、テーブルの名前やリレーションを覚えるのが大変でした。そこでクエリの設計を自動化するツールをSlackに導入しました。

その名も tbls-ask bot です。どのようなものか先に見てみましょう。

ユーザーはSlackでメンションする形で、どのようなクエリを実行したいのか自然言語で入力します。

tbls-ask

メンションされるとSlack botが起動し、どのDBスキーマを利用するかを尋ねます。

tbls-ask

ユーザーがDBスキーマを選択すると、自然言語からSQLクエリを生成し、Slackに返答します。

tbls-ask

今回はパブリックに公開する記事のため、サンプルとしてWordPressのスキーマを利用していますが、実際の社内のSlack botではそれぞれのサービスのDBスキーマが選択が可能となっています。

導入背景

データベースのクエリを書く際、SQLを書くことが一般的です。しかし、SQLは人間が直感的に理解しやすい言語ではありません。SQLを書く際にはデータベースのスキーマやテーブルの関係性を理解し、効率的なクエリを設計する必要があります。

この作業はマーケターやディレクターなどの非エンジニア職がデータ分析を行う上で大きな障壁となっているだけでなく、エンジニアでも会社に入りたての人などドメイン知識を持たない人にとってはハードルが高い作業であると言えます。

この問題を解決するため、データベースのスキーマやテーブルの関係性を自動で解析し、自然言語からSQLクエリを生成するツールが開発されています。 代表的なもので言うと、Chat2DBSQL Chatのような製品が挙げられます。

しかしこうした外部のソフトウェアは商用のため導入に当たってそれなりのコストがかかります。また、多くの場合DBに対する接続権限を要するため、セキュリティ上のリスクも伴います。

私が考えたアプローチ

上記の問題を解決するため、私はDBのスキーマ情報からSQLクエリを生成するツール tbls-ask をSlackアプリとして開発しました。

tbls-askは、tblsというDBのスキーマ情報を生成するツールをベースに、自然言語からSQLクエリを生成する機能を提供するツールです。両者とも弊社技術基盤チームに所属する@k1LoWさんが開発を行っているツールで社内外の多くのエンジニアに利用されています。

tbls-askは、以下のような特徴を持っています。

  1. tblsによって生成されたDBのスキーマ情報(ドキュメント生成時に出力されるschema.json)をソースとして利用するので、DBに対する接続権限が不要
  2. 非商用のオープンソースソフトウェアであるため、OpenAI APIの利用料だけで導入が可能
  3. GO言語で実装されているため、ソフトウェアをモジュールとして組み込むことが容易

以上のような特徴から、tbls-askはセキュリティリスクを最小限に抑えつつ、低コストでDBのスキーマ情報からSQLクエリを生成することが可能です。

もちろん前提として社内の多くのレポジトリでtblsが利用されているため、スキーマ情報を取得するための設定が容易であるという利点もありました。

自然言語からSQLクエリを生成する仕組み

tbls-askは、コマンドラインツールとして提供されていますが、今回はSlack botとして利用することで、エンジニア以外のメンバーでも簡単に利用できるようにしました。

現在このSlack botは以下のような構成で動いています。

architecture

まず前提として、DBのスキーマ情報がtblsによって生成されている必要があります(最新のtblsではデフォルトでドキュメント生成時に合わせて生成されます)。ユーザーがSlackでメンションすると、Slack botが起動し、どのDBスキーマを利用するかを尋ねます。ユーザーがDBスキーマを選択すると、tbls-askにユーザーのクエリとDBスキーマ情報を渡し、中でOpenAI APIを利用して自然言語からSQLクエリを生成します。生成されたSQLクエリをSlackに返答し、説明文と一緒に表示します。

プロンプトの内容は以下のようになっています。

Answer the questions in the Question assuming the following DDL.
{{ .DatabaseVersion }}

## DDL ( Data Definition Language )

{{ .QuoteStart }}
{{ .DDL }}
{{ .QuoteEnd }}

## Question
{{ .Question }}

tbls-askでは、DBのスキーマ情報をDDLに変換し、OpenAI APIに渡すことで自然言語からSQLクエリを生成しています(参考)。

課題と今後の展望

現在、tbls-ask bot は社内の四つの事業部で利用されており、25以上のチャンネルで稼働しています。

エンジニアだけでなくディレクターやマーケターなどの非エンジニア職のメンバーにも好評で、クエリを書く際のハードルが下がったとの声を多くいただいています。

とはいえ現状以下の課題があります。

  1. 巨大なスキーマファイルに対応できない(一定以上のスキーマファイルだとOpenAI APIの制限に引っかかる)
  2. 連続してメンションできない(クエリを修正したい場合に困る)
  3. フィードバックを収集できない(クエリの生成結果に対してフィードバックを受け取る仕組みがない)

これらの点を改善することで、tbls-ask botの利便性を向上させ、より多くのメンバーに利用してもらえるようにしていきたいと考えています。

最後に

tbls-ask bot のソースコードとパッケージは以下のレポジトリで公開しています。

https://github.com/kromiii/tbls-ask-agent-slack

OpenAI APIキーとSlackの認証情報を環境変数に設定し、make all を実行することでk8s上にデプロイできます。

tblsを使っているレポジトリであれば、誰でも導入が可能なので、ぜひ試してみてください。