見出し画像

AIがもっと身近に!OpenAIの新しいストリーミングAPIがアプリ体験を変える

OpenAIから新しく発表された「Streaming API」が、有料ティアの全ての開発者に展開されました。

この新しい機能は、より高速で便利なストリーミング機能を提供しています。「Streaming」はOpenAIのAPIを通じてリアルタイムでデータを受信することができる機能です。これにより、チャットやテキストの展開が高速化され、レスポンスタイムが大きく向上します。特に、大量のデータを変更しながら最新情報を取り扱うためのアプリでは、この機能が有効に活用できます。使用方法と使用ケースを深ぼっていきます。


o1-preview と o1-miniのAPI

このリリースに含まれているのは「o1-preview」と「o1-mini」という2つのモデルです。これらのモデルは、いずれも導入や開発を早めるための便利な機能を搭載しています。「o1-preview」はより大規模なデータ処理用に適していて、「o1-mini」は小規模のプロジェクトに有効に活用できるように設計されています。これらは、手順よくスケールしながら利用することが可能です。

ストリーミング機能の役割

ストリーミングは、毎回のAPIレスポンスを近代的に流すことができる機能です。これにより、ブラウザ上での短い時間での再現性が向上します。たとえば、最新情報を最速に表示するためのチャットエンジンを作成するのに最適です。それによりユーザーのインタラクションが向上し、素早く反応するアプリを作成することが可能になります。

開発者向けのメリット

このストリーミング機能は、開発者にとっての役割も大きいです。少ない資源でも、リアルタイムの反応を使用することで、開発を早めることが可能になり、開発プロセスの有効性を向上させることができます。また、多様な種類のプロジェクトでこの機能を活用することにより、複数のシナリオが平行して進行できるため、開発の道程をスムーズに進めることが可能になります。

API導入方法

OpenAI API キー取得法

OpenAI API は認証に API キーを使用します。API キーはユーザーまたはサービス アカウント レベルで作成できます。サービス アカウントは「ボット」個人に関連付けられており、実稼働システムへのアクセスをプロビジョニングするために使用する必要があります。各 API キーは、次のいずれかにスコープ設定できます。

  1. プロジェクト キー- 単一のプロジェクトへのアクセスを提供します (推奨オプション)。キーを生成する特定のプロジェクトを選択して、プロジェクト API キーにアクセスします。

  2. ユーザー キー- 従来のキーです。ユーザーが追加されたすべての組織とすべてのプロジェクトにアクセスできます。APIキーにアクセスして、使用可能なキーを表示します。この方法によるアクセスは現在もサポートされていますが、セキュリティのベスト プラクティスとしてプロジェクト キーに移行することを強くお勧めします。

API キーは秘密であることを忘れないでください。他の人と共有したり、クライアント側のコード (ブラウザ、アプリ) で公開したりしないでください。本番環境のリクエストは、環境変数またはキー管理サービスから API キーを安全に読み込むことができる独自のバックエンド サーバーを介してルーティングする必要があります。

すべての API リクエストには、次のように HTTP ヘッダーに API キーを含める必要があります。

Authorization: Bearer OPENAI_API_KEY

組織とプロジェクト(オプション)

複数の組織に属しているユーザーや、従来のユーザー API キーを使用してプロジェクトにアクセスしているユーザーの場合は、ヘッダーを渡して、API リクエストに使用する組織とプロジェクトを指定できます。これらの API リクエストからの使用量は、指定された組織とプロジェクトの使用量としてカウントされます。

組織内にアクセスするにはDefault projectOpenAI-Projectヘッダーを省略します

curl コマンドの例:

curl https://api.openai.com/v1/models \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -H "OpenAI-Organization: YOUR_ORG_ID" \
  -H "OpenAI-Project: $PROJECT_ID"

Python パッケージの例openai:

from openai import OpenAI

client = OpenAI(
  organization='YOUR_ORG_ID',
  project='$PROJECT_ID',
)

Node.js パッケージの例openai:

import OpenAI from "openai";

const openai = new OpenAI({
    organization: "YOUR_ORG_ID",
    project: "$PROJECT_ID",
});

組織 ID は、組織設定ページで確認できます。プロジェクト ID は、特定のプロジェクトを選択すると、一般設定ページで確認できます。

リクエストの作成

下記のコマンドをターミナルに貼り付けて、最初の API リクエストを実行できます。 を必ず秘密の API キーに置き換えてください。従来のユーザー キーを使用していて、複数のプロジェクトがある場合は、プロジェクト ID$OPENAI_API_KEYも指定する必要があります。セキュリティを強化するために、代わりにプロジェクト ベースのキーに移行することをお勧めします。

curl https://api.openai.com/v1/chat/completions \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -d '{
     "model": "gpt-4o-mini",
     "messages": [{"role": "user", "content": "Say this is a test!"}],
     "temperature": 0.7
   }'

このリクエストは、gpt-4o-miniモデル (内部的にはgpt-4o-miniモデル バリアントを指す) を照会して、「これはテストであると言ってください」というプロンプトで始まるテキストを完成させます。次のような応答が返されるはずです。

{
    "id": "chatcmpl-abc123",
    "object": "chat.completion",
    "created": 1677858242,
    "model": "gpt-4o-mini",
    "usage": {
        "prompt_tokens": 13,
        "completion_tokens": 7,
        "total_tokens": 20,
        "completion_tokens_details": {
            "reasoning_tokens": 0,
            "accepted_prediction_tokens": 0,
            "rejected_prediction_tokens": 0
        }
    },
    "choices": [
        {
            "message": {
                "role": "assistant",
                "content": "\n\nThis is a test!"
            },
            "logprobs": null,
            "finish_reason": "stop",
            "index": 0
        }
    ]
}

最初のチャット補完を生成したので、応答オブジェクトを分解してみましょう。 はfinish_reasonstopAPI が制限に達することなくモデルによって生成された完全なチャット補完を返したことを意味します。選択肢リストでは、1 つのメッセージのみを生成しましたが、nパラメータを設定して複数のメッセージの選択肢を生成することもできます。

ストリーミング

OpenAI API は、特定のリクエストに対して部分的な結果を許可するために、クライアントに応答をストリームで返す機能を提供します。これを実現するために、サーバー送信イベント標準に従います。公式のNodeおよびPythonライブラリには、これらのイベントの解析を簡単にするヘルパーが含まれています。

ストリーミングは、チャット完了 APIアシスタント APIの両方でサポートされています。このセクションでは、チャット完了でのストリーミングの仕組みに焦点を当てます。アシスタント API でのストリーミングの仕組みの詳細については、こちらをご覧ください。

Python では、ストリーミング リクエストは次のようになります。

from openai import OpenAI

client = OpenAI()

stream = client.chat.completions.create(
    model="gpt-4o-mini",
    messages=[{"role": "user", "content": "Say this is a test"}],
    stream=True,
)
for chunk in stream:
    if chunk.choices[0].delta.content is not None:
        print(chunk.choices[0].delta.content, end="")

Node / Typescript では、ストリーミング リクエストは次のようになります。

import OpenAI from "openai";

const openai = new OpenAI();

async function main() {
    const stream = await openai.chat.completions.create({
        model: "gpt-4o-mini",
        messages: [{ role: "user", content: "Say this is a test" }],
        stream: true,
    });
    for await (const chunk of stream) {
        process.stdout.write(chunk.choices[0]?.delta?.content || "");
    }
}

main();

サーバーから送信されたイベントの解析

サーバーから送信されたイベントの解析は簡単ではないため、注意して行う必要があります。新しい行で分割するなどの単純な方法では、解析エラーが発生する可能性があります。可能な場合は、既存のクライアント ライブ

デバッグリクエスト

API レスポンスから返されるエラー コードに加えて、HTTP レスポンス ヘッダーも検査する必要がある場合があります。特に注目すべきは、特定の API リクエストの一意の ID と、リクエストに適用されたレート制限に関する情報を含むヘッダーです。以下は、API レスポンスで返される HTTP ヘッダーの不完全なリストです。

API メタ情報

  • openai-organization:リクエストに関連付けられた組織

  • openai-processing-ms: API リクエストの処理にかかった時間

  • openai-version: このリクエストに使用されている REST API バージョン (現在2020-10-01)

  • x-request-id: この API リクエストの一意の識別子 (トラブルシューティングで使用)

レート制限情報

  • x-ratelimit-limit-requests

  • x-ratelimit-limit-tokens

  • x-ratelimit-remaining-requests

  • x-ratelimit-remaining-tokens

  • x-ratelimit-reset-requests

  • x-ratelimit-reset-tokens

OpenAI では、本番環境のデプロイメントでリクエスト ID をログに記録することを推奨しています。これにより、必要に応じてサポート チームによるトラブルシューティングをより効率的に行うことができます。公式 SDK では、x-request-idヘッダーの値を含む最上位レベルのレスポンス オブジェクトにプロパティが提供されています。

Python でのリクエスト ID

from openai import OpenAI
client = OpenAI()

response = client.chat.completions.create(
    messages=[{
        "role": "user",
        "content": "Say this is a test",
    }],
    model="gpt-4o-mini",
)

print(response._request_id)

JavaScript でのリクエスト ID

import OpenAI from 'openai';
const client = new OpenAI();

const response = await client.chat.completions.create({
    messages: [{ role: 'user', content: 'Say this is a test' }],
    model: 'gpt-4o-mini'
});

console.log(response._request_id);

SDK で生のレスポンス オブジェクトにアクセスする

低レベルの HTTP クライアント ( fetchHttpClientC# など) を使用している場合は、HTTP インターフェイスの一部として応答ヘッダーにすでにアクセスできるはずです。

OpenAI の公式 SDK (HTTP リクエスト/レスポンス サイクルを大幅に抽象化したもの)のいずれかを使用している場合は、生の HTTP レスポンスに少し異なる方法でアクセスする必要があります。

以下は、 Python SDKx-ratelimit-limit-tokensを使用して生の応答オブジェクト (およびヘッダー)にアクセスする例です。

from openai import OpenAI
client = OpenAI()

response = client.chat.completions.with_raw_response.create(
    messages=[{
        "role": "user",
        "content": "Say this is a test",
    }],
    model="gpt-4o-mini",
)
print(response.headers.get('x-ratelimit-limit-tokens'))

# get the object that `chat.completions.create()` would have returned
completion = response.parse()
print(completion)

JavaScript SDK を使用して生の応答 (およびx-ratelimit-limit-tokensヘッダー)にアクセスする方法は次のとおりです。

import OpenAI from 'openai';
const client = new OpenAI();

const response = await client.chat.completions.create({
    messages: [{ role: 'user', content: 'Say this is a test' }],
    model: 'gpt-4o-mini'
}).asResponse();

// access the underlying Response object
console.log(response.headers.get('x-ratelimit-limit-tokens'));


Streaming APIの魅力と使用例

今回のStreaming APIは、これまでのAPIとは一線を画す性能と柔軟性を持っています。特にリアルタイムでのレスポンスが必要とされるシナリオでは、このAPIが新しい可能性を切り拓きます。

カスタマーサポートチャットボットの高度化

ユーザーが問い合わせを入力するたびにすぐに応答が可能で、リアルタイムに情報を更新して返答することで、顧客満足度を大幅に向上させることができます。これにより、ユーザーが待たされる時間を最小限に抑え、よりスムーズなサポート体験を提供することができます。

リアルタイム翻訳ツール

複数言語の会話をリアルタイムで翻訳し、即座に対応することが可能です。たとえば、ビデオ会議の中で参加者が異なる言語を話していても、このAPIを利用することで遅延のないスムーズな翻訳が実現できます。

ライブコーディングアシスタント

コードのエラー修正やリファクタリングのアドバイスをリアルタイムで受け取ることができるツールとしても活用可能です。プログラマーがコーディングを行う際に、ストリーミングAPIを通じて即座に改善点や提案を受け取ることができるため、生産性を高めることができます。

ゲーム内キャラクターの対話機能

オンラインゲームにおいて、プレイヤーの行動に応じてキャラクターがリアルタイムに応答することで、より自然で没入感のあるゲーム体験を提供できます。プレイヤーの質問や行動に対して、遅延なくダイナミックな反応が返ってくるため、よりインタラクティブなゲームプレイが実現します。

これらの使用例を通じて、Streaming APIの素晴らしさを体感していただけます。レスポンスのスピードとリアルタイム性を活かし、これまでにはなかったアプリケーションの可能性を実現することができるのです。

以上が新しく展開された「Streaming」についての解説です。これにより、ユーザーエクスペリエンスが向上し、高速なレスポンスシステムが作れるようになることが期待されます。

いいなと思ったら応援しよう!