ミツモア データマネージャの古田 (@crazysrot) です。
ミツモアでは、データの民主化、データ分析の民主化を推進するため、text2SQLを内製しています。
text2SQLは、自然言語でデータ抽出の依頼をするとSQLを自動生成してくれるAIツールです。データアナリストの業務効率化や、ビジネスメンバーのデータ利活用促進を期待しミツモアデータGではかなり力を入れている領域になります。
世の中のプロダクトでは期待する精度を出せなかったので、名だたる企業と同じように内製することにしました。
1st Editionは、2023年春にはbeta versionを構築し、社内で展開しました。
1. text2SQLの必要性
データ分析において、SQLの作成は多くのビジネスユーザーにとって高いハードルとなっています。データベーススキーマを理解し、正確なSQLクエリを書くには専門知識が必要です。text2SQLは、自然言語の説明からSQLクエリを自動生成することで、このギャップを埋めるツールです。
text2SQLだけに焦点をあてても、現状世の中に存在するどのtext2SQLも、特にtable選択の部分がうまくいかないと思っています。
ただし、次の条件が整っているcaseに対してはうまくいきます。ビジネスモデルがシンプルな場合などでは内製する必要は全くありません。
- table数が少ない, field数が少ない
- 類似field, tableが少ない
- 親和性のサンプルクエリがプロンプトないしRAGなどから与えられている
2. 解決すべき課題
ミツモアのデータ分析の実施において、特に非データ専門家が直面する主な課題は:
- データスキーマ情報の把握が難しい
- 1000弱のtableが存在する
- 正確なSQLの作成に専門知識が必要
- 適切なテーブルとフィールドの選択が複雑
- 微妙に異なる指標が乱立している
- 複数のプロダクトの近しいデータが存在する
- 分析要件を技術的なクエリに変換する難しさ
これらの課題により、データ分析チームへの依頼が増加し、分析のボトルネックとなっていました。
3. text2SQLが解決するIssueの明確化
非データアナリストが分析をする上で実務上次のハードルがあると分解しました。
- (仮説を立てる が難しい)
- (欲しいデータがどのようなものなのかを考える が難しい)
- 欲しいデータがどのようなものなのかを文字に書き起こす が難しい
- 欲しいデータをData人材が理解しやすいように書き換える が難しい
- ✅SQLに必要なSchema情報を抽出する/把握する が難しい
- ✅SQLを書く が難しい
- 出力結果が正しいかを確認する が難しい
上記のうち、主に✅のついた項目を解決するためのツールとしてtext2SQLを開発しました
※ それぞれ、独立した機能を開発して繋ぎ合わせたものを作成することで使いやすいツールを作成することができると想定
4. text2SQL (1st Edition) のアーキテクチャ
text2SQLは以下の主要コンポーネントで構成されています。
システム全体像
text2SQLは、Google Cloud Functions上で動作するサーバーレスアプリケーションとして実装されており、主にSlackボットとして利用されます。システムは複数のコンポーネントから構成され、段階的にSQLクエリを生成・改善していきます。

処理フロー

精度向上のための機能
- 多段階アプローチ: text2SQLは単純なプロンプトベースの生成ではなく、以下の段階的アプローチを採用しています。
- テーブル選択: Embeddingベースの類似度検索で関連テーブルを特定
- カラム選択: 必要なカラムのみを抽出し、ノイズを削減
- SQL生成: コンテキストを絞った状態で精度の高いSQL生成
- リファインメント: 反復的な改善によるクエリの最適化
- Function Callingを活用した自律的改善
事前準備
- テーブル情報の埋め込み
- テーブル名と説明の準備
- テーブル定義(テーブル名、フィールド名、説明)の準備
- これらの情報をベクトルデータベースに埋め込み
- 基本は上記は、dbtにてschema情報を整理し、vector化は手動で更新を行なっていました *更新頻度を上げることによる精度向上の寄与が薄いと考えていたため実装を後回しに
5. 精度向上のための取り組み
システムの精度向上のために以下の対応を第一世代では実施しました。
- RAG検索後プロンプトに渡すテーブル数15まで
- テーブル定義の自動埋め込みメカニズムの構築
- トークン制限を考慮した分割実行機能
- テーブル型情報の追加によるSQL生成精度向上
- 生成SQLのBigQuery互換性確保と自動修正
- 実行不可能なSQLに対するエラーハンドリングと再試行メカニズム
6. UX
弊社ではコミュニケーションツールとしてSlackを使っており、多くの業務がSlackワークフローで管理されているケースがあったり、Slackに関してはほぼ全社員がアクティブユーザーとして活用しています。そのため、ハードルの低さからSlackから呼び出せるようにしました。正直、コンテキストが長すぎるとpostが分解されるなどのつらさや、スレッドの過去情報を保持する方法などに対応するのは面倒だったが、意思決定としてはユーザの活用推進がしやすいという理由のみで選択しました。
また、使い勝手の良い機能としてオプションを追加しました。 例えば、
@text2sql [payment] xxxx
と入力すると利用者が利用したいデータのみにフィルターできたり、
@text2sql /d <https://redash.domain-name.com/queries/1>
と入力すればquery 1のSQLの説明を返してくれます。 このように、いくつか目的に応じた使い方ができるようにしました。
7. 結果
複雑なものやプロンプトの文章量が少ない場合には期待した結果は返ってこず、という一定の精度しか出せない状態にとどまってしまい、ビジネスユーザにとっては使い勝手の悪いレベルまでにしか到達しませんでした。もちろんtable名やcolumn名まで指定すると精度は向上するのですが、民主化という点においては不十分ですし、データグループのメンバーが活用するにはそちらのプロンプトを書いてガチャを回すような業務になってしまい活用はそこまで進みませんでした。 しかし、SQLにハードルを感じていた一部のビジネスユーザがBIツール活用に積極的になるなど、一定の効果は出ました。
また、データグループでもDescriptionを記載する際は、全て上述したtext2SQLの一機能をフル活用するなど、一定の効率化が図れました。
8. まとめ
今現在、ミツモアでは上記に記載した第一世代ではなく第二世代のtext2SQLが稼働しています。 第二世代はアーキテクチャを大きく変えており、完全0からの作り替えを行なっています。 バージョンアップしてからは精度も向上し自然言語からSQLへの変換がより便利になり、データ分析の民主化に多大な貢献をもたらしています。データ専門家でないユーザーもデータベースにアクセスし、必要な情報を取得できるようになります。また、既存の可視化に対してもより理解を深めるといった調査/把握としても活用としてはとても有用で、あらかじめ想定していなかった使い方もされていたりします。これにより、データグループの単純集計リソースが大幅に削減され、より複雑な分析タスクに集中させることが今後は行えるようになっていくと考えています。
第二世代については、同じデータグループの増田さんがブログを書いてくれます。
ミツモアで一緒に働きませんか?
ミツモアでは、データやAIを活用してデータドリブンな風土のある会社にて一緒に働く仲間を募集中です。
「技術で課題を解くことにワクワクできる人」や「仕組みで社会を良くしたい、そんなエンジニアになりたい人」、ぜひご応募をお待ちしています!
ミツモア採用ページ: https://corp.meetsmore.com/