Streamlit

Streamlitとは

Streamlit は、[[Python]] のスクリプトをそのままWeb画面にするライブラリです。HTMLもCSSもJavaScriptも書きません。

import streamlit as st

question = st.text_input('質問を入力')
top_k = st.slider('参照する件数', 1, 10, 3)

if question:
    docs = search(question, top_k)
    answer = generate(question, docs)
    st.write(answer)
    with st.expander('参照した文書'):
        for d in docs:
            st.markdown(f'- {d.title}')

用途は明確で、AIや分析の試作を「触れる形」にすることです。[[RAG(検索拡張生成)]] の検索件数を変えたときの答えの違いを、その場で試してもらう — こうした場面で真価が出ます。

「上から下まで再実行する」モデル

Streamlit の挙動は独特です。操作のたびにスクリプト全体を先頭から再実行します。

イベントハンドラを登録するのではなく、「今の入力値で全部計算し直す」だけです。書き方は素直になりますが、そのままだと毎回すべての重い処理が走ります。

@st.cache_resource       # モデルなど、1度読めば使い回すもの
def load_model():
    return SentenceTransformer('...')

@st.cache_data           # 引数が同じなら結果を再利用するもの
def fetch_docs(query: str):
    return vector_store.search(query)

キャッシュを付け忘れると、スライダーを1つ動かすたびにモデルを読み込み直します。 Streamlit で最初に必ず踏むのがここです。

再実行を跨いで値を保持したいときは st.session_state を使います。会話履歴のように積み上がるものは、ここに置きます。

何に向いていて、何に向かないか

向いている向かない
社内向けのデモ・検証ツール一般公開する製品UI
データ分析の結果共有細かいレイアウト要求がある画面
[[生成AI・LLM]] の挙動を関係者に触ってもらう同時利用者が多いサービス

画面の作り込みはほとんどできません。 それは欠点ではなく設計で、「見た目に時間を使わせない」ことで試作を速くしています。製品UIが必要になった時点で、通常のWebアプリへ作り直す前提で使います。

同じ「Pythonだけで画面」でも、[[Tkinter/ttkbootstrap(デスクトップGUI)]] はローカルで動くデスクトップアプリ、Streamlit はブラウザで開く共有可能なURL、という違いがあります。

実務での注意点

  • 状態はセッション単位 — 利用者ごとに独立します。全員で共有したいデータは外部に置きます
  • 秘密情報を画面に出さない — デモは関係者に共有されます。APIキーや個人情報が表示・ログ出力されていないか確認します
  • 重い処理には進捗を出す — st.spinner や st.status が無いと、固まったように見えます
  • [[プロンプトエンジニアリング]] の比較に使う — プロンプトを入力欄にすると、その場で書き換えて結果を比べられます。文書に書くより速く合意できます

関連技術とのつながり

  • [[Python]] — スクリプトがそのまま画面になる。既存の分析コードを流用できる
  • [[RAG(検索拡張生成)]] — 検索件数やプロンプトを変えた結果を、その場で比較させる用途
  • [[生成AI・LLM]] — 挙動を関係者に触ってもらうための最短経路
  • [[プロンプトエンジニアリング]] — 入力欄にして試行の回転を上げる
  • [[Tkinter/ttkbootstrap(デスクトップGUI)]] — 同じくPythonだけで作るが、配布形態が違う
Q: Streamlitの実行モデルとして正しいのはどれ?
- [ ] イベントハンドラを登録して差分だけ更新する
- [x] 操作のたびにスクリプト全体を先頭から再実行する
- [ ] 初回のみ実行し、以降は静的に表示する
解説: 書き方は素直になりますが、キャッシュを付けないと毎回すべての重い処理が走ります。

Q: `st.cache_resource` を付ける対象として適切なのはどれ?
- [x] 1度読み込めば使い回せる機械学習モデル
- [ ] 利用者ごとに違う会話履歴
- [ ] 毎回変わる乱数
解説: 会話履歴のように再実行を跨いで保持したい値は `st.session_state` を使います。

Q: Streamlitが向かない用途はどれ?
- [ ] 社内向けのデモツール
- [ ] 分析結果の共有
- [x] 細かいレイアウト要求がある一般公開の製品UI
解説: 画面の作り込みができないのは設計上の割り切りで、試作の速さと引き換えです。