スキップしてメイン コンテンツに移動

LangChainのSQLDatabaseで実現する「上司の無茶振り」自動化:Text-to-SQL実装ガイド

LangChainのSQLDatabaseで実現する「上司の無茶振り」自動化:Text-to-SQL実装ガイド

はじめに:月曜朝の「あのデータ出して」から解放されたい

週明けの朝、メールを開くと営業部長からこんな依頼が来ていませんか?
「先月の関東エリアの売上で、特にA商品を買ってくれた上位10社のリスト、今日中にちょうだい。あ、あと担当者名もつけてね」

SQLを書くこと自体は数分で終わります。でも、エンジニアのリソースをこんな「定型業務の亜種」みたいなタスクに割いていいのでしょうか? 私は常々、これをどうにか自動化して、部下たちをもっと創造的な開発業務に集中させてやりたいと思っていました。

そこで今回は、LangChainの SQLDatabase 機能を使って、自然言語(日本語)でデータベースを操作する「Text-to-SQL」の実装に挑戦します。これが完成すれば、「そのチャットボットに聞いてください」の一言で済みますからね。

基礎知識:Text-to-SQLとは?

Text-to-SQLは、文字通り「自然言語をSQLクエリに変換する」技術です。LLM(大規模言語モデル)にデータベースのスキーマ(テーブル定義)を読ませて、「このテーブル構造なら、この質問にはこういうSQLが正解だよね?」と推論させる仕組みです。

LangChainには SQLDatabase というラッパーと、それを操る create_sql_agent という便利な機能が用意されています。これらを組み合わせることで、驚くほど少ないコード量で実装可能です。ただ、便利さと危険は紙一重。「DELETE文を生成されてデータが吹き飛ぶ」なんて悪夢だけは避けなければなりません。

実装・設定:LangChainでのSQLAgent構築

では、実際にPythonで実装してみましょう。今回は安全のため、ローカルのSQLiteデータベースを使います。

1. 接続設定

まずは必要ライブラリを入れます。langchain-experimental が必要になる点に注意です。(最近パッケージ構成が変わって、ここでハマる人が多いです…)

pip install langchain langchain-openai langchain-experimental

2. エージェントの作成

コードは非常にシンプルです。データベースにつなぎ、LLMに渡すだけです。

from langchain_community.utilities import SQLDatabase
from langchain_community.agent_toolkits import create_sql_agent
from langchain_openai import ChatOpenAI

# データベース接続 (読み取り専用にしておくと安心)
db = SQLDatabase.from_uri("sqlite:///ecommerce.db")

# LLMの準備 (SQL生成にはGPT-4推奨。3.5だと複雑な結合でミスります)
llm = ChatOpenAI(model="gpt-4", temperature=0)

# エージェント作成
agent_executor = create_sql_agent(
    llm=llm,
    db=db,
    agent_type="openai-tools",
    verbose=True
)

これだけで、「先月の売上合計は?」と聞けば、勝手に SELECT sum(amount) FROM sales... のようなSQLを書いて実行し、結果を日本語で返してくれます。初めて見たときは、正直感動しました。

応用テクニック:本番運用でのコツ

しかし、現場導入には壁があります。カラム名が暗号のような英数字(c_101 とか)になっているレガシーなDB、ありますよね? LLMはエスパーではないので、これでは推論できません。

そこで custom_table_info を使って、LLMにヒントを与えます。

custom_table_info = {
    "t_users": "顧客情報テーブル。c_type=1なら法人、2なら個人。",
    "t_sales": "売上テーブル。キャンセル済みデータ(status=9)は含めないのが社内ルール。"
}
# これをdb設定時に渡すことで、社内用語や暗黙のルールを理解させます
Check: 特に「削除フラグ」のような論理削除の扱いは必ず教えておく必要があります。これ忘れると、削除済みのユーザーまでカウントしちゃって、経営会議の数字と合わない…なんて事態になりかねません(経験談)。

トラブルシューティング:AIが暴走しないために

実行時間が長すぎる

LLMが大量のレコードを全件取得しようとしてタイムアウトするケースです。プロンプトで「必ずLIMIT 10をつけること」と制約を加えるか、SQLDatabase の初期化オプションで取得行数を制限しましょう。

更新系クエリの禁止

絶対に、READ ONLY なユーザー権限でDBに接続してください。プロンプトで「更新禁止」と言っても、AIはたまに言うことを聞きません。物理的に権限を剥奪しておくのが、システム管理者の責任というものです。

まとめ:データ分析の民主化に向けて

Text-to-SQLは、エンジニア以外の人たちがデータに触れるハードルを劇的に下げてくれます。「データ分析の民主化」なんて言うとかっこいいですが、要は「簡単なことは自分でやってね」という環境を作れるということです。

もちろん、複雑な分析SQLまで任せるのは時期尚早ですが、簡単な抽出なら十分実用レベルです。まずは社内ツールの一部として、小さく導入してみてはいかがでしょうか。うまくいけば、あなたの部署の定型業務がまた一つ減るはずですよ。

この記事はAI技術を活用して作成されましたが、内容は慎重に確認されています。

コメント