[メモ]ChatGPT APIを使用してPythonでStream出力する方法

    async with aiohttp.ClientSession() as session:
        async with session.post("https://api.openai.com/v1/chat/completions", headers=headers, json=data) as response:
            if response.status == 200:
                result_area = st.empty()
                generated_text = ""
                async for chunk in response.content.iter_chunked(1024):
                    chunk = chunk.decode('utf-8')
                    lines = chunk.split('\n')
                    for line in lines:
                        if line.strip() == "":
                            continue
                        if line.startswith("data:"):
                            try:
                                data = json.loads(line[5:])
                                if data["choices"][0]["finish_reason"] is None:
                                    delta = data["choices"][0]["delta"].get("content", "")
                                    generated_text += delta
                                    result_area.markdown(generated_text)
                                else:
                                    break
                            except json.JSONDecodeError as e:
                                print(f"JSONDecodeError: {e}")
                                continue
                return generated_text
            else:
                raise Exception(f"API request failed with status code {response.status}: {await response.text()}")

このコードは、非同期HTTP POSTリクエストを使用してOpenAIのAPIにアクセスし、応答を受け取って処理するPythonスクリプトの一部です。具体的には、以下の処理を行っています:

1. aiohttp.ClientSession()を使用して非同期HTTPセッションを開始します。

2. session.post()を使用して、指定されたURL(https://api.openai.com/v1/chat/completions)に対してPOSTリクエストを送信します。このリクエストには、ヘッダーとJSON形式のデータが含まれます。

3. 応答ステータスが200(成功)の場合、応答の内容を非同期に読み取り、処理します。

  • 応答から受け取ったデータはチャンク(1024バイト単位)で処理され、デコードされてJSONオブジェクトに変換されます。

  • JSONオブジェクトから特定のデータ(data["choices"][0]["delta"].get("content", ""))を抽出し、それをgenerated_textに追加しています。

  • このデータは、result_area.markdown(generated_text)を使用してマークダウン形式で表示されます。

4. すべてのデータが処理された後、generated_textが返されます。

5. 応答ステータスが200以外の場合、エラーが発生したことを示す例外が発生します。

このコードは、OpenAIのAPIから非同期にデータを取得し、そのデータを処理してユーザーに表示するために使用されます。

みんなにも読んでほしいですか?

オススメした記事はフォロワーのタイムラインに表示されます!

最後まで読んでいただきありがとうございます!このコンテンツを気に入っていただけた方はシュンスケ式プロンプトデザインコミュニティへの参加をおススメします!7日間無料でご参加いただけますので是非お気軽にご参加ください!