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
解説: 画面の作り込みができないのは設計上の割り切りで、試作の速さと引き換えです。