SQLとPythonでSnowflake LLM関数のできることに違いはあるのか?

  • 公開日:

Snowflake の LLM 関数を使うには SQL Python 2 種類の実装方法があります。どちらもエンジニアにとっては馴染みのある言語であり、自分の使いやすい方を選択することができますが、仕様の制約がある場合があります。
例えば、片方の言語でできることがもう片方ではサポートされていない、というようなことがあると選択肢が自然と絞られてきます。

そこで本ブログでは、Snowflake LLM 関数を使うための実装方法「SQL」 と「Python」について、それぞれの仕様を調査した内容をご紹介します。

Snowflake LLM 関数 とは?

Snowflake が提供する大規模言語モデル(LLM)にアクセス・利用するための関数です。LLM とともに関数も Snowflake で管理・提供されていることで、利用者は Snowflake 環境さえあればセットアップの手間をかけずすぐに使い始めることができます。

冒頭で記載の通り、現在 Snowflake LLM 関数としては SQL Python 2 種類があります。利用可能な関数など、全てを書いていくと長くなってしまうため詳細は公式ドキュメントをご確認ください。

Snowflake LLM 関数:SQL

それではここから、SQL に関して掘り下げていきます。
ここでは、LLM 関数の中で最もよく使うComplete 関数についてみていきます。基本的な構文は以下のとおりです。

SNOWFLAKE.CORTEX.COMPLETE(<model>, <prompt_or_history> [ , <options> ] )

ドキュメントではモデルを指定した上でのプロンプト実行といった基本的なことに加え、prompt_or_history 引数で role キーに system を使用した背景情報や応答スタイルの指示、 assistant を使用したステートフルな対話型体験の方法などについて解説されていました。
また、options では temperature 等のモデルのハイパーパラメーターを指定することで LLM からの解答のランダム性を制御する方法などについても言及されていました。

上述の 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. 達成感を感じる目標設定・・・

Snowflake LLM 関数:Python

次に Python について確認していきます。
こちらでも同様に 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 という別のクラスを参照するようになっています。
https://docs.snowflake.com/en/developer-guide/snowpark-ml/reference/latest/api/cortex/snowflake.cortex.CompleteOptions#snowflake.cortex.CompleteOptions
こちらを確認すると引数に temperature が存在しており、組み合わせることでハイパーパラメータの指定ができそうに見えます。

以上を踏まえ、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 文と同様の結果が返されていることが確認できます。

まとめ

Complete 関数に絞った非常に簡易な比較検証ではありましたが、SQL と Python で仕様面での大きな差異はないため、ユーザーが扱いやすい方を選択していけるように思いました。
今回は SQL/Python それぞれのワークシートを使用しましたが、Snowflake Notebook であれば、 SQL と Python のセルを組み合わせて処理を受け渡していくようなコードも書けるのではないかと思います。

本記事は、Snowflakeを中心としたデータエンジニアリング関連の技術的な情報を、弊社技術者が公開しているテックブログhttps://zenn.dev/p/datatechblogより引用しており、公開時(2024/12/22)の情報をもとに作成しています。

製品・サービスに関する詳しいお問い合わせは、弊社Webサイトからお問い合わせください。
https://data-management.dentsusoken.com/snowflake/inquiry/