2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

OpenAI API移行

Last updated at Posted at 2023-07-22

OpenAI API移行

概要

大規模言語モデル(LLM)の「GPT-4」および「GPT-3.5」ファミリーの最新スナップショットモデル(0613)をリリースされ、旧モデルが非推薦となるアナウンスがあったので、OpenAIのAPIを「Chat Completions API」形式に移行しなければいけないため、その内容をまとめます。

image.png

OpenAI API入門

こちらはご参照ください。よりAPI移行の内容が理解しやすくなります。

プロンプトからメッセージへ

API移行のポイントは「プロンプト」から「メッセージ」に変更することです。その内容が理解できれば、OpenAIのAPIを使ったアプリケーション開発によい精度を得ることになります。

用語理解 : Chat Completions APIとCompletions API

OpenAIのAPIにはChat Completions APIとCompletions APIという2つの主要なタイプがあります。

Chat Completions API

APIのエンドポイント : https://api.openai.com/v1/chat/completions

Request Bodyの設定項目:messages (メッセージ)

一連の対話を扱うように設計されています。つまり、一つのプロンプトだけでなく、一連のメッセージを入力として受け取り、それらに基づいて応答を生成します。

import os
import openai
openai.api_key = os.getenv("OPENAI_API_KEY")
openai.ChatCompletion.create(
  model="gpt-4",
  messages=[
    {"role": "system", "content": "あなたはジャーナリストです。"},
    {"role": "user", "content": "OpenAI社について説明してください。"}
  ]
)

Completions API

APIのエンドポイント : https://api.openai.com/v1/completions

Request Bodyの設定項目:prompt (プロンプト)

一つのプロンプトから始まり、それに対する一つの応答を生成するように設計されています。つまり、ユーザーが何らかの入力を提供し、APIがその入力に基づいて何らかの完結したテキストを生成します。

import os
import openai
openai.api_key = os.getenv("OPENAI_API_KEY")
openai.Completion.create(
  model="text-davinci-003",
  prompt="OpenAI社について説明してください。"
)

手順1. プロンプト内容をメッセージ形式に変更

Completions APIの一つプロンプトに対してUserロール定義のメッセージ形式に変更します。

Userロールの定義意味についてはここをご参照ください。

'prompt' : 'OpenAI社について説明してください。'



'messages': [{'role':'user', 'content':'OpenAI社について説明してください。'}]

手順2. Systemロール定義追加

Systemロール定義を追加して会話中のモデルの動作をガイドできるようにします。

OpenAIの自然言語モデルの最新バージョン0613では(ここ参考)システムメッセージに操縦性が強化されたので、システムメッセージに示された指示に従うようになったことです。

'messages': [{'role':'user', 'content':'OpenAI社について説明してください。'}]



'messages': [
  {'role':'system', 'content':'あなたはジャーナリストです。'},
  {'role':'user', 'content':'OpenAI社について説明してください。'}
]

手順3. Assistantロール定義追加とリスト完成

Assistantロール定義を追加して文脈を踏まえて回答できるようにします。そしてメッセージはリストに表示される順序で処理されて回答されます。

'messages': [
  {'role':'system', 'content':'あなたはジャーナリストです。'},
  {'role':'user', 'content':'OpenAI社について説明してください。'}
]



'messages': [
  {'role':'system', 'content':'あなたはジャーナリストです。'},
  {'role':'user', 'content':'OpenAI社について説明してください。'},
  {'role':'assistant', 'content':'イーロン・マスクさんはOpenAIを辞めた。'}
]

完成コード

Python

import os
import openai
openai.api_key = os.getenv("OPENAI_API_KEY")
openai.ChatCompletion.create(
  model="gpt-4",
  messages=[
    {"role": "system", "content": "あなたはジャーナリストです。"},
    {"role": "user", "content": "OpenAI社について説明してください。"},
    {"role": "assistant", "content": "イーロン・マスクさんはOpenAIを辞めた。"}
  ]
)

curl

curl https://api.openai.com/v1/chat/completions \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -d '{
    "model": "gpt-4",
    "messages": [{"role": "system", "content": "あなたはジャーナリストです。"},{"role": "user", "content": "OpenAI社について説明してください。"},{"role": "assistant", "content": "イーロン・マスクさんはOpenAIを辞めた。"}]
  }'

PowerShell (Windows)

$body = @{
  "model" = "gpt-4"
  "messages" = @(
    @{
      "role" = "system"
      "content" = "あなたはジャーナリストです。"
    },
    @{
      "role" = "user"
      "content" = "OpenAI社について説明してください。"
    },
    @{
      "role" = "assistant"
      "content" = "イーロン・マスクさんはOpenAIを辞めた。"
    }
  )
} | ConvertTo-Json

Invoke-WebRequest `
  -Headers @{"Content-type"="application/json"; "Authorization"="Bearer " + $env:OPENAI_API_KEY} `
  -Method Post `
  -Body $body `
  -Uri 'https://api.openai.com/v1/chat/completions'

Azure OpenAI サービス向け

GPT-35-Turbo および GPT-4 ファミリーモデルを操作するには「Chat Completion API」と「ChatML」の二つオプションがありますが、こちらではOpenAI APIと同じように使える「Chat Completion API」で紹介します。

Python

import os
import openai
openai.api_type = "azure"
openai.api_base = "https://<リージョン名>.api.cognitive.microsoft.com/"
openai.api_version = "2023-05-15"
openai.api_key = os.getenv("OPENAI_API_KEY")
openai.ChatCompletion.create(
  engine="<デプロイモデル名>",
  messages=[
    {"role": "system", "content": "あなたはジャーナリストです。"},
    {"role": "user", "content": "OpenAI社について説明してください。"},
    {"role": "assistant", "content": "イーロン・マスクさんはOpenAIを辞めた。"}
  ]
)

curl

curl https://<リージョン名>.api.cognitive.microsoft.com/openai/deployments/<デプロイモデル名>/chat/completions?api-version=2023-05-15 \
  -H "Content-Type: application/json" \
  -H "api-key: $OPENAI_API_KEY" \
  -d '{
    "messages": [{"role": "system", "content": "あなたはジャーナリストです。"},{"role": "user", "content": "OpenAI社について説明してください。"},{"role": "assistant", "content": "イーロン・マスクさんはOpenAIを辞めた。"}]
  }'

PowerShell (Windows)

$body = @{
  "messages" = @(
    @{
      "role" = "system"
      "content" = "あなたはジャーナリストです。"
    },
    @{
      "role" = "user"
      "content" = "OpenAI社について説明してください。"
    },
    @{
      "role" = "assistant"
      "content" = "イーロン・マスクさんはOpenAIを辞めた。"
    }
  )
} | ConvertTo-Json

Invoke-WebRequest `
  -Headers @{"Content-type"="application/json"; "api-key"=$env:OPENAI_API_KEY} `
  -Method Post `
  -Body $body `
  -Uri 'https://<リージョン名>.api.cognitive.microsoft.com/openai/deployments/<デプロイモデル名>/chat/completions?api-version=2023-05-15'
2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?