Azure OpenAIでChatGPTが利用できるようになりました。
デプロイ後はすぐにブラウザ上から使用することができますが、本記事ではPythonからChatGPT APIを使用する方法を解説します。
ChatGPTで生成する会話内容をAPIから制御する方法についても解説します。
前提
(2023/4/4 時点)
GPT-3モデルについてはすでに多くの種類が公開されています。
特にChat GPTについては、現時点でgpt-35-turboモデルがデプロイ可能となっています。
learn.microsoft.com
また今月から、追加で申請を行うことでGPT-4 がプレビューとして利用可能となりました。 news.microsoft.com
各モデルはAzure OpenAI Studioからデプロイ・使用することができます。
前準備
事前にOpenAI Studioでモデルを作成しておきます。
今回はChatGPTを使用したいので、適当な名前でgpt-35-turboモデルをデプロイしておきます。
今回はPythonプログラム上からChat GPT APIを叩いて使用します。
以下のパッケージのインストールが必要です。
pip install openai
以下のプログラムで、自身のURLとAPIキーを使って疎通確認を行います。これらはAzure Portal上から確認できます。
デプロイ済みモデルの一覧が表示されればOKです。
import openai import requests API_KEY = "" RESOURCE_ENDPOINT = "" openai.api_type = "azure" openai.api_key = API_KEY openai.api_base = RESOURCE_ENDPOINT openai.api_version = "2022-12-01" url = openai.api_base + "/openai/deployments?api-version=2022-12-01" r = requests.get(url, headers={"api-key": API_KEY}) print(r.text)
ChatGPTにリクエストを送信する
リクエストの送信方法
以下のリファレンス通りにリクエストを送信します。
response = openai.Completion.create( engine="ynishino-gpt-35-turbo-0301", # The deployment name you chose when you deployed the ChatGPT model prompt="\ <|im_start|>system\nAssistant is a large language model trained by OpenAI.\n<|im_end|>\n\ <|im_start|>user\nWhat's the difference between garbanzo beans and chickpeas?\n<|im_end|>\n\ <|im_start|>assistant\n", temperature=0, max_tokens=500, top_p=0.5, stop=["<|im_end|>"]) print(response['choices'][0]['text'])
各引数について
- engine
- Azure OpenAIにデプロイしたモデルのリソース名称
- prompt
- ※構造について後述
- temperature
- 低いほど一貫した結果が得られて、高いほど多様な出力が得られる
- max_tokens
- 入力候補に生成するトークンの最大数
- 1000トークンあたりの価格で課金が発生する
- 言語毎のトークン数
- 英語の場合は1000tokens = 約750単語(1 tokenが約0.75単語)
- 日本語の場合は独自のカウント指標。リンクから計測可能
- モデルごとにトークンの上限は決まっている
- max_tokens + 入力プロンプトのトークン数 < モデルのトークン上限
- top_p
- 予測する次の単語は確率の高い上位n%の候補から選択する(0.1 -> 10%)
- temperatureといずれかを選択する
- stop
- 指定した単語が出たら生成を終了する
promptの構造について
基本的なフォーマットは次の通りです。
<|im_start|>ロール名[改行(\n)]会話文<|im_end|> <|im_start|>ロール名[改行(\n)]
上記サンプルプログラムの例を使って説明します。
例ではロールに「system」「user」「assistant」の3種類が登場していました。
<|im_start|>system\nAssistant is a large language model trained by OpenAI.\n<|im_end|>\n <|im_start|>user\nWhat's the difference between garbanzo beans and chickpeas?\n<|im_end|>\n <|im_start|>assistant\n
ロールは以下の三種類を指定します。
- system
- ユーザーの入力に対してChatGPTがどのように振る舞うかを定義する
- user
- ユーザーが入力したメッセージ
- assistant
- GPTからのレスポンス
system
systemは、ChatGPTのふるまいをある程度決めることができます。
例えば以下のように出力を操作できます。
You are an AI assistant that primarily uses Japanese. You answer users' questions. (あなたは、主に日本語を使うAIアシスタントです。ユーザーからの質問に答えます。) ユーザー「こんにちは!あなたのことを教えてください。」 ChatGPT「こんにちは!私はAIアシスタントです。主に日本語を使用して、ユーザーの質問に答えたり、タスクを実行したりします。何かお手伝いできることがあれば、遠慮なくおっしゃってください。」
一番上のYou are ~~~の部分とユーザーの台詞が私が任意に入力した内容で、ChatGPTの台詞がAIが出力した文章です。
次にChatGPTに対して日本人のaikoという名前を付けて、返答に必ずジョークを含めるように指定してみます。
You are a human named Aiko from Japan. Always include a joke in your response. (あなたは日本から来たaikoという人間です。返答には必ずジョークを入れましょう。) ユーザー「こんにちは!あなたのことを教えてください。」 ChatGPT「こんにちは!私はAIアシスタントのAikoです。私は日本語を話すことができます。ここに面白いジョークがあります:なぜ猫がコンピューターを使わないのか?マウスがいるから!(笑)」
AIアシスタントという名乗りは変わりませんでしたが、自己紹介とジョークは指定した通りに言えています。
このようにsystemは、ユーザーの入力に依存せずにAIの振る舞いを決めたい場合に使用します。
userとassistant
userとassistantは、会話から出力を生成する際に使用します。
例えば以下のように使用します。
ユーザー「日本ビジネスシステムズという会社を知っていますか?」 ChatGPT「はい、日本ビジネスシステムズは、日本のIT企業の一つです。主に、システム開発やコンサルティング、システム運用・保守などのサービスを提供しています。また、金融機関や製造業、流通業など、幅広い業界に対応しています。」(※1) ユーザー「その会社の製品にはどのような特徴がありますか?」 ChatGPT「日本ビジネスシステムズは、主にビジネス向けのITソリューションを提供している会社です。同社の製品には、ERP(企業資源計画)システム、CRM(顧客関係管理)システム、人事・給与管理システム、販売管理システム、在庫管理システムなどがあります。これらの製品は、企業の業務プロセスを効率化し、生産性を向上させることができます。また、同社はクラウドサービスも提供しており、顧客のニーズに合わせた柔軟なソリューションを提供しています。」(※1)
※1:上記は今回使用したAIモデルが、APIデモのために自動的に生成した文章です。実際のJBSの業務を正確に表した内容ではありません。
2つ目の質問をリクエストする際に、1つ目の質問を使用して回答を生成しています。
逆に過去の会話を使用しなかった場合の出力は以下の通りです。
ユーザー「その会社の製品にはどのような特徴がありますか?」 ChatGPT「申し訳ありませんが、その会社の製品については具体的にどの会社のことをおっしゃっているのか、またどのような製品についてお知りになりたいのか、詳細を教えていただけますか?そうすれば、より正確な回答をお届けできます。」
一度出た情報を含めて会話を生成するためには、トークン上限を超えないようにpromptに過去のやりとりを含める必要があります。
おわりに
Azure OpenAI ChatGPTでは、送信したデータはモデルの学習に使用されることがなく、クローズドな環境で使用することができます。
企業からも利用しやすくなりましたので、ぜひ今回ご紹介したAPIを試してみてください。