【０から目指すAIエンジニア】Day2：チャットAPIの基礎

# はじめに
こんにちは、慶應義塾大学理工学部機械工学科3年の金賢佑です！
私は東大発AIベンチャーの株式会社2WINSの元でインターンをしています！

これからの記事では自分がインターンを通して最強のAIエンジニアを目指していきます！
第二回はチャットAPIの基礎を記録しました！


# APIとは？
<font color="red">**ここでは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という名称で保存してください！

![スクリーンショット 2025-04-02 18.40.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4047475/dcc964cf-9272-4822-9112-37655a772693.png)

あとは以下のコマンドでGoogle Colabのシークレットに保存したAPIキーをOPENAI_API_KEYという名前の環境変数に設定します。
```python
import os
from google.colab import userdata

os.environ['OPENAI_API_KEY'] = userdata.get('OPENAI_API_KEY')
```
これでいつでも自分のAPIが使えるようになりましたね。

先程説明した通り、APIキーがあると色んなAPIが使えるんでしたよね。
そこで今回はOpenAI APIを使ってみたいと思います！

# 実際にGPTを使ってみよう

下のコマンドを実行することでOpenAIのライブラリを使用できます。
```python
!pip install openai==1.40.6
```
では試しにgpt-4o-miniを使ってみます。以下のコマンドを打ってみてください！
```python
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))
```
しかし、このコマンドを実行してもエラーが起きてしまいます。

#### エラーの対処
![スクリーンショット 2025-04-04 15.35.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4047475/0a06023e-445d-4df1-8331-b7e40e8b89eb.png)

長々とエラー文が書かれていますね。
エラー分についてですが、枠の一番下、赤枠の部分に問題点がまとまっています。

今回だと、
`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のバージョンを指定するとうまくいくみたいですね。
```python
!pip install httpx==0.27.2 
```
話を戻します。
先ほどのコマンド、
```python
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))
```
を初心者の方でもわかりやすく少しずつ解説していきます。


```python
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という名前をつけているのです。


```python
response = client.chat.completions.create(
```
`client`はさっき作ったAIとの窓口。
`chat`チャット機能を使いますという指定。
`completions`AIの続きを考えてもらう機能。
`create`作ってもらう機能。
※`.`は「〜の中にある機能を使う」という意味。だから今回だと、「client の中の chat の中の completions の中の create 関数を実行してね！」っていう意味になる。


```python
    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からは以下の回答が。
```python
{
  "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
    }
  }
}
```
大事なところのみ解説していきます。

```python
{
  "id": "chatcmpl-BIXoEcPdf4Aj2ptnF9nU0s5ET6DtC",
```
これはただの識別番号。
```python
  "choices": [
    {
      "finish_reason": "stop",
      "index": 0,
```
GPTは複数の返事（候補）を出せますが、今回は一個だけ返ってきていますね。これは`"index": 0`から読み取ってください。
```python
      "message": {
        "content": "あなたが好きな飲み物はコーヒーです。もし他にも好きな飲み物があれば教えてください！",
        "role": "assistant",
      }
```
`content`は返事の内容です。
`role`はAIの役割です。assistantとして返事をしてくれたのですね。

```python
  "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という機能を触ってみたいと思います！

お疲れ様でした！