はじめに
StreamlitはPythonだけでフロントエンドを含めたWebアプリケーションを構築できるフレームワークです。
開発元が今後の機能追加予定をロードマップとして公開しており、その中でも個人的に注目している機能をまとめてみようと思います。
※タイトルと内容は日本語訳しています。
2023 年 11 月 – 2024 年 1 月
🌕非全画面チャット レイアウト
コンテナ、エキスパンダー、サイドバーなどでチャット メッセージとチャット入力を使用します。
現在はサイドバーには配置できず、メイン画面のみです。
その他のコンポーネントとの組み合わせの相性もイマイチな印象です。。
サイドバー上にLLMとのチャット機能を配置してメイン画面のコンテンツを描画する。など、使い方が広がりそうです。
🏃♀️st.download_button をクリックしても再実行しない
Streamlitではpandasのデータフレームなどを直接指定して表形式で表示したり、ローカルにダウンロードできたりしますが、データフレームにフィルタなどをかけてその結果をダウンロードしたい。といった場合はフィルタの内容などをsession_stateに入れておかないとリセットされてしまいます。(ボタンを押すという動作で処理全体が再実行されるため。)
2024 年 2 月~4 月
🏗️st.dialog
Streamlit アプリでモーダルまたはダイアログを開きます。
streamlit-modalという外部ライブラリで代用できますが、他のコンポーネントと組み合わせるとおかしな挙動をしたりするので、ネイティブでのサポートは期待できます。
https://pypi.org/project/streamlit-modal/
🎽スピード + パフォーマンス イニシアチブ
Streamlit を実行して、より速く見えるようにします。
Streamlitでは、あらゆるアクションにおいて、処理全体を再実行するように設計されています。
キャッシュなどを駆使して再実行の速度を上げたとしても辛い部分があります。
このあたりが改善されるのかはわかりませんが、パフォーマンスの向上は楽しみです。
🧑🎨視覚的なカスタマイズ
アプリの外観をカスタマイズするためのその他のオプション。
現在はst.components.v1.html等で無理やり?CSSを上書きしたりすることで一定のカスタマイズはできますが、hackyな印象は否めません。
コンポーネントごとに指定できると表現の幅が大きく広がりそうです。
未来
🌹st.file_uploader が、UploadedFile の代わりにファイル パスを返せるようにする
これはRAG1 を行うときに困るのですが、st.file_uploaderでドキュメントをアップロードしてもそのままはLangChainやLlamaIndexのファイルローダーでは読み込めません。あくまでパスを指定する必要があるためです。
そのため、以下のようにしてパスを指定する必要があります。
if uploaded_file :
#use tempfile because CSVLoader only accepts a file_path
with tempfile.NamedTemporaryFile(delete=False) as tmp_file:
tmp_file.write(uploaded_file.getvalue())
tmp_file_path = tmp_file.name
loader = CSVLoader(file_path=tmp_file_path, encoding="utf-8", csv_args={
'delimiter': ','})
data = loader.load()
※引用
⏱️st.download_button の遅延データロード
st.download_button は関数を受け入れますが、この関数はクリックされたときにのみ実行されます。
重いデータを扱うと、ダウンロードボタンを押さなくても処理全体が重くなってしまいます。
そのため、通常のボタンのon_clickで関数を指定して関数内でpandasのto_csvなどで出力させたり、ひと手間かかります。
🪓st.selectbox および st.multi_select で新しい項目を受け入れる
streamlit-tagsで同じようなことができますが、公式でのサポートには期待です。
🎣st.dataframe の遅延データ読み込み
st.dataframe は、スクロール中にデータベースからデータを遅延読み込みできます。
巨大なデータを表示しようとすると、レンダリングに非常に時間がかかります。
こういった場合、画面にレンダリングするレコードは少数にしておいて、サーバーサイドでフィルタしたり、ソートする必要があります。D-tale みたいな感じで読み込めるようになることを期待しています。
おわりに
相変わらず1ヶ月スパンでバージョンアップされており、どんどん機能が追加されています。
公式がハッカソンなども開催しておりこれからも盛り上がっていきそうです!
-
Retrieval Augment Generationの略
外部の知識ベースから事実を検索して、最新の正確な情報に基づいて大規模言語モデル(LLM)に回答を生成させること ↩