OpenAI gpt-3.5-turbo GUIDES ページを翻訳しただけ

本記事は下記ページの翻訳記事です。

Chat completions

ChatGPTは、OpenAIの最も高度な言語モデルであるgpt-3.5-turboを使用しています。

OpenAI APIを使用すると、次のようなことができるようになります。

・メールやその他の文章の下書き ・Pythonコードの記述 ・ドキュメントに関する質問に回答する ・会話エージェントの作成 ・ソフトウェアに自然言語インターフェースを付与する ・様々な科目のチューター ・言語の翻訳 ・ビデオゲームのキャラクターのシミュレーションなど

このガイドでは、チャットベースの言語モデルのAPI呼び出し方と、良い結果を得るためのヒントを共有しています。また、OpenAI Playgroundで新しいチャット形式を試すこともできます。

Introduction

チャットモデルは、メッセージのシリーズを入力として受け取り、モデル生成のメッセージを出力します。

チャット形式は、マルチターンの会話を簡単にするために設計されていますが、単発の会話がないタスク(以前はtext-davinci-003などの指示に従うモデルで処理されていたもの)にも同様に役立ちます。

例として、API呼び出しは以下のようになります。

# Note: you need to be using OpenAI Python v0.27.0 for the code below to work
import openai

openai.ChatCompletion.create(
  model="gpt-3.5-turbo",
  messages=[
        {"role": "system", "content": "You are a helpful assistant."},
        {"role": "user", "content": "Who won the world series in 2020?"},
        {"role": "assistant", "content": "The Los Angeles Dodgers won the World Series in 2020."},
        {"role": "user", "content": "Where was it played?"}
    ]
)

主要な入力はメッセージのパラメーターです。
メッセージは、役割(「system」、「user」、または「assistant」)と内容(メッセージの内容)のあるメッセージオブジェクトの配列でなければなりません。
会話は1つのメッセージだけであることもあり、多数のページを埋めることもあります。

通常、会話は最初にシステムメッセージが表示され、その後に交互にユーザーとアシスタントのメッセージが表示されます。

システムメッセージは、アシスタントの振る舞いを設定するのに役立ちます。上記の例では、「あなたは助けになるアシスタントです」という指示でアシスタントが指示されました。

Note:gpt-3.5-turbo-0301は、常にシステムメッセージに強い注意を払うわけではありません。将来のモデルでは、より強い注意を払うようにトレーニングされる予定です。

ユーザーメッセージはアシスタントに指示を与えるのに役立ちます。これらは、アプリケーションのエンドユーザーによって生成されることもありますし、開発者によって指示として設定されることもあります。

アシスタントメッセージは以前の応答を保存するのに役立ちます。また、開発者によって望ましい動作の例を示すために書かれることもあります。

会話履歴を含めることで、ユーザーの指示が以前のメッセージを参照する場合に役立ちます。上記の例では、ユーザーの最後の質問「どこで行われたのですか?」は、2020年のワールドシリーズに関する前のメッセージの文脈でのみ意味を成します。モデルには過去のリクエストのメモリがないため、関連する情報はすべて会話を通じて提供する必要があります。会話がモデルのトークン制限に収まらない場合は、何らかの方法で短縮する必要があります。

Response format

{
 'id': 'chatcmpl-6p9XYPYSTTRi0xEviKjjilqrWU2Ve',
 'object': 'chat.completion',
 'created': 1677649420,
 'model': 'gpt-3.5-turbo',
 'usage': {'prompt_tokens': 56, 'completion_tokens': 31, 'total_tokens': 87},
 'choices': [
   {
    'message': {
      'role': 'assistant',
      'content': 'The 2020 World Series was played in Arlington, Texas at the Globe Life Field, which was the new home stadium for the Texas Rangers.'},
    'finish_reason': 'stop',
    'index': 0
   }
  ]
}

Pythonでは、アシスタントの返答はresponse['choices'][0]['message']['content']で抽出できます。

すべての応答にはfinish_reasonが含まれます。finish_reasonの可能な値は次のとおりです。

  • stop: APIが完全なモデルの出力を返した

  • length: max_tokensパラメーターまたはトークン制限による不完全なモデルの出力

  • content_filter: コンテンツフィルターからのフラグによる内容の省略

  • null: APIの応答がまだ進行中であるか、不完全である

Managing tokens

言語モデルは、トークンと呼ばれるチャンクでテキストを読み込みます。英語では、トークンは1文字から1単語(たとえば、aまたはapple)までの長さになります。一部の言語では、トークンが1文字より短い場合や1単語より長い場合があります。

例えば、文字列 "ChatGPT is great!" は、6つのトークンにエンコードされます:["Chat", "G", "PT", " is", " great", "!"]。

API呼び出しでのトークンの合計数は以下に影響します。

  • トークンあたりの費用がかかるため、API呼び出しの費用

  • API呼び出しがかかる時間が長くなるため、書き込むトークン数が増えると時間がかかる

  • API呼び出しが動作するかどうか、トークンの合計数がモデルの最大制以下である必要があるため(gpt-3.5-turbo-0301の場合は4096トークン)

入力と出力のトークンの両方がこれらの数量にカウントされます。たとえば、API呼び出しで10個のトークンを使用し、20個のトークンを出力メッセージで受け取った場合、30個のトークンが請求されます。

API呼び出しで使用されるトークン数を確認するには、APIの応答内の使用量フィールド(例:response['usage']['total_tokens'])を確認してください。

gpt-3.5-turboなどのチャットモデルは、他のモデルと同じようにトークンを使用しますが、メッセージベースのフォーマットのため、会話で使用されるトークン数を数えることはより困難です。


Counting tokens for chat API calls

以下は、gpt-3.5-turbo-0301に渡されるメッセージのトークンをカウントするための例の関数です。

メッセージがどのようにトークンに変換されるかはモデルによって異なる可能性があります。したがって、将来的にモデルのバージョンがリリースされた場合、この関数によって返される答えは近似値のみになる場合があります。ChatMLドキュメントは、OpenAI APIによってメッセージがトークンに変換される方法を説明しており、独自の関数を作成する際に役立つかもしれません。

def num_tokens_from_messages(messages, model="gpt-3.5-turbo-0301"):
  """Returns the number of tokens used by a list of messages."""
  try:
      encoding = tiktoken.encoding_for_model(model)
  except KeyError:
      encoding = tiktoken.get_encoding("cl100k_base")
  if model == "gpt-3.5-turbo-0301":  # note: future models may deviate from this
      num_tokens = 0
      for message in messages:
          num_tokens += 4  # every message follows <im_start>{role/name}\n{content}<im_end>\n
          for key, value in message.items():
              num_tokens += len(encoding.encode(value))
              if key == "name":  # if there's a name, the role is omitted
                  num_tokens += -1  # role is always required and always 1 token
      num_tokens += 2  # every reply is primed with <im_start>assistant
      return num_tokens
  else:
      raise NotImplementedError(f"""num_tokens_from_messages() is not presently implemented for model {model}.
  See https://github.com/openai/openai-python/blob/main/chatml.md for information on how messages are converted to tokens.""")

次に、メッセージを作成し、それを上記で定義した関数に渡すと、トークン数を確認することができます。

messages = [
  {"role": "system", "content": "You are a helpful, pattern-following assistant that translates corporate jargon into plain English."},
  {"role": "system", "name":"example_user", "content": "New synergies will help drive top-line growth."},
  {"role": "system", "name": "example_assistant", "content": "Things working well together will increase revenue."},
  {"role": "system", "name":"example_user", "content": "Let's circle back when we have more bandwidth to touch base on opportunities for increased leverage."},
  {"role": "system", "name": "example_assistant", "content": "Let's talk later when we're less busy about how to do better."},
  {"role": "user", "content": "This late pivot means we don't have time to boil the ocean for the client deliverable."},
]

model = "gpt-3.5-turbo-0301"

print(f"{num_tokens_from_messages(messages, model)} prompt tokens counted.")
# Should show ~126 total_tokens

上記の関数で生成された番号がAPIが返す番号と同じであることを確認するために、新しいChat Completionを作成します。

# example token count from the OpenAI API
import openai


response = openai.ChatCompletion.create(
    model=model,
    messages=messages,
    temperature=0,
)

print(f'{response["usage"]["prompt_tokens"]} prompt tokens used.')

API呼び出しを行わずにテキスト文字列内のトークン数を確認するには、OpenAIのtiktoken Pythonライブラリを使用できます。tiktokenを使用してトークンをカウントする方法については、OpenAI Cookbookのガイド「how to count tokens with tiktoken」でサンプルコードを見つけることができます。

APIに渡された各メッセージは、内容、役割、およびその他のフィールドに使用されるトークンの数に加えて、内部的なフォーマットに必要ないくつかのトークンを消費します。これは将来わずかに変更される可能性があります。

会話がモデルの最大制限(gpt-3.5-turboの場合、4096トークン以上)に収まらない場合は、テキストを縮小して収まるように切り詰めたり、省略したり、他の方法で縮小する必要があります。ただし、入力のメッセージが削除された場合、モデルはそれに関するすべての情報を失うことに注意してください。

また、非常に長い会話は、不完全な返信を受け取る可能性が高くなります。例えば、4090トークンの長さのgpt-3.5-turbo会話は、たった6トークンの後に返信が切り捨てられます。

Instructing chat models

モデルの指示に関するベストプラクティスは、モデルのバージョンによって変更される可能性があります。以下のアドバイスは、gpt-3.5-turbo-0301に適用されるものであり、将来のモデルには適用されない場合があります。

多くの会話は、アシスタントに優しく指示するためのシステムメッセージで始まります。例えば、ChatGPTで使用されるシステムメッセージの1つは次のとおりです。

You are ChatGPT, a large language model trained by OpenAI. Answer as concisely as possible. Knowledge cutoff: {knowledge_cutoff} Current date: {current_date}

翻訳文:
あなたはOpenAIによってトレーニングされた大規模な言語モデルであるChatGPTです。可能な限り簡潔に回答してください。知識のカットオフ日:{knowledge_cutoff} 現在の日付:{current_date}

一般的に、gpt-3.5-turbo-0301はシステムメッセージに強い注意を払わず、重要な指示はユーザーメッセージに配置する方が良いことがあります。

モデルが望む出力を生成していない場合は、改良の余地があるかどうかを反復して実験してみてください。次のようなアプローチを試すことができます。

  • 指示をより明示的にする

  • 回答のフォーマットを指定する

  • 回答を決定する前にステップごとに考えたり、賛否両論を検討するようにモデルに要求する

より多くのプロンプトエンジニアリングのアイデアについては、信頼性を向上させるための技術に関するOpenAI Cookbookのガイドを読んでください。

システムメッセージを超えて、温度と最大トークンは、開発者がチャットモデルの出力に影響を与えるために持つ多数のオプションのうちの2つです。温度に関しては、0.8のような高い値は出力をよりランダムにし、0.2のような低い値はより焦点を絞った決定論的な出力を生成します。最大トークンの場合、返答を特定の長さに制限したい場合は、最大トークンを任意の数値に設定できます。例えば、最大トークン値を5に設定すると、出力が切り捨てられ、結果がユーザーにとって意味をなさなくなる可能性があります。

Chat vs Completions

gpt-3.5-turboは、text-davinci-003と同等の機能を持ち、トークンあたりの価格が10%であるため、ほとんどのユースケースにおいてgpt-3.5-turboを推奨します。

多くの開発者にとって、移行はプロンプトを書き直し、再テストするだけで済みます。

例えば、次のような完成プロンプトで英語をフランス語に翻訳した場合:

Translate the following English text to French: "{text}"

同等のチャットの会話は次のようなものです。

[
  {"role": "system", "content": "You are a helpful assistant that translates English to French."},
  {"role": "user", "content": 'Translate the following English text to French: "{text}"'}
]

あるいは、ユーザーメッセージだけでもいい。

[
  {"role": "user", "content": 'Translate the following English text to French: "{text}"'}
]

FAQ

gpt-3.5-turboに対してファインチューニングは可能ですか?

いいえ。2023年3月1日時点では、基本的なGPT-3モデルのみがファインチューニング可能です。ファインチューニングされたモデルの使用方法については、ファインチューニングガイドを参照してください。

APIに渡されるデータは保存されますか?

2023年3月1日時点では、APIデータを30日間保持しますが、APIを介して送信されたデータをモデルの改善に使用しなくなりました。データ使用ポリシーで詳細を確認してください。

モデレーションレイヤーを追加する

Chat APIの出力にモデレーションレイヤーを追加する場合は、当社のモデレーションガイドに従って、OpenAIの使用ポリシーに違反するコンテンツが表示されないようにすることができます。

※モデレーションレイヤーとは?
モデレーションエンドポイントは、コンテンツがOpenAIの使用ポリシーに準拠しているかどうかをチェックするために使用できるツールです。


この記事が気に入ったらサポートをしてみませんか?