OpenAI DevDayで発表された様々な機能について、公式ドキュメントを見ながら少しだけ詳細を確認してみた

2023.11.07

こんちには。

データアナリティクス事業本部 インテグレーション部 機械学習チームの中村です。

OpenAIの開発者向けカンファレンスであるOpenAI DevDayで様々な機能が発表されたようです。

以下が公式アナウンスです。

弊社のブログでも速報が紹介されています。

本記事ではDevDayで発表された機能の詳細を少しだけ確認していきます。

(PSTで11/6 13時から提供が開始されたそうなので、日本時間でも6時から触れるようになっています)

[Preview] 最新モデルGPT-4 Turboの発表

GPT-4の最新モデル、GPT-4 Turboが発表されました。

モデル名としてはgpt-4-1106-previewという名前で既に利用可能となっています。

GPT-4 Turboの特徴は以下です。

  • 命令追従性の向上、JSONモード、再現可能な出力、並列関数呼び出しなどを備えたGPT-4最新モデル
  • 最大4096個の出力トークンを返す
  • 2023年4月までの学習データを使用しているため、知識もアップデートされた
  • 128kのコンテキスト・ウィンドウを持ち、1つのプロンプトに300ページ以上のテキストを入力可能
  • 通常のGPT-4に比べて、入力トークンで3倍安く、出力トークンで2倍安く利用可能

各モデルの比較表は以下のようになります。(GPT-3.5も併せて記載)

model input output コンテキスト長 学習データ
gpt-4 $0.03 per 1k token $0.06 per 1k token 8,192 2021年9月まで
gpt-4-32k $0.06 per 1k token $0.12 per 1k token 32,768 2021年9月まで
gpt-4-1106-preview $0.01 per 1k token $0.03 per 1k token 128,000 2023年4月まで
gpt-4-1106-vision-preview $0.01 per 1k token $0.03 per 1k token 128,000 2023年4月まで
gpt-3.5-turbo-0613 $0.0015 per 1k token $0.002 per 1k token 4,096 2021年9月まで
gpt-3.5-turbo-16k-0613 $0.003 per 1k token $0.004 per 1k token 16,384 2021年9月まで
gpt-3.5-turbo-instruct $0.0015 per 1k token $0.002 per 1k token 4,096 2021年9月まで
gpt-3.5-turbo-1106 $0.0010 per 1k token $0.002 per 1k token 16,384 2021年9月まで

コンテキスト長が長くなり、学習データも最新化、さらに価格も下がっていますので、Previewではなくなるのが待ち遠しいですね。

詳細は以下も参照ください。

試してみた

少しだけPythonで試してみようと思います。

実行前にopenaiモジュールも本日1.0.0がリリースされているようですので、事前にアップデートしてください。

簡単なクエリを試してみます。

from openai import OpenAI

# APIキーの発行方法は以下を参照
#   https://dev.classmethod.jp/articles/openai-api-quickstart-tutorial/

client = OpenAI(
    api_key = "ここにOpenAI APIキーを記載"
)

response = client.chat.completions.create(
    model="gpt-4-1106-preview",
    messages=[
        {"role": "system", "content": "あなたは家庭料理に関するアドバイザーです。"},
        {"role": "user", "content": "お肉を使った料理のメニュー案を一つ考えて名前を教えてください。"},
    ],
)

レスポンスです。従来と比べるとsystem_fingerprintが追加されています。

print(response.model_dump_json(indent=2))

# {
#   "id": "chatcmpl-8I6NPHwwqiQd86hGmtaIG1v3MXQel",
#   "choices": [
#     {
#       "finish_reason": "stop",
#       "index": 0,
#       "message": {
#         "content": "もちろんです。お肉を使った料理のメニュー案として、「和風ガーリックステーキ丼」はいかがでしょうか。これは、日本の丼ものに馴染みやすい味付けで、ニンニクのきいたステーキをご飯の上に載せた料理です。以下、簡単なレシピです。\n\n【和風ガーリックステーキ丼】\n\n材料:\n- ステーキ用のお肉(好みの部位):200g\n- ご飯:丼2杯分\n- にんにく:2かけ\n- 醤油:大さじ2\n- みりん:大さじ1\n- バター:大さじ1\n- サラダ油:適量\n- 塩、コショウ:少々\n- 刻みネギや白ごま(トッピング):適量\n- レモンスライス(添え物):適量\n\n手順:\n1. にんにくをみじん切りにしておく。\n2. ステーキ肉を室温に戻し、塩コショウで下味をつける。\n3. フライパンにサラダ油を熱し、みじん切りにんにくを炒め香りを出す。バターを加えて溶かす。\n4. 肉をフライパンに入れ、好みの焼き加減にする。途中で一度取り出して休ませ、再び戻して焼き目を付けることで、中まで火を通しやすくする。\n5. 火から下ろし、肉を取り出して軽く休ませたあと薄切りにする。\n6. 余熱で熱くなっているフライパンに醤油とみりんを加え、煮立たせてソースを作る。\n7. ご飯を丼に盛り、その上にステーキを載せ、作ったソースをかける。\n8. 刻みネギや白ごま、レモンスライスをトッピングして完成。\n\n簡単にできるのに豪華な見た目と味わいが楽しめるメニューです。おもてなしや特別な日の食事にもおすすめです。",
#         "role": "assistant",
#         "function_call": null,
#         "tool_calls": null
#       }
#     }
#   ],
#   "created": 1699325107,
#   "model": "gpt-4-1106-preview",
#   "object": "chat.completion",
#   "system_fingerprint": "fp_a24b4d720c",
#   "usage": {
#     "completion_tokens": 682,
#     "prompt_tokens": 62,
#     "total_tokens": 744
#   }
# }

本文は以下のようになっています。

print(response.choices[0].message.content)

# もちろんです。お肉を使った料理のメニュー案として、「和風ガーリックステーキ丼」はいかがでしょうか。これは、日本の丼ものに馴染みやすい味付けで、ニンニクのきいたステーキをご飯の上に載せた料理です。以下、簡単なレシピです。
#
# 【和風ガーリックステーキ丼】
#
# 材料:
# - ステーキ用のお肉(好みの部位):200g
# - ご飯:丼2杯分
# - にんにく:2かけ
# - 醤油:大さじ2
# - みりん:大さじ1
# - バター:大さじ1
# - サラダ油:適量
# - 塩、コショウ:少々
# - 刻みネギや白ごま(トッピング):適量
# - レモンスライス(添え物):適量
#
# 手順:
# 1. にんにくをみじん切りにしておく。
# 2. ステーキ肉を室温に戻し、塩コショウで下味をつける。
# 3. フライパンにサラダ油を熱し、みじん切りにんにくを炒め香りを出す。バターを加えて溶かす。
# 4. 肉をフライパンに入れ、好みの焼き加減にする。途中で一度取り出して休ませ、再び戻して焼き目を付けることで、中まで火を通しやすくする。
# 5. 火から下ろし、肉を取り出して軽く休ませたあと薄切りにする。
# 6. 余熱で熱くなっているフライパンに醤油とみりんを加え、煮立たせてソースを作る。
# 7. ご飯を丼に盛り、その上にステーキを載せ、作ったソースをかける。
# 8. 刻みネギや白ごま、レモンスライスをトッピングして完成。
#
# 簡単にできるのに豪華な見た目と味わいが楽しめるメニューです。おもてなしや特別な日の食事にもおすすめです。

openaiモジュールもPydanticモデルが使用され、かなり使いやすくなっていました。

[New] Function callingの並列化と高精度化

Function callingが更新され、1つのメッセージで複数の関数を呼び出すように動作するようになりました。(正確には複数呼び出すようにレスポンス側に指示が来ます)

こちらはgpt-4-1106-previewgpt-3.5-turbo-1106で使用可能です。

また、Function calling自体の精度も向上され、正しい関数パラメータを返す可能性が高くなっているようです。

上記の公式ガイドでは並列的なFunction callingの例として、例えば3箇所の天気を取得する機能を例として説明されています。

こちらは後程試してみようと思います。

[New] 設定順守の改善とJSON Modeの発表

GPT-4 Turboはフォーマットの指示により厳密に従ってくれるようにパフォーマンスが改善しました。

またそれとは別に、モデルが有効なJSONで応答することを保証する新しいJSONモードもサポートしています。

こちらもgpt-4-1106-previewgpt-3.5-turbo-1106で使用可能です。

response_formatを{ type:"json_object" }に設定すると、JSONモードが有効にできるようです。

前提として以下に気を付ける必要があります。

  • JSONモードを使用するには、システムメッセージでモデルにJSONを生成するように指示する必要あり
    • システムメッセージに"JSON"という文字列がない場合、APIはエラーとなる
  • finish_reasonが lengthの場合、モデルが返すメッセージは部分的なものになる可能性がある
  • JSONモードは、出力が特定のスキーマにマッチすることを保証するものではなく、JSONとしてエラーなくパースされることだけを保証するもの

こちらは後程試してみようと思います。

[Beta] seedで一貫性のある出力が可能に

seedパラメータを新しく追加し、モデルがほぼ一貫性のある出力得られるようになりました。

この機能は、デバッグのためにリクエストを再送したり、より包括的な単体テストを書いたり、一般的にモデルの動作をより高度に制御したりするようなユースケースに便利となっています。

実際にOpenAI社でも、この機能をユニットテストに使用しているそうです。

今までもtemperatureを0.0に設定するなどをすれば、出力をある程度固定化することができていました。一方でこの設定は多様性を排しており、その他の別のより良い回答を得るためには、ランダム性を許容する必要がありました。

今回、seedパラメータを追加することにより、temperatureを0.7と多様性が高い設定にしても、seedが固定であればほぼ決まった出力を得ることができるようになっています。

言い換えれば、その他の別のより良い回答を得るためにseedパラメータの方を調整すれば、より良い回答が得られた時点でseedを固定することで理想的な回答を得ることも可能です。(この調整に賛否はあるところですが)

以下に公式のCookbookが紹介されています。よろしければ試してみてください。

またこのseedパラメータとは別に、GPT-4 TurboとGPT-3.5 Turboモデルによって生成された出力の、最も可能性の高い出力のlog probabilityを返す機能を今後数週間以内に提供する予定とのことです。

[New] GPT-3.5 Turboのアップデート

GPT-4 Turboに加えて、GPT-3.5 Turboも更新されました。こちらはPreviewではなく一般利用可能なモデルとなっているようです。

gpt-3.5-turbo-1106モデルを指定すれば使用可能になります。

GPT-3.5 Turboのそれぞれの表です。

model input output コンテキスト長 学習データ
gpt-3.5-turbo-0613 $0.0015 per 1k token $0.002 per 1k token 4,096 2021年9月まで
gpt-3.5-turbo-16k-0613 $0.003 per 1k token $0.004 per 1k token 16,384 2021年9月まで
gpt-3.5-turbo-instruct $0.0015 per 1k token $0.002 per 1k token 4,096 2021年9月まで
gpt-3.5-turbo-1106 $0.0010 per 1k token $0.002 per 1k token 16,384 2021年9月まで

16kトークンに統一され、価格もgpt-3.5-turbo-1106が最も安価になっています。

学習データは変わらず2021年9月までである点はご留意ください。(GPT-4 Turboは2023年4月に拡大していました)

gpt-3.5-turbo-1106は、GPT-4 Turboと同様に以下の機能をサポートしています。

  • [New] Function callingの並列化と高精度化
  • [New] 設定順守の改善とJSON Modeの発表
  • [Beta] seedで一貫性のある出力が可能に

gpt-3.5-turboモデルの参照先は2023年12月11日に自動的に新しいモデルにアップグレードされますので、ここも意識しておきましょう。

gpt-3.5-turbo-0613もSHUTDOWN DATEが以下に記載されており、2024年6月13日までで以降はSHUTDOWNされるようです。(0314系もat earliest 2024-06-13なのですね…)

[Beta] Assistants APIの発表

Assistants APIの発表が発表されました。

要点をまとめてみました。

  • 知識を拡張することが可能で、必要に応じてモデルやツールを呼び出してタスクを実行するAssistantsを作成することができる
  • Code InterpreterやRetrieval、Function callingなどの機能も利用可能で、これまで自作が必要であった多くの作業をOpenAIに任せ、アプリケーションの実装に注力することが可能
  • 持続的で無限に長いスレッドが使用でき、開発者はスレッドの状態管理をOpenAIに委ねることができ、コンテキスト長の制約を回避することが可能
  • 他のプラットフォームと同様、Assistants APIに渡されたデータやファイルは、モデルのトレーニングに使用されることはない

これでOpenAI公式の機能を使用してエージェントなどの実装が可能となりそうで、かなり影響が大きいと思います。

Assistants Playgroundでコードを書かずにAssistants APIを試すこともできます。

もちろんコードでも試すことが可能で、以下のページで詳細を確認できます。

Assistants APIは後述する画像入力には対応していないようです。

詳細については別ブログでまとめようと思います。

[Preview] GPT-4 Turboが画像入力に対応

GPT-4 Turboからは画像入力が使用可能になりました。

別モデル名としてgpt-4-1106-vision-previewを指定することで利用可能となっています。

概要は以下です。

  • gpt-4-1106-vision-previewは単に視覚能力が追加されたGPT-4 Turboモデルとなっており、テキストタスクも同等に処理可能
  • 現段階ではsystemメッセージには画像入力をサポートしていない(userメッセージでのみ入力可能)
  • 画像に何が写っているかという一般的な質問に答えるのに最も適しており、画像内の関係は理解できるが、物体検出などの位置特定の用途にはまだ最適化されていない
  • 入力の指定方法としてはパブリックに参照可能なURLを指定する方法と、Base64エンコードしたデータを指定する方法の2種類が準備
  • チャットAPIと同様にステートレスなので同じ画像について複数回チャットしたい場合は都度画像ファイルを渡す必要がある
  • 画像はモデルによって処理された後、OpenAIのサーバーから削除され、保持されない

また制限事項として以下が挙げられていました。

  • Medical images : Tスキャンのような医療画像の解釈には適していない
  • Non-English : 日本語や韓国語のような非ラテンアルファベットのテキストを含む画像を扱う場合、モデルは最適に動作しない可能性がある
  • Big Text : 読みやすさを向上させるために画像内のテキストを大きくしますが、重要な詳細は切り取らないようにしてください。
  • Rotation : 回転や上下逆さまのテキストや画像は、モデルが誤って解釈する可能性がある
  • Visual elements : 実線、破線、点線などの色やスタイルが異なるグラフやテキストを理解するのに苦労するケースがある
  • Spatial reasoning : チェスのポジションの特定など、正確な空間定位が必要なタスクに苦労するケースがある
  • Accuracy : 特定のシナリオにおいて、誤った説明やキャプションを生成することがある
  • Image shape : パノラマ画像や魚眼レンズによる画像は苦手とする
  • Metadata and resizing : このモデルは、元のファイル名やメタデータを解釈せず、画像は分析前にリサイズされるため、元のサイズに影響を与える
  • Counting : 画像内のオブジェクトのおおよその数のカウントが可能
  • CAPTCHA: 安全上の理由から、CAPTCHAの提出をブロックするシステムを実装

苦手なケースや適さないケースもあるようですので意識しておきましょう。

特徴の詳細は以下も参照ください。

価格はテキストのトークンとは別に入力画像サイズに依存したトークンが計算され、それに基づいて決定されます。例えば、1080×1080ピクセルの画像を処理する場合$0.00765かかります。

価格計算の仕組みは少し複雑で、詳細は以下を参照ください。

ざっと説明すると以下のようになります。

  • detail:lowの場合
    • 固定で85トークンが入力トークンとなり、これに「$0.01 per 1k token」が掛けられた価格
  • detail:highの場合
    • 最終的に768x768に収まるようリサイズ
    • リサイズ結果が512x512の正方形タイルで何個分になるか計算する
    • 「(タイルの個数 x 175トークン) + 85トークン」が入力トークンとなり、これに「$0.01 per 1k token」が掛けられた価格

試してみた

少しだけgpt-4-1106-vision-previewをPythonで試してみましょう。

from openai import OpenAI

client = OpenAI()

response = client.chat.completions.create(
    model="gpt-4-vision-preview",
    messages=[
        {
            "role": "user",
            "content": [
                {"type": "text", "text": "この画像は何ですか?"},
                {
                    "type": "image_url",
                    "image_url": {"url": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/dd/Gfp-wisconsin-madison-the-nature-boardwalk.jpg/2560px-Gfp-wisconsin-madison-the-nature-boardwalk.jpg", "detail": "high"}
                },
            ],
        }
    ],
    max_tokens=1000
)

以下で結果を確認してみます。

print(response.model_dump_json(indent=2))

# {
#   "id": "chatcmpl-8I74aGqawV6a4JEJ8cWuN3KuEMWM8",
#   "choices": [
#     {
#       "finish_reason": null,
#       "index": 0,
#       "message": {
#         "content": "この画像には、草原や湿地を通る木造の遊歩道が映っています。遊歩道は自然を楽しみながら歩くために設けられたもので、環境への影響を最小限に抑えることができるよう設計されています。画像の背景には青い空と白い雲が広がり、自然の美しさと静けさを表しています。",
#         "role": "assistant",
#         "function_call": null,
#         "tool_calls": null
#       },
#       "finish_details": {
#         "type": "stop",
#         "stop": "<|fim_suffix|>"
#       }
#     }
#   ],
#   "created": 1699327784,
#   "model": "gpt-4-1106-vision-preview",
#   "object": "chat.completion",
#   "system_fingerprint": null,
#   "usage": {
#     "completion_tokens": 138,
#     "prompt_tokens": 1120,
#     "total_tokens": 1258
#   }
# }

base64エンコードでやるならこのような感じです。

import base64

image_path = "./Gfp-wisconsin-madison-the-nature-boardwalk.jpg"

# Function to encode the image
def encode_image(image_path):
    with open(image_path, "rb") as image_file:
        return base64.b64encode(image_file.read()).decode('utf-8')

from openai import OpenAI

client = OpenAI()

response = client.chat.completions.create(
    model="gpt-4-vision-preview",
    messages=[
        {
            "role": "user",
            "content": [
                {"type": "text", "text": "この画像は何ですか?"},
                {
                    "type": "image_url",
                    "image_url": {"url": f"data:image/jpeg;base64,{encode_image(image_path)}", "detail": "high"}
                },
            ],
        }
    ],
    max_tokens=1000
)

[New] DALL·E 3のAPIが公開

ChatGPT PlusとEnterpriseユーザーに提供を開始した画像生成モデル、DALL·E 3がAPIでも利用可能になりました。

主な特徴は以下となります。

  • 画像のサイズは 1024x1024、1024x1792、1792x1024 ピクセルのいずれかを指定可能
  • DALL·E 3では一度に1枚まで画像生成が可能です(DALL·E 2ではパラメータで一度に10枚まで要求可能
  • Edits、VariationsはDALL·E 3のみでは未サポート

詳細は以下もご確認下さい。(公式Cookbookもあります)

価格は画像の解像度毎に異なっています。

model 解像度 価格
DALL·E 3 1024x1024 $0.040 / image
DALL·E 3 1024x1792, 1792x1024 $0.080 / image
DALL·E 3 HD 1024x1024 $0.080 / image
DALL·E 3 HD 1024x1792, 1792x1024 $0.120 / image
DALL·E 2 1024x1024 $0.020 / image
DALL·E 2 512x512 $0.018 / image
DALL·E 2 256x256 $0.016 / image

HDについてですが、qualityパラメータをstandardhdの2種類から選択可能で、こちらの設定により価格が異なるようです。

弊社ブログでもためしてみた記事が出ていますので参照ください。

[New] Text-to-speech (TTS)が公開

音声合成用のAPIが公開されました。

特徴は以下となっています。

  • 音声合成によりテキストから人間品質の音声を生成できるように
  • 6つのプリセット音声から種類を選択可能で、tts-1とtts-1-hdの2つのモデルバリエーションあり
    • プリセット音声はalloy, echo, fable, onyx, nova, shimmer
  • tts-1はリアルタイム用途、tts-1-hdは品質に最適化
  • デフォルトではmp3フォーマットだが、Opus、AAC、FLACにも対応

以下のような2パターンの価格となっています。

model 価格
tts-1 $0.015 / 1K characters
tts-1-hd $0.030 / 1K characters

詳細は以下もご覧ください。

[New] Whisper v3 (OSS)がリリース

オープンソースの自動音声認識モデル(ASR)の次期バージョンであるWhisper large-v3がリリースされました。

こちらはGitHub上のOSSのリリースとなっています。

機能的な違いはまだ把握できていませんが、全体的な認識性能が向上しています。

近い将来、OpenAI APIでもWhisper v3をサポートする予定とのことです。(現在はAPIから使用するとv2となります)

その他の発表

  • GPT-4 fine tuning experimental access
    • GPT-4のfine-tuningについては、experimentalとなっており現在一部の対象ユーザが使用できる状態となっています。
    • GPT-3.5のfine-tuningを積極的に使用している開発者には、fine-tuning console内でGPT-4プログラムに適用するオプションが提示されるとのことです。
  • Custom models
    • fine-tuningが提供できる以上のカスタマイズを必要とする組織のために、カスタムモデルプログラムも開始
    • 特に、最低でも数十億トークンという非常に大規模な独自データセットを持つドメインに適用可能
  • Lower prices
    • fine-tuningされたGPT-3.5 Turboモデルもより低価格に変更
  • Higher rate limits
    • アプリケーション拡張を支援するため、GPT-4 の有料会員を対象に 1 分あたりのトークン上限を 2 倍に引き上げ
    • また、料金制限の自動引き上げを決定する使用量階層を公開
    • アカウント設定から利用限度額の引き上げをリクエストできるように
  • Copyright Shield
    • 著作権侵害に関する法的請求に直面した場合、開発者を守り、発生した費用を支払う仕組みを開始(ChatGPTエンタープライズと開発者プラットフォームの一般的に利用可能な機能に適用)

まとめ

いかがでしたでしょうか。たくさんあって深堀りきれなかったので、別途記事を書いていきたいと思います。

本記事が概要を理解する手助けとなりましたら幸いです。