【Snowflake】External Network Accessを使ってGPTをStreamlit in Snowflakeで使う

【Snowflake】External Network Accessを使ってGPTをStreamlit in Snowflakeで使う | Tableau-id Press -タブロイド-
snowflake-logo-1200x630-960x504

こんにちは!奥津です。

以前「勝手にSQLを書いてくれるチャットボットをStreamlitでやってみた(デモ)」という記事では、チャットボットをローカルのStreamlitで実装しました。

本当はこれをSnowflake上のStreamlitで作成したいと考えていました。

これが9月にパブリックプレビューになったExternal Network Accessを使うと、Snowflake in Streamlitでもチャットボットを実装できるようです。

既にSnowflakeからもデモが公開されています。

Getting Started with Generative AI in Snowflake and Streamlit

今日はその準備で、まずGPTのAPIをStreamlit in Snowflakeで使ってみようと思います。

やりたいこと

GPTを使えるかを試すために、以下のコードをローカルのStreamlitで実行してみます。

「What is Streamlit?」とGPTに投げてます。

import streamlit as st
import openai

OPEN_API_KEY="自分のキー"
openai.api_key = OPEN_API_KEY

completion = openai.ChatCompletion.create(
  model="gpt-3.5-turbo",
  messages=[
    {"role": "user", "content": "What is Streamlit?"}
  ]
)

st.write(completion.choices[0].message.content)

そうすると、こんな感じで、回答がStreamlitに表示されます。

ただこれをそのままStreamlit in Snowflakeで実行すると、以下のようにエラーになります。

外部への接続が設定されてないからですね。

そこでExternal Network Accessを使ってみようというわけです。

External Network Accessの設定・UDFの作成

External Network Accessについては弊社三村が先日記事にしています。これと最初のデモを参考にして、

External Network Accessを設定し、GPT用のUDFを作成します。

Snowflake External Network Access ~Notion~

--External Network Accessの設定

CREATE OR REPLACE SECRET dash_open_ai_api
TYPE = GENERIC_STRING
SECRET_STRING = '自分のキー';

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

--accountadmin
CREATE OR REPLACE EXTERNAL ACCESS INTEGRATION dash_external_access_int
ALLOWED_NETWORK_RULES = (dash_apis_network_rule)
ALLOWED_AUTHENTICATION_SECRETS = (dash_open_ai_api)
ENABLED = true;

--UDFの作成
CREATE OR REPLACE FUNCTION CHATGPT_4(query varchar)
RETURNS STRING
LANGUAGE PYTHON
RUNTIME_VERSION = 3.9
HANDLER = 'complete_me'
EXTERNAL_ACCESS_INTEGRATIONS = (dash_external_access_int)
SECRETS = ('openai_key' = dash_open_ai_api)
PACKAGES = ('openai')
AS
$$
import _snowflake
import openai
def complete_me(QUERY):
openai.api_key = _snowflake.get_generic_secret_string('openai_key')
messages = [{"role": "user", "content": QUERY}]
model="gpt-4"
response = openai.ChatCompletion.create(model=model,messages=messages,temperature=0,)
return response.choices[0].message["content"]
$$;

これで準備が整いました。

StreamlitでUDFを呼び出す

Streamlit in Snowflakeで以下のコードを実行します。

import streamlit as st
from snowflake.snowpark.context import get_active_session

session = get_active_session()

ret = session.sql(f"SELECT CHATGPT_4('What is Streamlit?') as chatgpt_4_response;").collect()

st.write(ret)

実行結果がこちら。

ちゃんと返事が返ってきました。

さいごに

ちゃんとStreamlit in SnowflakeでGPTを使った結果を表示できることがわかりました。

次回は実際にチャットボット化にチャレンジしようと思います。

truestarではSnowflakeの検討、導入支援や環境構築からアプリ開発まで幅広くサポート可能です。

Snowflakeに゙興味がある、導入済みだけどもっとうまく活用したい等々ありましたら、ぜひこちらから相談ください!

これまでのSnowflakeに関する記事はこちら