日本語版
最新ニュース
科学&テクノロジー

PHP で GPT-4 API を使用するにはどうすればよいですか?

この最初の記事では、PHP で OpenAI API をインストールして使用する方法を説明します。 次に、API の最初の機能を使用して GPT-4 でプロンプトを実行する方法を見ていきます。 他の記事では、より高度な機能 (さらには) を紹介する予定です… 段階的に前進するための議題: OpenAI API を使用するためのパッケージと技術的な前提条件 OpenAI API を使用してプロンプトを実行できるようにするには、パッケージを使用します。 クライアント このパッケージはフレームワークに依存しません。 この記事の「さらに進む」セクションには、Symfony または Laravel 専用のパッケージへのリンクがあります。 このパッケージを使用できるようにするには、この記事の執筆時点で、少なくとも実行できる環境が必要です。 PHP8.1 について。 他の自尊心のある PHP パッケージと同様に、インストールは Composer を介して次のコマンドで行われます。 composer require openai-php/client OpenAI APIキーを取得する…

PHP で GPT-4 API を使用するにはどうすればよいですか?

1717042578
2024-05-27 12:19:26

この最初の記事では、PHP で OpenAI API をインストールして使用する方法を説明します。 次に、API の最初の機能を使用して GPT-4 でプロンプトを実行する方法を見ていきます。 他の記事では、より高度な機能 (さらには) を紹介する予定です…

段階的に前進するための議題:

OpenAI API を使用するためのパッケージと技術的な前提条件

OpenAI API を使用してプロンプトを実行できるようにするには、パッケージを使用します。 クライアント

このパッケージはフレームワークに依存しませんこの記事の「さらに進む」セクションには、Symfony または Laravel 専用のパッケージへのリンクがあります。

このパッケージを使用できるようにするには、この記事の執筆時点で、少なくとも実行できる環境が必要です。 PHP8.1 について

他の自尊心のある PHP パッケージと同様に、インストールは Composer を介して次のコマンドで行われます。

composer require openai-php/client

OpenAI APIキーを取得する

OpenAI API の使用は無料ではありません。 でアカウントを作成する必要があります https://platform.openai.com/ アカウントの作成は無料です。 ただし、API を使用できるようにするには、アカウントにクレジット ($) をプリロードする必要があります。

プロンプトのコストは、使用するモデル、送信されるデータの量、受信されるデータの量などによって異なります。 したがって、コストを把握するのは複雑です。 しかし、いずれにしても、平均的なプロンプトのコストは約 1 セントと見積もることができます。 つまり、1 ドルあれば 100 個のプロンプトを実行できることになります。 したがって、5 ドルから 10 ドルのクレジットを入金して開始すると、API をテストするために数百回の実行が可能になります。

OpenAI インターフェースは進化しています。 この記事を書いている時点では、クレジットの購入は[設定]>[請求]>[クレジット残高に追加]で確認できます。

それが完了したら、[API キー]>[新しい秘密キーの作成]で API キーを作成できます。

プロジェクトごとにキーを作成することをお勧めします。これにより、その使用状況を追跡し、必要に応じて簡単に非アクティブ化できるようになります。

この API キーは共有したり、バージョン管理したりしてはなりません。 環境ファイル (.env) の使用をお勧めします。

PHP での GPT4 API の最初の呼び出し

冒頭で説明したように、GPT-4 を使用します。

2024 年 5 月 13 日に、GPT-4 の最新バージョンである GPT-4o がリリースされました。 これは現時点で最速かつ最も安価なモデルです。

コードを適切に整理するには、プロンプトの実行専用のクラスを作成することをお勧めします。 これにより、構築、実行、データ回復に関連するすべてを同じ場所に保存できるようになります。

このクラスを「IA」と呼びます。

class IA
{
    // Modèles disponibles
    public const MODEL_GPT4_TURBO = 'gpt-4-turbo';
    public const MODEL_GPT4_O = 'gpt-4o';
    
    // Mon premier prompt
    public static function myFirstPrompt(): string
    {
        // Définition du prompt
	      $prompt="Explique moi pourquoi PHP est le meilleur langage pour faire du développement web ?";
	      
	      // Initialisation du client
	      $client = OpenAI::client(getenv('OPENAI_API_KEY')); // Clé disponible dans le fichier .env
	      
	      // Appel à l'API
	      $response = $client->chat()->create([
            'model' => self::MODEL_GPT4_O,
            'messages' => [
                [
                    'role' => 'user',
                    'content' => $prompt,
                ],
            ],
        ]);
        
        // Récupération de la réponse
        return $response->choices[0]->message->content;
    }
}

ちょっとした説明:

  • モデルを定数に入れることにしました。 こうすることで、タイプミスなどの危険を冒さずに、定数を介してそれらを効率的に呼び出すことができました。
  • 私の「myFirstPrompt」メソッドは静的であるため、AI オブジェクトをインスタンス化せずに呼び出すことができます。
  • したがって、このメソッドはプロンプトに対する応答を返します。 これは最も単純な使用例です。静的プロンプト (呼び出しごとに変化はありません) を渡し、出力として文字列を取得します。 より洗練されたことができることがわかります。

PHP を使用した GPT4 API の高度な呼び出し

静的プロンプトの場合は、あまり興味深いケースではありません。 複雑な Web アプリケーションのコンテキストでは、次のようないくつかの理由により、呼び出しごとにプロンプトが異なることは間違いありません。

  • ユーザー情報の利用
  • ビジネス情報の利用(データベースに含まれる情報など)
  • 外部コンテキスト情報(ニュースデータ、気象データなど)の利用

これらすべてが、より高度なプロンプト作成ロジックの作成を後押しします。

次に、指示の概念があります。 ChatGPT に精通している場合は、インターフェイスを介してパーソナライズされた指示を定義できることをご存知でしょう。 これは、追加のコンテキストと、さまざまなプロンプトに応答する方法に関する指示を提供するために、各プロンプトで使用される一連のルールと情報です。 ChatGPT では、これらの手順を一度記述すると、これらの手順がすべてのプロンプトに適用されます。 API を使用すると、実行ごとに命令を定義できます。 プロンプトと同様に、これらの指示も同じ種類の情報を使用して動的に作成できます。

最後に、プロンプトに対する応答を取得することは非常に良いことですが、API は他の情報を返します。その一部は、プロンプトがどのように実行されたか、たとえば、コストがいくらかなどを理解するのに非常に興味深いものです。

したがって、この新しいコードでは次のことを行います。

  • プロンプトを動的に作成する
  • 指示を作成する
  • 応答全体を返します

前の例から始めますが、今回はユーザーをパラメータに渡す点が異なります。 このユーザーは、特定のパブリック プロパティ (パブリック読み取り専用) を持つユーザー クラスに対応すると考えます。

class IA
{
    // Modèles disponibles
    public const MODEL_GPT4_TURBO = 'gpt-4-turbo';
    public const MODEL_GPT4_O = 'gpt-4o';
    
    /**
     * @param User $user un utilisateur de mon application
     * @return OpenAIResponsesChatCreateResponse une réponse de l'API OpenAI
     */
    public static function newsAboutALanguage(User $user): CreateResponse
    {
        // Construction du prompt
        $prompt="Présente moi 4 nouveautés du language : " . $user->favoriteLanguage;
        
        // Construction des instructions
        $instructions="Pour répondre au prompt, tu prendras en compte que je suis " . $user->seniorityLevel . '.' .
								        'Pour chaque nouveauté, tu donneras son nom, une présentation en 1 phrase et un exemple de code pour illustrer';
								        
				// Initialisation du client
	      $client = OpenAI::client(getenv('OPENAI_API_KEY')); // Clé disponible dans le fichier .env
	      
	      // Appel à l'API
	      $response = $client->chat()->create([
            'model' => self::MODEL_GPT4_O,
            'messages' => [
                [
                    'role' => 'system',
                    'content' => $instructions
                ],
                [
                    'role' => 'user',
                    'content' => $prompt
                ],
            ],
        ]);
        
        // Renvoi de la réponse
        return $response;			        
    }

ちょっとした説明:

  • 今回のメソッドにはパラメータがあり、これは User のインスタンスです。
  • $user を使用してプロンプトと手順を動的に作成します
  • API を呼び出すときに、2 つのメッセージを同時に送信するようになりました。
    • 指示のある「システム」に対応するもの
    • プロンプトを含む「ユーザー」(前の例と同様) に対応するもの
  • $response をそのまま返します。 したがって、応答の処理を担当するのはコードの残りの部分です。

応答を処理する理由と方法は何ですか?

$response では、プロンプトに対する応答を取得するだけでなく、次のような他の興味深い情報も取得します。

  • メッセージのトークンのコスト
  • 提供された応答のトークンのコスト

たとえば、誰がどのプロンプトを実行するか、プロンプトによって発生した費用はいくらかを追跡するために、アプリケーションでこの情報を記録する必要がある可能性があります。 IA クラス メソッドがプロンプトに対する応答のみを返す場合、この貴重な情報はすべて毎回失われます。

したがって、このバージョンのコードでは、IA クラスがこの情報を記録する必要はありません。 しかし、次のように、複雑な IA+ クラスとプロンプト データの記録専用のメソッドを使用して、別の方法を実行することもできます。

class IA
{
    // Modèles disponibles
    public const MODEL_GPT4_TURBO = 'gpt-4-turbo';
    public const MODEL_GPT4_O = 'gpt-4o';
    
    // Mon premier prompt
    public static function mySavedPrompt(): string
    {
        // Définition du prompt
	      $prompt="...";
	      
	      // Initialisation du client
	      $client = OpenAI::client(getenv('OPENAI_API_KEY')); // Clé disponible dans le fichier .env
	      
	      // Appel à l'API
	      $response = $client->chat()->create([
            'model' => self::MODEL_GPT4_O,
            'messages' => [
                [
                    'role' => 'user',
                    'content' => $prompt,
                ],
            ],
        ]);
        
        // Sauvegarde des informations du prompt
        $this->save($prompt, $instructions, $response);
        
        // Renvoi seulement de la réponse
        return $response->choices[0]->message->content;
    }
    
    private static function save(string $prompt, string $instructions, CreateResponse $response): void
    {
        // Logique de sauvegarde (propre à ton application, ton SGBD, ton framework, etc.)
    }
}

このコードを見て髪の毛が逆立ったとしても、心配しないでください。これは正常な現象です。 実際、ここでは単一責任の原則をあまり尊重していません。 プライベート メソッドを使用してバックアップを処理するのは、IA クラスの責任ではありません。 さらに、プライベート メソッドは、単一責任の原則が尊重されていないことを示す良い指標となることがよくあります (常にというわけではありません)。

したがって、次のようなものが望ましいでしょう。

class IA
{
    // Modèles disponibles ...
    
    // Mon premier prompt
    public static function mySavedPrompt(): string
    {
        // Définition du prompt ...
	      // Initialisation du client ...
	      // Appel à l'API ...
        
        // Sauvegarde des informations du prompt
        PromptInformations::save($prompt, $instructions, $response);
        // Ou : 
        $prompt = new Prompt($prompt, $instructions, $response);
        $prompt->save();
        
        // Encore une fois à adapter selon ton application, ton framework, etc.
        
        // Renvoi seulement de la réponse ...
    }
}

GPT4 でさらに進化

GPT-4-turbo または GPT-4o ?

GPT-4o がリリースされてすぐにいくつかのテストを実施した結果、GPT-4o ではプロンプトの結果が異なり、品質が低下する可能性があることに気づきました。 したがって、モデルを比較して、どのモデルがあなたの用途に最も適しているかを確認することをお勧めします。

一方、速度の観点から見ると、GPT-4o の方が応答がはるかに高速です。

PHP フレームワーク専用のパッケージ

他のパラメータはどのような影響を与えますか?

API の呼び出し中に他のパラメータを管理することができます。

  • 温度 : このパラメータは、生成される応答の創造性または変動性を制御します。 その値は 0 から 1 の間です。値が 0 に近く、最も可能性の高い単語を選択することにより、答えはより決定的で一貫性のあるものになります。 これにより、応答がより予測可能かつ保守的になります。 1 に近い高い値を指定すると、答えはより多様で創造的なものになり、言葉の選択に多様性が生まれます。 これにより、予測可能性が低く、より独創的な反応や、場合によっては幻覚が現れる可能性があります (注意してください…)。
  • トップ : このパラメータは、単語の選択を制限することによって生成される応答の多様性を制御します。 その値は 0 から 1 の間です。値 1 では、考えられるすべての単語に対してサンプリングが実行され、非常に多様な答えが得られる可能性があります。 1 未満の値 (0.9 など) を指定すると、累積確率がこのパーセンテージ (ここでは 90%) 未満である単語のみが考慮されます。 これにより、応答の一貫性が高まり、ランダム性が低くなります。
  • 頻度ペナルティ : このパラメータは、同じ文や単語を繰り返すモデルの傾向を調整するために使用されます。 その値は -2 から 2 までです。
    • -2.0 : 単語の繰り返しを強く促します。
    • 0 : 単語の頻度に対するペナルティやボーナスはありません (中立的な動作)。
    • 2.0 : 単語の繰り返しを厳しく罰します。
  • 存在ペナルティ : このパラメータは、生成されたテキストに新しいトピックや単語が導入される確率を制御します。 その値も -2 から 2 の間です。
    • -2.0 : 新しい単語やトピックの導入を強く禁止し、すでに使用されている単語の繰り返しを好みます。
    • 0 : 新しい単語の存在に対する調整は行われないため、より自然なテキストを生成できます。
    • 2.0 : 生成されたテキストでまだ言及されていない新しい単語やトピックの導入を強く推奨します。

API での使用例:

$response = $client->chat()->create([
    'model' => self::MODEL_GPT4_O,
    'messages' => [
        [
            'role' => 'system',
            'content' => $instructions
        ],
        [
            'role' => 'user',
            'content' => $prompt
        ]
    ],
    'temperature' => 0.5,
    'top_p' => 0.9,
]);

これらのパラメータを管理するために定数を定義することもできます。 数値を使用する代わりに、設定にリンクされたより明示的な名前を使用します。次に例を示します。

// Constantes définies dans la classe IAClientOpenAI
public const PARAM_TEMPERATURE_CREATIVITY_HIGH = 1;
public const PARAM_TEMPERATURE_CREATIVITY_MEDIUM = 0.5;
public const PARAM_TEMPERATURE_CREATIVITY_LOWH = 0.1;

// Puis l'appel
$response = $client->chat()->create([
    'model' => self::MODEL_GPT4_O,
    'messages' => [
        [
            'role' => 'system',
            'content' => $instructions
        ],
        [
            'role' => 'user',
            'content' => $prompt
        ]
    ],
    'temperature' => self::PARAM_TEMPERATURE_CREATIVITY_MEDIUM,
]);

これらの要素を使用すると、PHP で GPT4 API を使用して最初のプロンプトを実行するために必要なものがすべて揃います。 複数の異なるモデルを使用する予定がある場合は、この記事を読み続けてコードを効率的に整理することをお勧めします。

ボーナス: 他の API、インターフェイス、DTO を使用できるようにコードを整理する

OpenAI と GPT4 は優れていますが、他にも利用可能なモデルがあります。 いくつかまとめて:

  • ミストラルAI
  • クロード
  • ジェミニ
  • 等。

私たちが何を取得しようとしているのか、つまり、プロンプトにリンクされたロジックを複製することなく、任意のモデルでプロンプトを作成できることを示すために、意図的に最後から始めます。 私の IA クラスは、使用するモデルを定義できるコンストラクターを含め、少し変更されます。 また、このクラスはプロンプトの作成に使用されるので、名前を Prompts に変更します。

class Prompts
{
    // Promotion de propriété
    public function __construct(
        private IAClientInterface $client
    ) { }
    
    /**
     * @param User $user un utilisateur de mon application
     * @return IAResponseDTO une réponse d'une API d'IA
     */
    public static function newsAboutALanguage(User $user): IAResponseDTO
    {
        // Construction du prompt
        $prompt="Présente moi 4 nouveautés du language : " . $user->favoriteLanguage;
        
        // Construction des instructions
        $instructions="Pour répondre au prompt, tu prendras en compte que je suis " . $user->seniorityLevel . '.' .
								        'Pour chaque nouveauté, tu donneras son nom, une présentation en 1 phrase et un exemple de code pour illustrer';
								        
	      // Appel à l'API
	      $response = $this->client->response([
            'messages' => [
                [
                    'role' => 'system',
                    'content' => $instructions
                ],
                [
                    'role' => 'user',
                    'content' => $prompt
                ],
            ],
        ]);
        
        // Renvoi de la réponse
        return $response;			        
    }
}

何が変わったのでしょうか?

  • 私のコンストラクターは、IAClientInterface インターフェイスを実装するクラスを含む $client プロパティをインスタンス化します。
  • 「new client()」はもうありません。別のクラスがそれを担当します。
  • 私の newsAboutALanguage メソッドは、API から返された情報を含む DTO となる IAResponseDTO のインスタンスを返します。
  • newsAboutALanguage メソッドでは、$this→client→response を呼び出しますが、以前は OpenAI に固有の $client->chat()->create(…) を呼び出していました。

したがって、次の要素を作成する必要があります。

  • IAClientInterface インターフェイス
  • DTO IAResponseDTO
  • OpenAI クライアント
  • MistralAI クライアント

IAClientInterface インターフェイス:

interface IAClientInterface
{
    // Chaque client doit avoir cette méthode
    public function response(array $params): IAResponseDTO;
}

DTO IAResponseDTO :

class IAResponseDTO
{
    // Toutes les propriétés sont en public readonly
    // On pourrait les mettre toutes en nullable au cas où une des API ne renverrait pas une donnée
    // Exemple avec la temperature
    public function __construct(
        public readonly string $prompt,
        public readonly string $instructions,
        public readonly string $response,
        public readonly int $nbInputTokens,
        public readonly int $nbOutputTokens,
        public readonly ?float $temperature = null,
        // Etc.
    ) {}
}

OpenAI クライアント:

class IAClientOpenAI implements IAClientInterface
{
    // Les constantes des models sont désormais ici
    public const MODEL_GPT4_TURBO = 'gpt-4-turbo';
    public const MODEL_GPT4_O = 'gpt-4o';

    private Client $client;

    public function __construct(
        private string $model = self::MODEL_GPT4_O
    ) {
        $this->client = OpenAI::client(getenv('OPENAI_API_KEY')); // Clé disponible dans le fichier .env
    }
    
    public function response(array $params): IAResponseDTO
    {
        $response = $this->client->chat()->create([
	          'model' => $this->model,
	          ...$params, // Opérateur de décomposition
        ]);

        // Récupération de prompt et des instructions
        $prompt="";
        $instructions="";

        foreach ($params['messages'] as $message) {

            if ($message['role'] == 'system') {
                $instructions = $message['content'];
                continue;
            }

            if ($message['role'] == 'user') {
                $prompt = $message['content'];
                continue;
            }
        }
    
        // Construction du DTO
        return new IAResponseDTO(
            prompt: $prompt,
            instructions: $instructions,
            response: $response->choices[0]->message->content,

            nbInputTokens: $response->usage->promptTokens,
            nbOutputTokens: $response->usage->completionTokens,
        );
    }
}

Mistral AI クライアント (完全に発明されたコード、既存のパッケージとのリンクなし):

class IAClientMistralAI implements IAClientInterface
{
    // Modèles
    public const MODEL_7B = 'open-mistral-7b';
    public const MODEL_8X7B = 'open-mixtral-8x7b';

    private Client $client;

    public function __construct(
        private string $model = self::MODEL_7B
    ) {
        $this->client = MistralAI::client(getenv('MISTRALAI_API_KEY')); // Clé disponible dans le fichier .env
    }
    
    public function response(array $params): IAResponseDTO
    {
        $response = $client->chat()->prompt([
	          'model' => $this->model,
	          ...$params // Opérateur de décomposition
        ]);
        
        // Récupération de $prompt et $instructions comme précédemment
    
        // Construction du DTO
        return new IAResponseDTO(
            prompt: $prompt,
            instructions: $instructions,
            response: $response->result,

            // Etc. mapping à faire selon le retour de l'API
            nbInputTokens: $response->tokens->input,
            nbOutputTokens: $response->tokens->output,
        );
    }
}

注意: 上記のコードは完全にでっち上げです。

そして最後に私のメインプログラムでは次のようになります。

// Appel à OpenAI
$ia = new IA(new IAClientOpenAI);
$ia->newsAboutALanguage($user);

// Appel à MistralAI
$ia = new IA(new IAClientMistralAI);
$ia->newsAboutALanguage($user);

このコード構成により、プロンプト管理ロジックを複製する必要がなくなります。毎回、正しい方法で API を呼び出すことと、受け取った応答を処理して、呼び出された API に関係なく、一貫した応答が得られます。

いくつかの技術的概念を確認する必要がある場合は、次のようにします。

そして躊躇しないでください 私たちに従ってください 次回の記事でお知らせします😉

#PHP #で #GPT4 #API #を使用するにはどうすればよいですか

執筆者について: nipponese

Nipponese News編集部は、国内外のニュースを日本語で分かりやすくお届けします。