❄️

Streamlit in Snowflake (SiS) でトークン数チェックアプリを作ってみた

に公開

はじめに

はじめまして。Snowflake でセールスエンジニアをしています。日頃試してみたことを皆様にお裾分けできればと思い色々と投稿していければと思います。今回は Streamlit in Snowflake で Cortex LLM のトークン数をチェックしてコスト試算ができるアプリを作ってみたいと思います。

Streamlit in Snowflake (SiS) とは?

まず Stremlit は Python のライブラリです。Streamlit を使うとシンプルな Python の記述だけで Web UI を作成することができます。本来 Web UI は HTML / CSS / JavaScript などを用いて記述する必要があるのですが、Streamlit がそれらの機能を代替してくれるイメージとなります。

こちらの App Gallery にユーザーが投稿したサンプルがあるためイメージしやすいです。

Streamlit in Snowflake は Snowflake 上で Streamlit の Web アプリを開発したり実行することが可能です。Snowflake のアカウントさえあれば触れる手軽さも魅力ですが、何より Snowflake 上のテーブルデータなどを簡単に Web アプリに組み込める点が良いところだと思います。

Streamlit in Snowflake について (Snowflake 公式ドキュメント)

Snowflake Cortex とは?

Snowflake Cortex とは Snowflake の生成 AI の機能群です。その中の Cortex LLM は Snowflake 上で稼働する大規模言語モデルを呼び出せる機能であり、SQL や Python などからシンプルな関数で色んな種類の LLM を利用することが可能となります。

Large Language Model (LLM) Functions (Snowflake Cortex) (Snowflake 公式ドキュメント)

機能概要

イメージ図

芥川龍之介先生の『蜘蛛の糸』から文章を一部お借りしました。

機能一覧

  • ユーザーが Cortex LLM のモデルを選ぶ
  • ユーザーが入力した文章の文字数やトークン数を表示
    • (LLM はモデル毎に搭載するトークナイザーが異なるため、同じ文字数でもトークン数が異なります)
  • トークン数と文字数の比率を表示
  • Snowflake のクレジット単価を掛けて概算費用を算出
    • (Cortex LLM は Snowflake のクレジット数ベースでの単価設定となっているため)

Cortex LLM の価格表 (PDF)

前提条件

  • Cortex LLM が利用できる Snowflake アカウント
  • python 3.8 以降

Cortex LLM のリージョン対応表 (Snowflake 公式ドキュメント)

ソースコード

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

# ページ設定
st.set_page_config(layout="wide")

# 現在のセッションの取得
session = get_active_session()

# アプリケーションのタイトル
st.title("Cortex AI トークン数チェックアプリ")

# AI設定
st.sidebar.title("AI の設定")
lang_model = st.sidebar.radio("使用したい言語モデルを選んでください",
                              ("deepseek-r1",
                               "claude-4-sonnet", "claude-3-7-sonnet", "claude-3-5-sonnet",
                               "mistral-large2", "mixtral-8x7b", "mistral-7b",
                               "llama4-maverick", "llama4-scout",
                               "llama3.3-70b",
                               "llama3.2-1b", "llama3.2-3b",
                               "llama3.1-8b", "llama3.1-70b", "llama3.1-405b",
                               "snowflake-llama-3.1-405b", "snowflake-llama-3.3-70b",
                               "snowflake-arctic",
                               "reka-flash", "reka-core",
                               "jamba-instruct", "jamba-1.5-mini", "jamba-1.5-large",
                               "gemma-7b",
                               "mistral-large", "llama3-8b", "llama3-70b", "llama2-70b-chat",
                               "e5-base-v2", "snowflake-arctic-embed-m", "snowflake-arctic-embed-m-v1.5",
                               "snowflake-arctic-embed-l-v2.0", "nv-embed-qa-4", "multilingual-e5-large", "voyage-multilingual-2",
                               "extract_answer", "sentiment", "summarize", "translate"
                               )
)

# トークン数を計算する関数 (Cortex用のトークンカウント関数が用意されている)
def count_tokens(model, text):
    result = session.sql(f"SELECT SNOWFLAKE.CORTEX.COUNT_TOKENS('{model}', '{text}') as token_count").collect()
    return result[0]['TOKEN_COUNT']

# トークン数チェックと料金計算
st.header("トークン数チェックと料金計算")

input_text = st.text_area("左ペインから言語モデルを選択して、トークン数をチェックしたいテキストを入力してください:", height=200)

# ユーザーに1クレジットあたりの単価を入力させる
credit_price = st.number_input("Snowflakeの1クレジットあたりの単価 (ドル) を入力してください:", min_value=0.0, value=2.0, step=0.01)

# モデルごとの1Mトークンあたりのクレジット数 (20250524 claudeは現状CORTEX.COUNT_TOKENSに未対応)
model_credits = {
    "deepseek-r1": 1.03,
    "claude-4-sonnet": 2.55,
    "claude-3-7-sonnet": 2.55,
    "claude-3-5-sonnet": 2.55,
    "mistral-large2": 1.95,
    "mixtral-8x7b": 0.22,
    "mistral-7b": 0.12,
    "llama4-maverick": 0.25,
    "llama4-scout": 0.14,
    "llama3.3-70b": 1.21,
    "llama3.2-1b": 0.04,
    "llama3.2-3b": 0.06,
    "llama3.1-8b": 0.19,
    "llama3.1-70b": 1.21,
    "llama3.1-405b": 3,
    "snowflake-llama-3.1-405b": 0.96,
    "snowflake-llama-3.3-70b": 0.29,
    "snowflake-arctic": 0.84,
    "reka-flash": 0.45,
    "reka-core": 5.5,
    "jamba-instruct": 0.83,
    "jamba-1.5-mini": 0.1,
    "jamba-1.5-large": 1.4,
    "gemma-7b": 0.12,
    "mistral-large": 5.1,
    "llama3-8b": 0.19,
    "llama3-70b": 1.21,
    "llama2-70b-chat": 0.45,
    "e5-base-v2": 0.03, 
    "snowflake-arctic-embed-m": 0.03, 
    "snowflake-arctic-embed-m-v1.5": 0.03,
    "snowflake-arctic-embed-l-v2.0": 0.05, 
    "nv-embed-qa-4": 0.05, 
    "multilingual-e5-large": 0.05, 
    "voyage-multilingual-2": 0.07,
    "extract_answer": 0.08, 
    "sentiment": 0.08, 
    "summarize": 0.1,
    "translate": 1.5
}

if st.button("トークン数を計算"):
    if input_text:
        # 文字数の計算
        char_count = len(input_text)
        st.write(f"入力テキストの文字数: {char_count}")

        if lang_model in model_credits:
            # トークン数の計算
            token_count = count_tokens(lang_model, input_text)
            st.write(f"入力テキストのトークン数: {token_count}")
            
            # 文字数とトークン数の比率
            ratio = token_count / char_count if char_count > 0 else 0
            st.write(f"トークン数 / 文字数の比率: {ratio:.2f}")
            
            # 料金計算
            credits_used = (token_count / 1000000) * model_credits[lang_model]
            cost = credits_used * credit_price
            
            st.write(f"使用クレジット数: {credits_used:.6f}")
            st.write(f"概算料金: ${cost:.6f}")
        else:
            st.warning("選択されたモデルはSnowflakeのトークン数計算機能に対応していません。")
    else:
        st.warning("テキストを入力してください。")

最後に

特に日本語を利用していると文字数とトークン数にギャップがあり見積もりが難しくなりがちです。本アプリをいつでも使えるようにすることで、サッと LLM ワークロードのコスト試算がしやすくなるのではないでしょうか?皆様のお役に立てば幸いです。

宣伝

SNOWFLAKE DISCOVER で登壇しました!

2025/4/24-25に開催されました Snowflake のエンジニア向け大規模ウェビナー『SNOWFLAKE DISCOVER』において『ゼロから始めるSnowflake:モダンなデータ&AIプラットフォームの構築』という一番最初のセッションで登壇しました。Snowflake の概要から最新状況まで可能な限り分かりやすく説明しておりますので是非キャッチアップにご活用いただければ嬉しいです!

以下リンクでご登録いただけるとオンデマンドですぐにご視聴いただくことが可能です。

生成AI Conf 様の Webinar で登壇しました!

『生成AI時代を支えるプラットフォーム』というテーマの Webinar で NVIDIA 様、古巣の AWS 様と共に Snowflake 社員としてデータ*AI をテーマに LTをしました!以下が動画アーカイブとなりますので是非ご視聴いただければ幸いです!

https://www.youtube.com/live/no9WYeLFNaI?si=2r0TVWLkv1F5d4Gs

X で Snowflake の What's new の配信してます

X で Snowflake の What's new の更新情報を配信しておりますので、是非お気軽にフォローしていただければ嬉しいです。

日本語版

Snowflake の What's New Bot (日本語版)
https://x.com/snow_new_jp

English Version

Snowflake What's New Bot (English Version)
https://x.com/snow_new_en

変更履歴

(20240709) 新規投稿
(20240830) 全体的に体裁の修正、Cortex LLM のモデルを最新化、コードの最新化
(20240901) 宣伝欄の追加
(20240926) 宣伝欄の修正、Cortex LLM のモデル llama3.2-3b llama3.2-1b jamba-1.5-large jamba-1.5-mini を追加
(20241105) Cortex LLM のモデル llama3.2-3b llama3.2-1b jamba-1.5-large jamba-1.5-mini の価格が公開されたため修正
(20250110) 宣伝欄の修正、Cortex LLM のモデル claude-3-5-sonnet を追加
(20250111) python ライブラリの依存関係に関する注意事項を追記
(20250119) Cortex LLM のモデル snowflake-llama-3.3-70b snowflake-llama-3.1-405b を追加
(20250228) 不要なライブラリがあったので削除、Cortex LLM のモデル llama3.3-70b deepseek-r1 を追加、LLM のモデルを全体的に並べ替え
(20250508) 宣伝文修正
(20250510) Cortex LLM のモデル claude-3-7-sonnet を追加、deepseek-r1 の価格低減に合わせて単価修正、イメージ画像が古かったため差し替え
(20250524) Cortex LLM のモデル claude-4-sonnet を追加 (但し現時点では Claude のモデルは全て COUNT_TOKENS 関数に未対応)、Cortex LLM のモデル llama4-maverick llama4-scout を追加、Cortex EMBED TEXT のモデル e5-base-v2 snowflake-arctic-embed-m snowflake-arctic-embed-m-v1.5 snowflake-arctic-embed-l-v2.0 nv-embed-qa-4 multilingual-e5-large voyage-multilingual-2 を追加、Cortex 専用関数のモデル extract_answer sentiment summarize translate を追加

Discussion