BioErrorLog Tech Blog

試行錯誤の記録

OpenAI APIでGPTのstreamレスポンス | Python

OpenAI APIで、GPTのstreamレスポンスをPythonで実装する方法のメモです。

はじめに

OpenAI APIでGPTを呼び出すと、デフォルトでは全ての回答生成が終わってからレスポンスが返ってきます。

これを、ブラウザのChatGPTのように順次レスポンスをstreamで返させる方法をメモします。

# 作業環境
# openai version
0.28.0

なお本記事のコードは下記GitHubレポジトリに配置しています。

github.com

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にすることで待ち時間が短縮され、多くのケースでユーザー体験が向上します。

上手く使いこなしていきたいところです。

[関連記事]

www.bioerrorlog.work

www.bioerrorlog.work

www.bioerrorlog.work

参考

openai-cookbook/examples/How_to_stream_completions.ipynb at main · openai/openai-cookbook · GitHub

OpenAI Platform

Using server-sent events - Web APIs | MDN

python-examples/openai_stream/main.py at main · bioerrorlog/python-examples · GitHub