見出し画像

SnowflakeでChatGPTを呼び出してみた

分析屋の中田(ナカタ)です。
SnowflakeでChatGPTのAPIを呼び出してみました。


今回やること

ユーザー定義関数(以下、UDF)を作成します。
内容としては、ChatGPTのAPIを呼び出して
テーブルの文字列に対してネガティブかポジティブかを判定させる、いわゆるネガポジ分析を行います。

一部のリージョンではプレビュー版で類似の関数が展開されていますが
いくつかの文章を試してみたところ、現時点ではChatGPTの方が精度が高そうでした。
いったん、がんばってChatGPTを呼び出してみることにします。
参考:LLMの関数呼び出し | Snowflake Documentation

環境

Snowflakeのエディション:エンタープライズ版
クラウド:AWS(東京リージョン)

事前準備

ChatGPTのAPIを呼び出すために課金が必要です。
ChatGPTの課金と言っても、月額20ドルのChatGPT Plusの話ではなく
OpenAIのサイトからAPI利用料金をチャージしておく必要があります。

OpenAIの公式サイトで初回登録時に無料枠として18ドル分が付与されるようですが
私は登録から1年以上経過しており失効していました。
やむなく10ドル分のクレジットをチャージしてお試しすることにしました。

OpenAIの公式サイトは以下のリンクです。
画面右上の「Sign up」から登録できます。

https://platform.openai.com/docs/overview

私の場合はサイドバーからUsageページを開くと、以下のような画面になっています。

①ネットワークルール

ここからはSnowflake側で作業します。

以下は、SnowflakeからOpenAIのAPIにアクセスすることを許可するネットワークルールを作成しています。
Snowflakeではネットワークルールはオブジェクトとして扱われます。

CREATE OR REPLACE NETWORK RULE my_access_rule
  MODE = EGRESS
  TYPE = HOST_PORT
  VALUE_LIST = ('api.openai.com'); 

詳しい作成方法は公式ドキュメントをご参照ください。

②シークレット

CREATE OR REPLACE SECRET my_openai_apikey
    TYPE = password
    USERNAME = 'sample'
    PASSWORD = '********'
;

APIキーをUDFにベタ打ちしないためにシークレットオブジェクトを作成します。
通常はログイン認証情報を書き込む用途なのですが、今回は
USERNAME:適当なもの
PASSWORD:APIキー
を指定します。

③外部アクセス統合

ここまでで作ったネットワークルールとシークレットを統合します。
外部アクセス統合はUDFで使用されます。

CREATE OR REPLACE EXTERNAL ACCESS INTEGRATION my_integration
  ALLOWED_NETWORK_RULES = (my_access_rule)
  ALLOWED_AUTHENTICATION_SECRETS = (my_openai_apikey)
  ENABLED = true
;

④UDF定義

CREATE OR REPLACE FUNCTION gpt_sentiment(comment_col varchar)
RETURNS STRING
LANGUAGE PYTHON
RUNTIME_VERSION = 3.8
HANDLER = 'get_snowflake_answer'
EXTERNAL_ACCESS_INTEGRATIONS = (my_integration)
SECRETS = ('openai_key' = my_openai_apikey )
PACKAGES = ('openai==0.27.4')
AS
$$
import _snowflake
import openai
def get_snowflake_answer(comment_text):
    # Snowflakeの認証情報を取得
    sec_object = _snowflake.get_username_password('openai_key')
    openai.api_key = sec_object.password
    
    question = f'「{comment_text}」という言葉が「ポジティブ」か「ニュートラル」か「ネガティブ」か1単語で回答してください。'
    # Snowflakeに関連する質問をOpenAIに送信
    messages = [{"role": "user", "content": f"Snowflake: {question}"}]
    model = "gpt-4"
    response = openai.ChatCompletion.create(model=model, messages=messages, temperature=0)
    
    # OpenAIからの回答を取得
    answer = response.choices[0].message["content"]
    
    return answer
$$;

ChatGPT Plusを使用しており、Chat-GPT4が使えるため
modelの部分はgpt-4を指定しました。
gpt-3.5-turboに書き換えてもOKです。

プロンプトは工夫の余地があると思います。
文字列を受け取って、強引にネガポジを分類させています。

検証

以下のようなテーブルを用意しました。

SELECT * FROM SAMPLE_TEXT;

先ほど作成したgpt_sentiment関数を使用してみます。

SELECT 
    comment_col
    ,gpt_sentiment(comment_col)
FROM sample_text
;

無事、分類できました!
サンプルが少ないですが、私の感性が正しければ全問正解していると思います。

最後に

プロンプトを工夫すれば、他にも多様な使い方ができそうです!
ちょっとしたお試し程度なら大丈夫なはずですが、API利用料金の状況はこまめに公式サイトで確認しましょう!



ここまでお読みいただき、ありがとうございました!
この記事が少しでも参考になりましたら「スキ」を押していただけると幸いです!

これまでの記事はこちら!

株式会社分析屋について

弊社が作成を行いました分析レポートを、鎌倉市観光協会様HPに掲載いただきました。

ホームページはこちら。

noteでの会社紹介記事はこちら。

【データ分析で日本を豊かに】
分析屋はシステム分野・ライフサイエンス分野・マーケティング分野の知見を生かし、多種多様な分野の企業様のデータ分析のご支援をさせていただいております。 「あなたの問題解決をする」をモットーに、お客様の抱える課題にあわせた解析・分析手法を用いて、問題解決へのお手伝いをいたします!

【マーケティング】
マーケティング戦略上の目的に向けて、各種のデータ統合及び加工ならびにPDCAサイクル運用全般を支援や高度なデータ分析技術により複雑な課題解決に向けての分析サービスを提供いたします。

【システム】
アプリケーション開発やデータベース構築、WEBサイト構築、運用保守業務などお客様の問題やご要望に沿ってご支援いたします。

【ライフサイエンス】
機械学習や各種アルゴリズムなどの解析アルゴリズム開発サービスを提供いたします。過去には医療系のバイタルデータを扱った解析が主でしたが、今後はそれらで培った経験・技術を工業など他の分野の企業様の問題解決にも役立てていく方針です。

【SES】
SESサービスも行っております。


この記事が参加している募集

やってみた