Vanna
SQLの生成を行うRAGフレームワークです。
SQLの生成だけではなく、実行と簡単なグラフ化までやってくれます。
動作環境
- OS : Windows11
- 言語:Python3.13
- DB:MySQL
- LLM:GPT-4o
※pythonに含まれるsqliteのバージョンが低いと動作しないので、そのエラーが出る場合はpythonのバージョン上げれば動きます。
手順
事前準備
基本的には公式の手順書に従って進めればよいです。
一部ピックアップして説明します。
VannaにDBの権限を渡す。
試してないけどVannaに登録、更新、削除をさせたくない場合は参照権限のみのユーザを設定すれば大丈夫。
vn.connect_to_postgres(host='my-host', dbname='my-dbname', user='my-user', password='my-password', port='my-port')
データベースのスキーマをVannaに渡す。
公式の手順書だと「vn.train(plan=plan)」コメントアウトされてるけど、実行しないとダメ。
df_information_schema = vn.run_sql("SELECT * FROM INFORMATION_SCHEMA.COLUMNS")
plan = vn.get_training_plan_generic(df_information_schema)
vn.train(plan=plan)
以下を実行して、それっぽいデータが追加されてたらOK。
training_data = vn.get_training_data()
training_data
スキーマ以外にも、文章だったり、よく使うSQLをRAGに追加することができます。
vn.train(documentation="Our business defines OTIF score as the percentage of orders that are delivered on time and in full")
vn.train(sql="SELECT * FROM my-table WHERE name = 'John Doe'")
質問とSQLをセットで登録することも可能で、これによって質問と回答の傾向を覚えさせることができます。
vn.train(
question="What is the average age of our customers?",
sql="SELECT AVG(age) FROM customers"
)
実行
実行は以下のようにして行います。
vn.ask("昨日申込されたordersを取得してください。")
askメソッドの引数は以下のようになっており、auto_trainがTrueだと質問によって生成されたSQLが実行できた場合、Vannaの学習データに自動で追加されます。
名前 | タイプ | 説明 | 初期値 |
---|---|---|---|
question | str | 質問 | None |
print_results | bool | SQLの結果を表示するか | True |
auto_train | bool | 自動で学習させるか | True |
visualize | bool | グラフを描写するか | True |
まとめ
最初はDBをLLMで動かすためのMCPサーバ的なサービスなのかなと思いましたが、触った感じそういった側面もありつつ、メインはSQLを生成するためのRAGフレームワークだなと感じました。学習データが足りていない状態だと、事細かに命令しないと正しいSQLを出力できないのと、対話的にSQLを修正できないため、実用レベルに持っていくのは結構難しいかなというのが感想です。しかしDBのスキーマをLLMに渡して、SQLを作らせるという考えはいずれ実用化していくと思います。