はじめに
こんにちは、慶應義塾大学理工学部機械工学科3年の金賢佑です!
私は東大発AIベンチャーの株式会社2WINSの元でインターンをしています!
これからの記事では自分がインターンを通して最強のAIエンジニアを目指していきます!
第二回はチャットAPIの基礎を記録しました!
APIとは?
ここではAPIKEYが取得していることを前提で進めます。また、今回はGoogle Colabを使用しています。
調べるとAPIについてたくさんの情報が出てきます。アプリとプログラムを繋ぐものだとか、APIリクエストだとかAPIレスポンスだとか、何だとか....
例えで考えてみましょう。
あなたがハンバーガー🍔屋さんに行ったとします。
そうするとメニューがありますね。これがAPIです。
メニューを見たあなたは「チーズバーガー🍔を一つください!」と注文します。
これがAPIリクエストになります。
そうすると店員さんが「はい、どうぞ、チーズバーガー🍔です!」と商品をくれます。
これがAPIレスポンスです。
APIの例として
OpenAI API
:ChatGPTに質問して返事をもらう
Google Maps API
:地図を表示したり、住所検索をしたり
Twitter API
:ツイートを取得したり投稿できる
いろんなメニュー🍔がありますね。
しかしこのお店、誰でも利用できるわけではありません。
「会員制ハンバーガーショップ」なのです。
そこで必要になるのがAPIキーです。
APIキーはなぜ必要なの?
・誰が使っているのかわかる。
・不正利用、スパムを避ける。
・課金の紐付け。
などなど。
なのでAPIキーは大切に保管しなくてはいけません。
APIキーをシークレットに
そんなわけで取得したAPIキーはGoogle Colabのシークレットに保存しましょう。
OPENAI_API_KEYという名称で保存してください!
あとは以下のコマンドでGoogle Colabのシークレットに保存したAPIキーをOPENAI_API_KEYという名前の環境変数に設定します。
import os
from google.colab import userdata
os.environ['OPENAI_API_KEY'] = userdata.get('OPENAI_API_KEY')
これでいつでも自分のAPIが使えるようになりましたね。
先程説明した通り、APIキーがあると色んなAPIが使えるんでしたよね。
そこで今回はOpenAI APIを使ってみたいと思います!
実際にGPTを使ってみよう
下のコマンドを実行することでOpenAIのライブラリを使用できます。
!pip install openai==1.40.6
では試しにgpt-4o-miniを使ってみます。以下のコマンドを打ってみてください!
import os
from google.colab import userdata
os.environ['OPENAI_API_KEY'] = userdata.get('OPENAI_API_KEY')
from openai import OpenAI
client = OpenAI()
response = client.chat.completions.create(
model='gpt-4o-mini',
messages=[
{'role':'system', 'content':'You are an assistant.'},
{'role':'user', 'content':'私はコーヒーが好きです。'},
{'role':'assistant', 'content': 'コーヒーは美味しいですよね。'},
{'role':'user', 'content':'私が好きな飲み物は何ですか?'}
],
)
print(response.to_json(indent=2))
しかし、このコマンドを実行してもエラーが起きてしまいます。
エラーの対処
長々とエラー文が書かれていますね。
エラー分についてですが、枠の一番下、赤枠の部分に問題点がまとまっています。
今回だと、
TypeError: Client.__init__() got an unexpected keyword argument 'proxies'
と書かれています。
頑張って読むと、OpenAI()
を使ってクライアントを作るときに、proxies
という引数を渡したけれど、そもそもproxies
という名前の引数は__init__()
では受け付けていません、という意味です。
こういったエラーの時、初心者の方(自分を含む)はChatGPTに放り投げがちですが、自分はQiitaで検索してみることをお勧めします。
QiitaでTypeError: Client.__init__() got an unexpected keyword argument 'proxies'
と検索すると、早速同じエラーに遭遇した人が解決した記事を投稿していますね。
今回は@hatman621221さんの記事を参考にしてみました。
https://qiita.com/hatman621221/items/fafaf4ac0e906616e8bd
httpxのバージョンを指定するとうまくいくみたいですね。
!pip install httpx==0.27.2
話を戻します。
先ほどのコマンド、
import os
from google.colab import userdata
os.environ['OPENAI_API_KEY'] = userdata.get('OPENAI_API_KEY')
from openai import OpenAI
client = OpenAI()
response = client.chat.completions.create(
model='gpt-4o-mini',
messages=[
{'role':'system', 'content':'You are an assistant.'},
{'role':'user', 'content':'私はコーヒーが好きです。'},
{'role':'assistant', 'content': 'コーヒーは美味しいですよね。'},
{'role':'user', 'content':'私が好きな飲み物は何ですか?'}
],
)
print(response.to_json(indent=2))
を初心者の方でもわかりやすく少しずつ解説していきます。
from openai import OpenAI
client = OpenAI()
from openai import OpenAI
はopenai
というOpenAI社が提供する公式のPythonライブラリからOpenAI
というクラスを取り出したいという意味です。
openai
は!pip install openai==1.40.6
で最初にインストールしましたね。
クラスはよくインスタンスと一緒に勉強することが多いと思います。
ここではライブラリは箱📦、クラスは道具🛠️だと思っていてください。
client = OpenAI()
についてですが、()
は「関数やらクラスを使う」ことだと思っていてください。(ちなみにクラスで作られたものをインスタンスと言います。)
なので、これは先ほどインポートしたOpenAIを使うということにclientという名前をつけているのです。
response = client.chat.completions.create(
client
はさっき作ったAIとの窓口。
chat
チャット機能を使いますという指定。
completions
AIの続きを考えてもらう機能。
create
作ってもらう機能。
※.
は「〜の中にある機能を使う」という意味。だから今回だと、「client の中の chat の中の completions の中の create 関数を実行してね!」っていう意味になる。
model='gpt-4o-mini',
messages=[
{'role':'system', 'content':'You are an assistant.'},
{'role':'user', 'content':'私はコーヒーが好きです。'},
{'role':'assistant', 'content': 'コーヒーは美味しいですよね。'},
{'role':'user', 'content':'私が好きな飲み物は何ですか?'}
]
)
model='gpt-4o-mini
はモデルの指定。
messages=[
からが会話の履歴。
役割role
には
system
:AIにどういうキャラで話すのかを伝えている。
user
:ユーザーの最初の発言。
assistant
:AIがそれに対して返事した内容。(今回は履歴として入力済み)
user
:2回目のユーザーの発言。
が含まれている。
これらを実行するとGPTからは以下の回答が。
{
"id": "chatcmpl-BIXoEcPdf4Aj2ptnF9nU0s5ET6DtC",
"choices": [
{
"finish_reason": "stop",
"index": 0,
"logprobs": null,
"message": {
"content": "あなたが好きな飲み物はコーヒーです。もし他にも好きな飲み物があれば教えてください!",
"refusal": null,
"role": "assistant",
"annotations": []
}
}
],
"created": 1743759566,
"model": "gpt-4o-mini-2024-07-18",
"object": "chat.completion",
"service_tier": "default",
"system_fingerprint": "fp_b376dfbbd5",
"usage": {
"completion_tokens": 30,
"prompt_tokens": 56,
"total_tokens": 86,
"prompt_tokens_details": {
"cached_tokens": 0,
"audio_tokens": 0
},
"completion_tokens_details": {
"reasoning_tokens": 0,
"audio_tokens": 0,
"accepted_prediction_tokens": 0,
"rejected_prediction_tokens": 0
}
}
}
大事なところのみ解説していきます。
{
"id": "chatcmpl-BIXoEcPdf4Aj2ptnF9nU0s5ET6DtC",
これはただの識別番号。
"choices": [
{
"finish_reason": "stop",
"index": 0,
GPTは複数の返事(候補)を出せますが、今回は一個だけ返ってきていますね。これは"index": 0
から読み取ってください。
"message": {
"content": "あなたが好きな飲み物はコーヒーです。もし他にも好きな飲み物があれば教えてください!",
"role": "assistant",
}
content
は返事の内容です。
role
はAIの役割です。assistantとして返事をしてくれたのですね。
"usage": {
"completion_tokens": 30,
"prompt_tokens": 56,
"total_tokens": 86,
},
ここではGPTが使用したトークン数(単語数みたいなもの)の数を示しています。
OpenAIでは使ったトークン数で料金が決まりますからね。
completion_tokens
は返事にかかったトークン数
prompt_tokens
は入力に使ったメッセージのトークン数
total_tokens
は合計トークン数
まとめ
このようにAPIキーがあればOpenAIの機能も使えちゃえたりするわけですね。
次回は2023年にChat Completions APIに実装されたFunction callingという機能を触ってみたいと思います!
お疲れ様でした!