【OpenAI】ストリーミングを使用したOpenAI ChatCompletionの使い方

1. ストリーミングとは

インターネットやネットワーク上でデータを逐次的に送信および受信する方法を指すストリーミングは、現代のデジタルコンテンツ配信やデータ処理の重要な手法となっています。ストリーミングでは、データを連続的なフローとして送信し、受信側はデータの一部を逐次的に処理します。

1.1 ストリーミングの基本概念

ストリーミングでは、データはブロックやパケットのような小さな単位に分割され、連続的に送信されます。受信側はデータの一部を受け取ると同時に処理を開始し、データが届くたびに逐次的に処理を行います。これにより、受信側はデータを待つことなく、処理や再生を開始できます。

1.2 ストリーミングの利点と応用範囲

ストリーミングの利点は、次のような点があります。

1.2.1 リアルタイム性

ストリーミングはリアルタイム性に優れています。データが逐次的に送信されるため、受信側はデータの一部を受け取るとすぐに処理を開始できます。これにより、リアルタイムの応答やストリーミングメディアの再生が可能となります。

1.2.2 長大なデータの効率的な処理

大きなデータセットや長大なコンテンツを一度に処理することは困難な場合があります。ストリーミングではデータを小さなチャンクに分割して送信するため、受信側は逐次的にデータを処理できます。これにより、データの一部を受け取った時点で処理を開始し、結果を待つことなく進捗を表示したり、データの一部を利用したりできます。

ストリーミングを行うことで、ユーザーにフラストレーションを減らし円滑なコミュニケーションを行うことが可能になります。

2. OpenAI ChatCompletion APIの概要

OpenAI ChatCompletion APIは、OpenAIが提供する自然言語処理APIの一つです。ChatCompletion APIを使用すると、ユーザーとAIの対話をシミュレートし、自然な応答を生成することができます。ChatCompletion APIは、AIモデルを使用してテキスト生成タスクを実行し、対話の流れに沿って文を生成します。

2.1 ChatCompletion APIとは

ChatCompletion APIは、会話のコンテキストに基づいてAIとの対話を行うためのAPIです。ユーザーのメッセージとAIの応答を交互に提供することで、自然言語の対話を実現します。APIを使用する際には、ユーザーのメッセージとAIの初期メッセージを含むリクエストを作成し、APIに送信します。APIはそれに応じて応答を生成し、結果を返します。

2.2 ChatCompletionの基本的な使い方と応答の形式

ChatCompletion APIを使用するには、以下の基本的な手順に従います:

  • リクエストの作成: APIに送信するリクエストを作成します。リクエストには、ユーザーのメッセージとAIの初期メッセージを含める必要があります。
  • リクエストの送信: 作成したリクエストをChatCompletion APIに送信します。
  • 応答の取得: APIからの応答を受け取ります。応答には、AIから生成された応答のテキストが含まれています。
  • 応答の処理: 受け取った応答を処理し、必要に応じて表示や後続の処理に利用します。

ChatCompletionの応答は、response[‘choices’][0][‘message’][‘content’]を通じて取得できます。応答はテキスト形式で提供され、AIの生成結果が含まれています。この応答を適切に解析して、ユーザーとの対話の流れを維持しましょう。

以上がOpenAI ChatCompletion APIの概要と基本的な使い方です。APIを活用することで、よりリアルな対話システムを構築したり、自然言語の生成タスクを効果的に実行したりすることが可能です。

3. ストリーミングChatCompletionの活用方法

ストリーミングを使用することで、OpenAI ChatCompletion APIをより効果的に活用することができます。ストリーミングを使用すると、AIの応答を逐次的に受け取りながら処理や表示を行うことができます。

3.0 事前準備

任意のディレクトリで下記を実行

仮想環境の構築

python -m venv env

source env/bin/activate cd env

必要なライブラリのinstall

pip install python-dotenv

pip install openai

open AIのAPIkeyの保存

touch .env

.envファイルにAPIKEYを記入

OPENAI_API_KEY="sk-xxxxx"

下記のようなディレクトリが完成

3.1 ChatCompletionにおけるストリーミングの利用方法

ChatCompletion APIでは、リクエスト時にstream=Trueを設定することで、ストリーミングを有効にすることができます。これにより、AIの応答が逐次的に送信され、処理の進捗をリアルタイムに把握することができます。

以下にPythonのコードを示しながら、ストリーミングChatCompletionの利用方法を説明します。

OpenAI ChatCompletion APIのストリーミングリクエストの例

https://platform.openai.com/docs/guides/chat

# リクエストを送信する前の時間を記録

start_time = time.time()




# ChatCompletion APIに対してストリーミングリクエストを送信

response = openai.ChatCompletion.create(

    model='gpt-3.5-turbo',

    messages=[

        {'role': 'user', 'content': 'hello world in one words'}

    ],

    temperature=0,

    stream=True  # ストリーミングを有効にするためにstream=Trueを設定

)




# チャンクのストリームを収集するための変数を作成

collected_chunks = []

collected_messages = []




# チャンクのストリームを反復処理する

for chunk in response:

    chunk_time = time.time() - start_time  # チャンクの応答時間を計算

    collected_chunks.append(chunk)  # イベントの応答を保存

    chunk_message = chunk['choices'][0]['delta']  # メッセージを抽出

    collected_messages.append(chunk_message)  # メッセージを保存

    if chunk_message and 'content' in chunk_message:

        print(f"リクエストから{chunk_time:.2f}秒後にメッセージを受信: {chunk_message['content']}")  # 応答の遅延時間とテキストを表示




# 応答の完了までの遅延時間と受信したテキストを表示

print(f"フルレスポンスをリクエストから{chunk_time:.2f}秒後に受信しました")

full_reply_content = ''.join([m.get('content', '') for m in collected_messages])

print(f"受信した全ての会話: {full_reply_content}")

このコードは、OpenAI ChatCompletion APIに対してストリーミングリクエストを送信し、応答を逐次的に受け取る例です。リクエストからの応答の遅延時間と受け取ったテキストを表示します。最終的には、全てのチャンクから受け取ったテキストを連結し、フルな会話を表示します。

ストリーミングリクエストを使用することで、長い対話や大量の応答を効率的に処理することができます。

ストリーミングChatCompletionのレスポンスの解析

ストリーミングChatCompletionでは、APIからのレスポンスを逐次的に受け取りながら解析を行うことが重要です。本章では、ストリーミングChatCompletionのレスポンスの形式と、deltaフィールドとmessageフィールドの違いと使い分けについて説明します。

4.1 ストリーミングChatCompletionのレスポンスの形式

ストリーミングChatCompletionのレスポンスは、連続的なチャンクとして提供されます。各チャンクは、AIの応答や追加情報を含むJSON形式のデータです。

以下にPythonのコードを示しながら、ストリーミングChatCompletionのレスポンスの解析方法を説明します。

# OpenAI ChatCompletion APIリクエストの作成

response = openai.ChatCompletion.create(

    model="gpt-3.5-turbo",

    messages=[

        {"role": "user", "content": "Tell me a joke."},

    ],

    stream=True  # ストリーミングを有効にするためにstream=Trueを設定

)




# 応答の逐次的な処理と解析

for chunk in response:

    # レスポンスのチャンクからdeltaフィールドの抽出

    delta = chunk['choices'][0]['delta']




    # deltaフィールドの解析と表示

    if 'role' in delta:

        print("ロール:", delta['role'])

    if 'content' in delta:

        print("応答内容:", delta['content'])




    # 応答が終了したかの判定

    if chunk['choices'][0]['finish_reason'] == 'stop':

        break

上記のコードでは、APIからのレスポンスを逐次的に受け取りながら、各チャンクのdeltaフィールドを解析しています。

 

4.2 deltaフィールドとmessageフィールドの違いと使い分け

ストリーミングChatCompletionでは、deltaフィールドとmessageフィールドが利用されます。これらのフィールドには、AIの応答や追加情報が含まれています。

deltaフィールドとmessageフィールドは、ストリーミングChatCompletionにおけるレスポンスの一部として使用されます。以下に、これらのフィールドの違いと使い分けについて具体的なコードを交えながら説明します。

4.2.1 deltaフィールド

deltaフィールドは、個々のチャンクの応答や追加情報を提供します。応答や追加のコンテキストは、辞書形式で表現され、{“role”: “assistant”}や{“content”: “こんにちは”}のような形式で格納されます。

deltaフィールドを使い分ける一般的なケースは次の通りです:

“role”フィールド: チャンクがユーザーやアシスタントの役割を示す場合に使用されます。例えば、{“role”: “user”}や{“role”: “assistant”}のように指定されます。役割に基づいて応答を処理する際に役立ちます。

“content”フィールド: チャンクが応答のコンテンツを表す場合に使用されます。例えば、{“content”: “こんにちは”}のように応答のテキストが格納されます。このフィールドからAIの生成結果を抽出して処理や表示を行います。

以下に、Pythonのコードを使用してdeltaフィールドの利用例を示します:

# レスポンスのチャンクからdeltaフィールドの解析と表示

for chunk in response:

    delta = chunk['choices'][0]['delta']




    if 'role' in delta:

        print("役割:", delta['role'])

    if 'content' in delta:

        print("応答内容:", delta['content'])




    if chunk['choices'][0]['finish_reason'] == 'stop':

        break

4.2.2 messageフィールド

messageフィールドは、通常の非ストリーミングのChatCompletion APIと同様に使用されます。messageフィールドには、特定のメッセージの内容や役割が含まれています。各メッセージは、{“role”: “user”, “content”: “こんにちは”}のように表現されます。

messageフィールドの利用例は次の通りです:

# レスポンスからmessageフィールドの抽出と表示

for chunk in response:

    message = chunk['choices'][0]['message']




    if 'role' in message:

        print("役割:", message['role'])

    if 'content' in message:

        print("メッセージ内容:", message['content'])




    if chunk['choices'][0]['finish_reason'] == 'stop':

        break

 

上記のコードを実行することで逐次的にレスポンスを処理することが可能です。

コメント

タイトルとURLをコピーしました