こんにちは!奥津です。
以前「勝手に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に関する記事はこちら