1. テキスト生成モデルの基礎

OpenAIのテキスト生成モデルは通常、Generative Pre-trained Transformer(GPT)と呼ばれ、深層学習のセルフアテンションメカニズムに依存して自然言語を理解し処理します。GPTモデルのトレーニングには、事前トレーニングと微調整の2つの段階があります。

事前トレーニング

事前トレーニング段階では、モデルは大規模なテキストデータセットを使用した教師なし学習を行います。このプロセスでは、モデルは次の単語を予測することによってトレーニングされます。「I have a pen」という文が与えられた場合、最初の数語を見た後、単語「pen」を予測しようとします。事前トレーニングの主な目的は、モデルが言語の構造と意味を理解できるようにすることです。

微調整

微調整段階は特定のタスクにおける教師あり学習を含みます。この段階では、モデルは特定のアプリケーションに適応するよう調整されます。質問応答システムや文書要約などの特定のアプリケーションに適応するために、アノテーションされたデータセットを用いて事前トレーニングされたモデルにさらなるトレーニングが行われます。

2. アプリケーションシナリオ

OpenAIのテキスト生成モデルは幅広いシナリオに適用されることができます。以下はいくつかの具体的なアプリケーションです:

  • 文書の起案: ユーザーが素早く文書を起案し編集するのを支援します。
  • コンピューターコードの記述: プログラミングを支援するためのコード断片を生成します。
  • 知識ベースに関する質問に答える: 保存された知識に基づく回答を提供します。
  • テキスト分析: テキスト情報の抽出、センチメント分析などを実行します。
  • ソフトウェアへの自然言語インターフェースの提供: ユーザーが自然言語を使用してソフトウェアとやり取りできるようにします。
  • 幅広い科目のチュータリング: 複数の科目にわたる教育支援を提供します。
  • 言語翻訳: 異なる言語間でのテキスト翻訳を行います。
  • ゲームのキャラクターシミュレーション: ゲームやロールプレイングシナリオのために対話やバックグラウンドストーリーを生成します。

3. 対話モデルの紹介

対話モデルは、事前トレーニングを通じて自然な会話を理解し生成する特別なタイプのテキスト生成モデルです。このモデルはユーザーと仮想アシスタントの間の会話をシミュレートし、リアルタイムのインタラクティブアプリケーションに適しています。

対話モデルの使用には通常、マルチターンのインタラクティブな会話が含まれます。たとえば、ユーザーが質問すると、モデルは以前のトレーニングデータに基づいて適切な応答を生成することができます。さらに、対話モデルは文脈情報を保持し、以前の会話内容を考慮してより一貫した自然な応答を生成できます。

対話モデルのアプリケーションシナリオ:

  • カスタマーサービスアシスタント: ユーザーのよくある質問に自動的に回答し、支援やアドバイスを提供します。
  • チャットボット: ユーザーとの自然な会話型のインタラクションを行います。
  • 仮想アシスタント: 会議のスケジューリング、リマインダーの設定などのユーザーの音声コマンドを実行します。
  • ロールプレイングゲーム: ゲームキャラクターに独自の対話や個性を与えることでゲーム体験を豊かにします。

4. 対話モデルAPI

対話モデルAPIを使用すると、開発者はHTTPリクエストを使用してGPTモデルと対話できます。このセクションでは、curlを使用してリクエストを構築し、モデルから返される応答を解析する方法について紹介します。

リクエストの構築

始める前に、OpenAIからAPIキーを登録して取得する必要があります。リクエストを送信する際にHTTPヘッダーで認証する必要があります。

以下は、curlを使用してDialogue Model APIにリクエストを送信する例です:

curl https://api.openai.com/v1/chat/completions \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -d '{
    "model": "gpt-3.5-turbo",
    "messages": [
      {
        "role": "system",
        "content": "You are a helpful assistant."
      },
      {
        "role": "user",
        "content": "Which team won the 2020 World Series?"
      }
    ]
  }'

対話モデルパラメータの意味

OpenAIの対話モデルAPIを使用する際、メインパラメータは「model」と「messages」であり、それぞれ特定の意味を持ち、結果に影響を与えます。

モデルパラメータ

モデルパラメータは、使用するモデルのバージョンを指定するために使用されます。例えば、"model": "gpt-3.5-turbo" とすることで、GPT-3.5-Turboモデルをリクエストしていることを示します。ここで選択されたモデルのバージョンは、その能力、トレーニングデータ、およびインターフェース機能に基づいてユーザーの入力に応じて応答します。

以下は現在サポートされているモデルです。

サポートされているモデル 最大コンテキスト モデルの説明
gpt-4-0125-preview 128,000 トークン モデルの「怠慢」ケースを減らすために設計されたGPT-4 Turboプレビューモデル。
gpt-4-turbo-preview 128,000 トークン 現在は gpt-4-0125-preview モデルを指しています。
gpt-4-1106-preview 128,000 トークン 機能の実行能力が向上したGPT-4 Turboモデルで、JSONモード、再現可能な出力、並列関数の呼び出しを行います。
gpt-4-vision-preview 128,000 トークン 他のすべてのGPT-4 Turboの機能に加えて、画像を理解する能力を持つGPT-4モデル。
gpt-4 8,192 トークン 現在は gpt-4-0613 を指しています。
gpt-4-0613 8,192 トークン 2023年6月13日のGPT-4スナップショットで、改善された関数呼び出しのサポートを提供します。
gpt-4-32k 32,768 トークン 現在は gpt-4-32k-0613 を指しています。このモデルは広く宣伝されておらず、GPT-4 Turboの使用を推奨します。
gpt-4-32k-0613 32,768 トークン 2023年6月13日のGPT-4 32kバージョンのスナップショット。このモデルは広く宣伝されておらず、GPT-4 Turboの使用を推奨します。
gpt-3.5-turbo-1106 16,385 トークン 機能の実行能力、JSONモード、再現可能な出力、並列関数の呼び出しが向上した最新のGPT-3.5 Turboモデル。
gpt-3.5-turbo 4,096 トークン 現在は gpt-3.5-turbo-0613 を指しています。
gpt-3.5-turbo-16k 16,385 トークン 現在は gpt-3.5-turbo-16k-0613 を指しています。
gpt-3.5-turbo-instruct 4,096 トークン GPT-3時代のモデルと機能的に類似しています。従来の補完エンドポイントと互換性がありますが、チャット補完には適していません。
gpt-3.5-turbo-0613 4,096 トークン 2023年6月13日の gpt-3.5-turbo のスナップショット。2024年6月13日に非推奨となります。
gpt-3.5-turbo-16k-0613 16,385 トークン 2023年6月13日の gpt-3.5-16k-turbo のスナップショット。2024年6月13日に非推奨となります。
gpt-3.5-turbo-0301 4,096 トークン 2023年3月1日の gpt-3.5-turbo のスナップショット。2024年6月13日に非推奨となります。

Messages パラメータ

Messagesパラメータは、会話中の各メッセージを表す配列で、各要素はメッセージを表します。各メッセージは、role(送信者の役割)とcontent(メッセージの具体的な内容)の2つのプロパティを含むオブジェクトです。

  • role: メッセージの送信者の役割を指定します。"system"、"user"、"assistant" などの値が選択肢です。
  • content: メッセージの具体的な内容です。

役割の種類と機能

roleパラメータの値は、メッセージのタイプと機能を定義します。ダイアログAPIは異なる役割に基づいてモデルの応答を変更します。

ロール 'system'

システムメッセージは、モデルの振る舞いをグローバルに示すために使用されます。たとえば、モデルが果たす役割(アシスタント、翻訳者など)を明示的に指定したり、会話で守るべき具体的な指示を提供したりします。システムメッセージは会話全体のモデルの振る舞いに長期的な影響を与えますが、通常はオプションです。

たとえば、モデルにカスタマーサービスアシスタントとして会話に参加させたい場合は、次のようにシステムメッセージで指定できます:

{
  "role": "system",
  "content": "あなたはカスタマーサービスアシスタントです。"
}

ロール 'user'

ユーザーメッセージはユーザーが入力した質問を表します。モデルはこれらのメッセージに対応して応答し、情報、回答、またはその他の形式の出力を提供します。これらのメッセージは Dialogue API ワークフローの重要な部分であり、通常、アプリケーションで実際のユーザーの問い合わせに対応します。

たとえば、上記の curl のユーザー要求では:

{
  "role": "user",
  "content": "2020年のワールドシリーズの優勝チームはどちらですか?"
}

ロール 'assistant'

アシスタントメッセージは、通常、モデルが生成する返信を指します。また、開発者が提供する会話履歴メッセージの一部であり、AI がメッセージを返す形式をシミュレートするために使用されます。API リクエストでは、通常、アシスタント役のメッセージは提供されませんが、会話履歴でモデルが質問に答える形式を事前に設定して、モデルの出力例を提供する必要がある場合にのみ提供されます。

レスポンスの解析

モデルの応答は JSON 形式で返されます。以下は応答を解析する例です:

{
  "choices": [
    {
      "finish_reason": "stop",
      "index": 0,
      "message": {
        "content": "2020年のワールドシリーズの優勝チームはロサンゼルス・ドジャースです。",
        "role": "assistant"
      },
      "logprobs": null
    }
  ],
  "created": 1677664795,
  "id": "chatcmpl-7QyqpwdfhqwajicIEznoc6Q47XAyW",
  "model": "gpt-3.5-turbo-0613",
  "object": "chat.completion",
  "usage": {
    "completion_tokens": 17,
    "prompt_tokens": 57,
    "total_tokens": 74
  }
}

上記の応答では、choices[0].message.content からモデルの回答を取得できます。

対話モデルでメモリ機能を実装する方法

以下は、OpenAIのChat Completions APIを使用してGPTモデルのメモリ機能を実装する例です。これにより、過去の会話コンテキスト(つまり、メモリの内容)を新しいAPIリクエストに保存して、継続的な対話を実現する方法が示されています。

import requests

api_url = "https://api.openai.com/v1/chat/completions"
api_key = "あなたのOpenAI APIキー"

headers = {
    "Content-Type": "application/json",
    "Authorization": f"Bearer {api_key}"
}

data = {
    "model": "gpt-3.5-turbo",  # gpt-4など他の利用可能なモデルに置き換えることができます
    "messages": [
      {
        "role": "system",  # システムメッセージ、対話モデルの動作を設定するために使用されます
        "content": "あなたはヘルプアシスタントです。"
      },
      {
        "role": "user",  # ユーザーメッセージ、モデルはこれに応答します
        "content": "気候変動の主な原因を教えてもらえますか?"
      },
      {
        "role": "assistant",  # モデルの応答
        "content": "気候変動の主な原因には温室効果ガスの排出、化石燃料の燃焼、森林破壊などがあります。"
      },
      {
        "role": "user",  # モデルの回答に基づく新しい質問
        "content": "温室効果ガスの排出をどのように減らすことができますか?"
      }
    ]
}

response = requests.post(api_url, headers=headers, json=data)

if response.status_code == 200:
    reply_content = response.json()['choices'][0]['message']['content']
    print(f"モデルの応答 => {reply_content}")
else:
    print(f"リクエストエラー: {response.status_code}")

この例では、ユーザーがまず気候変動の主な原因について尋ね、その後モデルの説明に基づいて別の質問をするシナリオをシミュレートしています。後続のリクエストにおいて、以前の会話の内容を保持して、モデルが前の会話の履歴を覚えてそれに基づいて応答を生成できるようにしています。この方法により、新しいリクエストのヒストリーメッセージとして前回の会話ラウンドの入出力を使用することで、対話の状態の伝達と記憶が実現されます。

ヒント: 対話のメモリ機能を実装するために、モデルには最大トークン制限があるため、各リクエストにすべての過去の会話メッセージを入力することは現実的ではありません。通常、現在の質問に関連する関連メッセージがモデルに入力されるヒストリコメッセージとして使用され、後続のセクションでは埋め込み機能がテキストの類似性検索をどのように実現するかが紹介されます。

5. JSONスキーマ

JSONスキーマは、対話モデルAPIの機能の1つで、常にJSONオブジェクトを返すようモデルに指示できる機能です。

JSONスキーマの使用

JSONスキーマを使用するには、HTTPリクエスト本文でresponse_formatフィールドを{ "type": "json_object" }に設定し、システムメッセージがモデルの出力がJSON形式であることを指示する必要があります。以下は、JSONスキーマを有効にするためのcurlリクエストの例です。

curl https://api.openai.com/v1/chat/completions \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -d '{
    "model": "gpt-3.5-turbo-1106",
    "response_format": { "type": "json_object" },
    "messages": [
      {
        "role": "system",
        "content": "JSON形式で出力するように設計されたヘルプフルなアシスタントです。"
      },
      {
        "role": "user",
        "content": "2020年のワールドシリーズでどのチームが優勝しましたか?"
      }
    ]
  }'

JSONスキーマレスポンスの解析

JSONスキーマモードでは、レスポンスには完全で完璧に解析されたJSONオブジェクトが含まれます。このモードでは、モデルの出力が直接解析および使用できる有効なJSONオブジェクトであることが保証されます。以下は、JSONスキーマを使用して返される可能性があるレスポンスの例です:

{
  "choices": [
    {
      "finish_reason": "stop",
      "message": {
        "content": "{\"winner\": \"Los Angeles Dodgers\"}"
      }
    }
  ]
}

Pythonでは、次のコードを使用してレスポンスからコンテンツを抽出できます:

import json

response = {
  "choices": [
    {
      "finish_reason": "stop",
      "message": {
        "content": "{\"winner\": \"Los Angeles Dodgers\"}"
      }
    }
  ]
}

response_content = json.loads(response['choices'][0]['message']['content'])

print(response_content)

出力は次のようになります:

{'winner': 'Los Angeles Dodgers'}

JSONスキーマは、特定のユースケースのためのレスポンスの正しいフォーマットを保証する信頼性の高い方法を提供します。そのため、APIレスポンスのフォーマットに特定の要件があるシナリオでは、JSONスキーマを有効にすることをお勧めします。