OpenAI APIで、GPTのstreamレスポンスをPythonで実装する方法のメモです。
はじめに
OpenAI APIでGPTを呼び出すと、デフォルトでは全ての回答生成が終わってからレスポンスが返ってきます。
これを、ブラウザのChatGPTのように順次レスポンスをstreamで返させる方法をメモします。
# 作業環境 # openai version 0.28.0
なお本記事のコードは下記GitHubレポジトリに配置しています。
OpenAI APIでGPTのstreamレスポンス
下記のように実装します:
import os import openai openai.api_key = os.environ["OPENAI_API_KEY"] def main() -> None: response = openai.ChatCompletion.create( model="gpt-3.5-turbo-0613", messages=[ {'role': 'user', 'content': 'Hello?'} ], stream=True ) collected_chunks = [] collected_messages = [] for chunk in response: collected_chunks.append(chunk) chunk_message = chunk['choices'][0]['delta'].get('content', '') collected_messages.append(chunk_message) print(f"Message received: {chunk_message}") full_reply_content = ''.join(collected_messages) print(f"Full conversation received: {full_reply_content}") if __name__ == "__main__": main()
Ref. python-examples/openai_stream/main.py at main · bioerrorlog/python-examples · GitHub
まずはChatCompletion.create
に対してstream=True
のオプションを渡すことで、レスポンスをstreamにすることができます。
その上で、response
に追加されていくchunkをforループで取り出します:
collected_chunks = [] collected_messages = [] for chunk in response: collected_chunks.append(chunk) chunk_message = chunk['choices'][0]['delta'].get('content', '') collected_messages.append(chunk_message) print(f"Message received: {chunk_message}")
各chunk
は下記のフォーマットで返されるので、delta
に含まれるメッセージコンテンツをchunk['choices'][0]['delta'].get('content', '')
のようにして取り出しています。
{ "id": "chatcmpl-123", "object": "chat.completion.chunk", "created": 1677652288, "model": "gpt-3.5-turbo", "choices": [{ "index": 0, "delta": { "content": "Hello", }, "finish_reason": "stop" }] }
Ref. The chat completion chunk object - OpenAI API Reference
上記のコードの実行結果はこんな感じです:
Message received: Message received: Hello Message received: ! Message received: How Message received: can Message received: I Message received: assist Message received: you Message received: today Message received: ? Message received: Full conversation received: Hello! How can I assist you today?
OpenAIが公式に出しているサンプルコードもあるので、こちらも参照ください:
openai-cookbook/examples/How_to_stream_completions.ipynb at main · openai/openai-cookbook · GitHub
おわりに
以上、OpenAI APIでGPTのstreamレスポンスをPythonで実装する方法をまとめました。
レスポンスをstreamにすることで待ち時間が短縮され、多くのケースでユーザー体験が向上します。
上手く使いこなしていきたいところです。
[関連記事]
参考
openai-cookbook/examples/How_to_stream_completions.ipynb at main · openai/openai-cookbook · GitHub
Using server-sent events - Web APIs | MDN
python-examples/openai_stream/main.py at main · bioerrorlog/python-examples · GitHub