PHPを使ってオリジナルアプリからChatGPT APIを利用してみた

# 内容
ChatGPT APIを使って、簡単なアプリからChatGPTと連携してみたいと思います
# 目次
- [APIキーの取得](https://qiita.com/shogo30/items/a9f8d7d4fbd3574c9009#api%E3%82%AD%E3%83%BC%E3%81%AE%E5%8F%96%E5%BE%97)
- [PHPを使ってChatGPTと連携する](https://qiita.com/shogo30/items/a9f8d7d4fbd3574c9009#php%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6chatgpt%E3%81%A8%E9%80%A3%E6%90%BA%E3%81%99%E3%82%8B)
- [エラーでうまくいかない時](https://qiita.com/shogo30/items/a9f8d7d4fbd3574c9009#%E3%82%A8%E3%83%A9%E3%83%BC%E3%81%A7%E3%81%86%E3%81%BE%E3%81%8F%E3%81%84%E3%81%8B%E3%81%AA%E3%81%84%E6%99%82)

# APIキーの取得
まずはAPIキーを取得しましょう。
[OpenAIのサイト](https://platform.openai.com/docs/overview)に飛びます。

サイドバーの「API keys」から「Start verification」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2935700/9bf04935-62e8-9c49-9f18-a34f2ca3bb10.png)

認証コードを受け取るための電話番号を入力します。
![スクリーンショット 2023-12-12 20.37.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2935700/efce8d52-588a-2861-aaa1-bfdbbf1b560c.png)

受け取った認証コードを入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2935700/70ce164f-b9ea-a138-051e-418b1d1ca967.png)

発行するシークレットキーに好きな名前をつけます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2935700/651e159b-c137-7bea-8555-b89145b36ea3.png)

するとシークレットキーが発行されます。
このシークレットキーはここでしか確認できないので、コピーして忘れないように保存しておきましょう。
![スクリーンショット 2023-12-12 20.40.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2935700/eece2331-8930-362b-9cc0-975399318214.png)

このシークレットトークンを使ってChatGPTと連携をすることができます。

# PHPを使ってChatGPTと連携する
ではさっそくオリジナルアプリからChatGPTを使ってみましょう。
※利用には多少のお金が発生します。

↓のように準備します
```
<?php
require 'vendor/autoload.php';

use GuzzleHttp\Client;
use Orhanerday\OpenAi\OpenAi;

$open_ai_key = '取得したシークレットキー';

// ライブラリのインスタンスを生成
$open_ai = new OpenAi($open_ai_key);

$seach_text = filter_input(INPUT_POST, 'seach_text', FILTER_DEFAULT);
$content = "のびえもーんは22世紀の未来から来たネコ型ロボットです。生年月日は2112年9月3日です。<br>
            ドラ太君は小学4年生の少年です。勉強も運動も苦手でド◯えもんの秘密道具に頼りっぱなしです。<br>
            ジャイカちゃんはのび太が思いを寄せるクラスメイトの少女です。成績は良く、真面目で優しい性格。よくお風呂に入っている。焼き芋が一番の好物であるがイメージダウンを気にして、あまり口にしない。<br>
            しず夫はのび○のクラスメイトの友達。身長が低いのをコンプレックスにしている。家が非常に裕福でよく自慢話をする。<br>
            スネアンはのび○のクラスメイトの友達。近所の「ガキ大将」。自己中心的で乱暴だが、非常に妹想いである。また、友情や愛情といった他人を思いやる行為に弱い一方、涙もろい一面も持つ";

if ($seach_text) {
    // ChatGPTを呼び出し
    $response = $open_ai->chat([
        'model' => 'gpt-3.5-turbo',
        'messages' => [
            [
                "role" => "assistant",
                "content" => $content
            ],
            [
                "role" => "user",
                "content" => $seach_text
            ],
        ],
    ]);
    $response_list = json_decode($response);
    $answer = $response_list->choices[0]->message->content;
}

?>
<!DOCTYPE html>

<html lang="ja">
<head>
    <meta charset="utf-8">
    <title>GPTアプリ</title>
</head>
<body>
    <form action="" method="post">
        <div>
            <input name="seach_text" type="text" placeholder="何が知りたいですか？" size="150">
            <button>検索</button>
        </div>
    </form>
    <div>
        <p>【検索結果】</p>
        <p>↓ここに検索結果が表示されます。</p>
        <p><?php echo($answer); ?></p>
    </div>

    <div>
        <p>【登場人物】</p>
	<p><?php echo($content); ?></p>
    </div>
</body>
</html>
```
シークレットキーをべたがきしていますが、セキュリティ上やばいので絶対にやめましょう。
.envなどに書きましょう。


そして必要なパッケージをインストールします。
```
composer require vlucas/phpdotenv orhanerday/open-ai
```

サーバーにアップロードしてブラウザで表示してみます。
ブラウザで表示させる方法は↓を参照ください。

https://qiita.com/shogo30/items/d2e0fa2e7ecafc690952

登場人物の「スネアン」の特徴を聞いてみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2935700/bd988519-7dcf-eb7c-aed2-2d1e6f2ae880.png)

ChatGPTがスネアンの特徴を端的にまとめてくれました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2935700/62956d95-aeb9-7d57-deda-46c46e098204.png)

今回は簡単に作った登場人物をまとめてもらいましたが、さらに登場人物が増えればGPT様の力が発揮されることでしょう。

# エラーでうまくいかない時
実行してもエラーでうまく実行できない時があり、
ターミナルで実行すると
```
You exceeded your current quota, please check your plan and billing details.
```
というエラーが出ることがあります。
原因としては、予算オーバーだそうです。
送信する文字数によって、ChatGPT APIの利用にはお金がかかります。

※今回利用したGPT-3.5 Turboの場合は、1000トークンにつき$0.001~$0.002です。
ひらがなやカタカナは1文字1トークン、漢字だと1文字2~3トークンです。
1000文字送って1円かからないくらいですね。

上記のエラーが出る場合は、[OpenAIのサイト](https://platform.openai.com/docs/overview)でいくらか予算を確保しましょう。

サイドバーの「Setting」から「Billing」を選択し、「Add payment details」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2935700/100b1c49-e572-65fe-2151-9e4ef5f9f161.png)

「Individual」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2935700/1521adaf-e7e9-36eb-7e54-6ce1d6c65b54.png)

そしてクレジットカードの情報を入力して、予算を確保しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2935700/e545f6d3-195f-8fc9-39b3-5ed2cf02f1ee.png)

私は最低額の$5を入れて利用しました。