前書き
(Qiita初投稿です!!)
DatabricksでGenieがリリースされた直後から使用させていただく機会が多く、データやSQLに精通していない方が使うことを前提にチューニングを行なっていたため、生成精度を向上するノウハウがかなり蓄積されておりました。
培ったものを記事にして世に出そうと画策しておりましたが後回しにしてしまい結局この時期に…Databricks Advent Calendar 2024に乗っかってGenieの精度を上げるのに役立ったことを書いておきたいと思います。
Genieを教育しない場合について
当初は手を加えずにそのまま使う、というのはなかなか難しかったように思います(特にエンジニア以外の方にとっては)。
厳しいポイントとしてはクエリするテーブルの選択を誤ったり、英語で返答が来る、といったことが挙げられます。Databricksはものすごい速さでアップデートがはいっているため、現在は改善されているかもしれませんが…
当時はそのまま使うには多少なりとも精度に不安があったため、私はGenieの教育担当として色々試してみる必要があったのでした。
精度向上に役立ったこと
General Instructions
システムプロンプト的役割のGeneral Instructionsですが、私はここを充実させることに最も時間と手間を割きました。
結果的に100行近くのプロンプトを書いていました。
必要に応じて継ぎ足しを繰り返したところ膨れ上がってしまったようです。
指示としては下記のような内容を詳しめに記述していました。
- 回答は全て日本語で出力するように指示(フロントが使う想定で作り込んでいたため、集計結果列名まで日本語で出力させるように強く言い聞かせました)
* 回答は全て日本語で出力してください
* あなたが質問に回答する際に用いるテーブルの列名は全て日本語で名付けをして表示してください。このGenieワークスペースのユーザーは英語を理解できません。日本語でリネームを行うとき、jan_code AS `JANコード`のように、バッククォートで囲んでください。
↑もう少し適切な表現があるように思いますが、列名を日本語にリネームさせるのが本当に難しく、うまくいった上記プロンプトのまま現在まで放置されています。
- 売上比較を行う時に使用する列の指定(販売数量なのか金額なのか)
- 社内用語とそれに対応するロジックの説明
- 共通ロジック(集計期間指定方法など)
↑プロンプトを詳しく記載することは控えますが、生成してほしいSQLの例を交えて記載しています。
また、割合の算出は"%"で,売上金額など大きい数字を出す場合は","区切りにしてほしいとのオーダーを受けたため、その制御もシステムプロンプトで行いました。
* 売上金額など、数値を表示する場合は、処理の最後で3桁ごとにカンマ区切りに整形してください。処理の例としてはFORMAT_NUMBER(sales_quantity,0)のようになります。
* 割合や百分率を扱う場合は小数点第二位までで末尾が'%'となるような表記にフォーマットを統一してください。
しかし、集計結果の見やすさ重視で集計結果テーブルのINTをSTRINGに変更することでオートビジュアライゼーション機能を使用したビジュアル化することができなくなるためあまりおすすめはしません。
質問して、生成された結果を見てシステムプロンプトの修正・拡充を行うというプロセスをひたすら繰り返しました。
回答の精度が安定した要因のほとんどはGeneral Instructionsの内容を充実させたことにあると思うくらいにはGenieへの影響が大きい項目です。
サンプルクエリー
次に時間をかけたことはサンプルクエリーの充実です。
詳しいクエリー例を書くことは避けますが、よく集計する内容や生成がむずかしそうな質問、想定とは異なるSQLが生成された質問をサンプルクエリーに登録しました。
実際にGenieに送る質問と、サンプルクエリーに入力する質問が完全に一致していなくても、ニュアンスが似ていたらクエリー例を参考にSQLを書いてくれている印象がありました。
繰り返し投げられる質問がある場合には非常に有効なチューニング方法であると言えるでしょう。
テーブルキャプション
こちらは直接Genieに関係のある機能ではありませんが、マネージドテーブルのカラムごとに設定できるキャプションの充実も行いました。
カラムの論理名やカラムの内容、意味、集計に使用する・しないについて日本語で記入しました。
いくつか例を挙げると下記のようなイメージです。
- 値として、"0","1","2"が入る顧客情報テーブルのgenderカラムの場合
性別を表すカラム。0:不明 1:男性 2:女性
- レコードの更新日を表すupdate_atカラムの場合
レコードの更新日を表す。監査列のため基本的に集計に使用することはない。
→本当に集計に使用するタイムスタンプカラムには集計に使用する旨記入しておきます。
結果、かなり効果がありました。
私の場合、性別カラムを正しく扱わせることはシステムプロンプトをこねこねしても達成できておりませんでしたがキャプションを整備したら解決しました。
自動でキャプション情報を解釈してクエリー生成に活用してくれるGenieは天才だと思います。
キャプションとして保存した内容は各テーブルのメタデータファイルに入るんですかね🤔
フィードバック
回答を生成した後にでるgoodボタン、badボタンです。
Genieと触れ合っている中で、彼がこのフィードバックに強い影響を受けているのではないかと思うようになりました。
特に悪いフィードバックを行うと、即座に悪いフィードバックを受けたのと似た内容の生成を避けるようになった印象があります。
Genieはよくユーザーとの対話を通じて学習するAIだよ〜という話がされていると思いますが、本当にそうなんだなぁと実感しています。
あとがき
Genieの精度向上に役立ったのは、用意されていた機能のほぼ全部でした〜というような内容になってしまいました。
他のLLMを教育するよりはるかに簡単にチューニングを行うことができることが魅力だなと改めて感じました!
今後も使い倒していこうと思います!