SQLとPythonでSnowflake LLM関数のできることに違いはあるのか?
はじめに
本記事は Snowflake アドベントカレンダー 22 日目の記事です。
Snowflake の LLM 関数を使うには SQL と Python の 2 種類の実装方法があります。どちらもエンジニアにとってはお馴染みの言語であり自分の使いやすい方を選択することができますが、仕様の制約というか片方の言語でできることがもう片方ではサポートされていないというようなことがあると選択肢が自然と絞られてきます。
というようなことを考えていたら SQL と Python それぞれの現時点での仕様に少し興味が湧いてきたので、学習がてらドキュメントと実機操作で簡単に確認してみました。
1. Snowflake LLM 関数 とは?
Snowflake が提供する大規模言語モデル(LLM)にアクセス・利用するための関数です。LLM とともに関数も Snowflake で管理・提供されていることで、利用者は Snowflake 環境さえあればセットアップの手間をかけずすぐに使い始めることができます。
冒頭で記載の通り、現在 Snowflake LLM 関数としては SQL と Python の 2 種類があります。利用可能な関数など、全てを書いていくと長くなってしまうため詳細は公式ドキュメントをご確認ください。
2. SQL
それではここから、SQL に関して掘り下げていきます。
ドキュメント(SQL)
SQL の LLM 関数については以下で説明されています。
ここでは、LLM 関数の中で最もよく使うであろう Complete 関数についてみていきます。基本的な構文は以下のとおりです。
SNOWFLAKE.CORTEX.COMPLETE(<model>, <prompt_or_history> [ , <options> ] )
ドキュメントではモデルを指定した上でのプロンプト実行といった基本的なことに加え、prompt_or_history 引数で role キーに system を使用した背景情報や応答スタイルの指示、 assistant を使用したステートフルな対話型体験の方法などについて解説されていました。
また、options では temperature 等のモデルのハイパーパラメーターを指定することで LLM からの解答のランダム性を制御する方法などについても言及されていました。
実機確認(SQL)
上述の SQL 文を実機で動かしてみます。Snowsight にログイン後、SQL ワークシートで以下を実行します。
SELECT response:"choices"[0]:"messages"
FROM (
SELECT SNOWFLAKE.CORTEX.COMPLETE(
'mistral-large2',
[
{'role': 'system', 'content': '小学生向けの家庭教師'},
{'role': 'user', 'content': '生徒が自発的に勉強するようにするためのアイディアを3つあげてください'}
],
{'temperature': 0.9}
) AS response
);
SELECT 句の中で Complete 関数を呼び出しており、モデルは mistral-large2 を指定しています。プロンプトの中では system キーの中で小学生向けの家庭教師というロールを指定した上で勉強のためのアイディア出しを尋ねています。また、ハイパーパラメータとして temperature を 0.9 にセットしています。
問合せに対する実行結果は以下になります。(長いので冒頭のみ抜粋)
もちろんです!以下は、小学生が自発的に勉強するようになるための 3 つのアイディアです。\n\n1. 興味を引く活動を取り入れる:\n - 生徒の興味や趣味に合わせた学習活動を提案します。例えば、恐竜が好きな子どもには、恐竜に関する読書やプロジェクトを取り入れることで、自然と学習意欲が高まります。\n - ゲーム化した学習ツールやアプリを利用することで、楽しみながら学べる環境を提供します。\n\n2. 達成感を感じる目標設定・・・
3. Python
次に Python について確認していきます。
ドキュメント(Python)
Python の LLM 関数については以下で説明されています。
こちらでも同様に Complete 関数についてみていきます。基本的な構文は以下のとおりです。
snowflake.cortex.Complete(model: Union[str, Column], prompt: Union[str, List[ConversationMessage], Column], *, options: Optional[CompleteOptions] = None, session: Optional[Session] = None, stream: bool = False, timeout: Optional[float] = None, deadline: Optional[float] = None) → Union[str, Iterator[str], Column]
モデルやプロンプトなど基本的は引数は SQL と同じですが、Python では options という引数があり CompleteOptions という別のクラスを参照するようになっています。
こちらを確認すると引数に temperature が存在しており、組み合わせることでハイパーパラメータの指定ができそうに見えます。
実機確認(Python)
以上を踏まえ、Python でも実機確認をしてみます。同じく Snowsight で今度は Python ワークシートを開き、事前準備として snowflake-ml-python というパッケージをインストールしておきます。また、今回は LLM の単一応答を確認するだけのため、main 関数の戻り値は String に変更します。
実行する Python スクリプトは以下になります。
from snowflake.cortex import Complete
from snowflake.cortex import CompleteOptions
def main(session: snowpark.Session):
model_name = 'mistral-large2'
messages = [
{'role': 'system', 'content': '小学生向けの家庭教師'},
{'role': 'user', 'content': '生徒が自発的に勉強するようにするためのアイディアを3つあげてください'}
]
options_tmp = CompleteOptions(temperature=0.9)
response = (Complete(model_name, messages , options=options_tmp))
return response
Complete と CompleteOptions を組み合わせることで、SQL 文のときと同じ問合せを表現しています。
問合せに対する実行結果は以下になります。(長いので冒頭のみ抜粋)
小学生が自発的に勉強するようにするためには、楽しさや達成感、興味を引くことが大切です。以下に 3 つのアイディアを挙げます。1. ゲームや趣味を取り入れる:- クイズゲーム:数学や歴史、科学などの問題をクイズ形式で出題することで、ゲーム感覚で勉強を楽しむことができます。- ボードゲーム:教育的なボードゲームを使うことで、学習内容を楽しみながら理解することができます。- アプリやオンラインゲーム:教育アプリやオンラインゲームを活用して、勉強をゲーム感覚で楽しむことができます。2. 目標設定と報酬システム・・・
SQL 文と同様の結果が返されていることが確認できます。
4. まとめ
Complete 関数に絞った非常に簡易な比較検証ではありましたが、SQL と Python で仕様面の差異は特に無く自分の扱いやすい方を選択していけるように思いました。
今回は SQL/Python それぞれのワークシートを使用しましたが、Snowflake Notebook であれば SQL と Python のセルを組み合わせて処理を受け渡していくようなコードも書けそうな気がするので、今後はそういったことにもチャレンジしていけるといいなと思います。
Discussion