Snowflake Arcticを試してみる

## 最初に

この記事はスピード重視でとりあえず試してみた記録です。  
Snowflake社が開発したLLMであるSnowflake ArcticをローカルのPython環境から呼び出すまでの手順をメモしました。  

## Snowflakeの設定

まずはオレゴン(aws_us_west_2)のアカウントを作成します。

```sql
-- ORGADMINにならないと操作できない
USE ROLE ORGADMIN;

-- アカウント一覧を確認
SHOW ORGANIZATION ACCOUNTS;

-- オレゴンのリージョン名を確認する
SHOW REGIONS;
SELECT * FROM TABLE(RESULT_SCAN(LAST_QUERY_ID())) WHERE "display_name" like '%Oregon%';

-- オレゴンにアカウントを作成する
CREATE ACCOUNT TEST_OREGON
    ADMIN_NAME = sakatoku
    ADMIN_PASSWORD = 'ここにパスワードを記載'
    EMAIL = 'ここにメールアドレスを記載'
    MUST_CHANGE_PASSWORD = TRUE
    EDITION = STANDARD
    REGION = 'aws_us_west_2';
```

次にオレゴンのアカウントにログインして設定を進めます。  

```sql
-- ACCOUNTADMINで設定開始する
USE ROLE ACCOUNTADMIN;

-- Snowflake Cortexを実行するためのロールを作成する
CREATE ROLE cortex_user_role;
GRANT DATABASE ROLE SNOWFLAKE.CORTEX_USER TO ROLE cortex_user_role;
-- ロールをユーザに紐づける
GRANT ROLE cortex_user_role TO USER sakatoku;

-- ウェアハウスを作成する。先ほど作成したロールから使えるようにする
CREATE WAREHOUSE IF NOT EXISTS compute_wh WAREHOUSE_SIZE = XSMALL;
GRANT USAGE ON WAREHOUSE compute_wh TO ROLE cortex_user_role;
-- Pythonから接続したときに自動的にウェアハウスが選択されるようにする
ALTER USER sakatoku SET DEFAULT_WAREHOUSE = compute_wh;
-- このセッションでもいま作成したウェアハウスを使用する
USE WAREHOUSE compute_wh;

-- 先ほど作成したロールを選択する
USE ROLE cortex_user_role;

-- 動作確認する
-- Cortex LLM Functionsの実行：Snowflake Arcticを呼び出す(COMPLETE関数)
SELECT SNOWFLAKE.CORTEX.COMPLETE('snowflake-arctic',
    [
        {
            'role': 'user',
            'content': '家系ラーメンの特徴を教えてください。'
        }
    ],
    {
        'temperature': 0.5
    });
```

ここまででSnowsightからSnowflake Cortex LLM Functionsを介してSnowflake Arcticを呼び出せるようになっています。  

## Python環境の構築

以下はAnaconda環境での構築を想定しています。  
Anaconda環境なのですが、新しいライブラリを使う必要があることから、pipでパッケージを導入しています。  

```sh
conda create -n arctic python=3.8
conda activate arctic
pip install snowflake-connector-python snowflake-snowpark-python snowflake-ml-python[all] streamlit
```

## Pythonプログラムの実装

Streamlitでプロンプトを入力するプログラムを作成します。  

```py:arctic_st.py
# 環境構築コマンド
# conda create -n arctic python=3.8
# conda activate arctic
# pip install snowflake-connector-python snowflake-snowpark-python snowflake-ml-python[all] streamlit

# 実行コマンド
# streamlit run arctic_st.py

import streamlit as st
import snowflake.connector
import snowflake.snowpark as snowpark
import snowflake.cortex as cortex

# ローカルPython環境からSnowflakeに接続するための関数
@st.cache_resource
def connect_snowflake():
    # Snowflakeに接続する
    # 注意！本来はここに指定するパラメータをハードコーディングしてはいけない
    connection = snowflake.connector.connect(
        user='sakatoku',
        password='ここにパスワードを記載',
        account='XXXXXXX-TEST_OREGON (アカウント識別子のドット.をハイフン-に変えたものを記載)',
        role='cortex_user_role',
        warehouse='compute_wh')

    # Snowparkセッションを作成する
    snowpark.Session.builder.configs({"connection": connection}).create()

# ユーザにプロンプトを入力させる
prompt = st.chat_input("Say something")

if prompt:
    # プロンプトを表示
    with st.chat_message("user"):
        st.write(prompt)

    # Snowflakeに接続する
    connect_snowflake()

    # Snowflake Cortex LLM Functionsを呼び出してレスポンスを取得する
    # 注意！現在は指定できるのはモデルの種類とプロンプトのみ
    # これは指定できない：options = {"temperature": 0.5}
    response = cortex.Complete("snowflake-arctic", prompt)

    # レスポンスを表示
    with st.chat_message("arctic"):
        st.write(response)
```

このプログラムを```streamlit run arctic_st.py```で起動させます。  

![arctic_st](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917580/74f4df05-59a8-a6c3-981d-f9a944cd32a2.png)

動きました！