Streamlit + OpenAI Assistants APIで作成したチャットアプリケーションをStreamingに対応させる
先日OpenAI Assistants APIがStreamingに対応しました。この機能により、ChatGPTのようにアシスタントの回答(途中経過)をリアルタイムに出力することが可能になります。
そこで、Streamlit + OpenAI Assistants APIでアプリケーションを組んでいる、組もうとしている人向けにStreamingへの対応方法を共有します。
ベースとなるアプリケーション
Streaming + OpenAI Assistants APIのアプリケーションがある前提とします。例えばこちらの記事にあるようなアプリケーションです。
st.chat_inputを用いた、Streamlitでよく見かける形式のチャットアプリケーションです。
OpenAI Assistants APIのStreaming機能について
公式の実装サンプルはこちらです。この実装例では、EventHandlerを用いてアシスタントのレスポンスをストリームでprint出力しています。ただこのサンプルだとStreamlitにどう組み込んでよいのか分かりづらいと思います。
Streamlitのチャットメッセージにストリーム出力させるには
Streamlitのチャットメッセージにストリーム出力させるには、v1.14.0で追加されたcreate_and_stream()ファンクションで返されるstreamオブジェクトのフィールドである、text_deltasを用います。text_deltasは生成されたレスポンスの途中経過を返すIteratorです。
またStreamlitにはv1.32.0からst.write_stream() というストリーム出力用のコンポーネントが用意されているので、このst.write_stream()の引数にstream.text_deltasを渡してあげればOKです。
with client.beta.threads.runs.create_and_stream(
thread_id=<thread_id>
assistant_id=<assistant_id>
) as stream:
st.write_stream(stream.text_deltas)
stream.until_done()
Function CallingもStreamingに対応させる
Function Callingの実行結果をアシスタントに提出するsubmit_tool_outputs()ファンクションにも、ストリーム対応版のsubmit_tool_outputs_stream()が提供されました。
これを使えば実行結果を提出後のアシスタントのレスポンスもストリーム出力可能となります。
with client.beta.threads.runs.submit_tool_outputs_stream(
thread_id=<thread_id>
run_id=<run_id>
tool_outputs = <tool_outputs>
) as tool_call_stream:
st.write_stream(tool_call_stream.text_deltas)
stream.until_done()
まとめ
以上、Streamlit + OpenAI Assistants APIのアプリケーションをStreamingに対応させる方法でした。Stream出力箇所のみの簡易的なシェアですが、参考になれば幸いです。
Header Photo by Unsplash Jonathan Kemper