【Laravel】Prism PHPでテキスト生成を実装する基本

laravelアイキャッチ Laravel

こんにちは、かつコーチです。

前回はLaravel AI SDKでテキスト生成を実装しました。
今回は、その内部でも使われているPrism PHPを直接使って、同じ処理を書いてみます。

「結局どっちが自分に合っているのか」を実感するために、コードを並べて比較しながら進めます。

Prism PHPとは?

専門用語の整理

Prism PHPとは、プロバイダーごとに違う「電源プラグの形」を統一してくれる変換アダプターのような、低レベルのライブラリです。
OpenAI・Anthropic・Gemini・Groq・xAI・Ollamaなど、複数のプロバイダーのAPI仕様の違いを吸収し、共通のインターフェースで扱えるようにします。

低レベルライブラリとは、細かい制御ができる反面、便利機能は自分で組み立てる必要があるライブラリのことです。
Laravel AI SDKがAgentやメモリまで用意してくれるのに対し、Prism PHPはテキスト生成やストリーミングといった基本機能に絞られています。

なぜPrism PHP単体を使う場面があるのか

Agentやツール呼び出しが不要で、単純にテキストを生成したいだけなら、Laravel AI SDKの持つ標準機能はオーバースペックになることがあります。
その場合、Prism PHP単体の方が依存パッケージが少なく、軽量に運用できます。

実装手順

手順1:インストール

composerでPrism PHPをインストールします。

composer require prism-php/prism
php artisan vendor:publish --tag=prism-config

config/prism.phpにプロバイダーごとのAPIキー参照設定が生成されます。

// config/prism.php
return [
    'providers' => [
        'openai' => [
            'api_key' => env('OPENAI_API_KEY'),
        ],
        'anthropic' => [
            'api_key' => env('ANTHROPIC_API_KEY'),
        ],
    ],
];

手順2:基本のテキスト生成

Prism PHPはPrismクラスをファサード的に使い、text()から生成処理を組み立てます。

// routes/web.php
use Prism\Prism\Prism;
use Prism\Prism\Enums\Provider;

Route::get('/prism-test', function () {
    $response = Prism::text()
        ->using(Provider::OpenAI, 'gpt-4o-mini')
        ->withPrompt('Laravelの初心者に向けて、Eloquentの魅力を3行で説明してください')
        ->generate();

    return $response->text;
});

using()の第一引数でプロバイダー、第二引数でモデル名を指定する点が、Laravel AI SDKとの見た目上の違いです。

手順3:プロバイダーを切り替える

Anthropicに切り替える場合も、using()の引数を変えるだけです。

$response = Prism::text()
    ->using(Provider::Anthropic, 'claude-3-5-haiku-latest')
    ->withPrompt('同じ質問をAnthropicのモデルにも聞いてみます')
    ->generate();

手順4:システムプロンプトを併用する

Prism PHPでは、ユーザーの入力とは別に、AIの振る舞いを指定するシステムプロンプト(AIに役割や制約を事前に与える指示文)を明示的に渡せます。

$response = Prism::text()
    ->using(Provider::OpenAI, 'gpt-4o-mini')
    ->withSystemPrompt('あなたはLaravel専門のテクニカルライターです。専門用語には簡単な補足をつけてください。')
    ->withPrompt('Eloquentのリレーションについて説明してください')
    ->generate();

echo $response->text;

Laravel AI SDKとの書き味の違い

同じ処理を並べると、両者の設計思想の違いがよく見えます。

// Laravel AI SDK
$response = Ai::make()
    ->prompt('質問内容')
    ->generate();

// Prism PHP
$response = Prism::text()
    ->using(Provider::OpenAI, 'gpt-4o-mini')
    ->withPrompt('質問内容')
    ->generate();

Laravel AI SDKはconfig/ai.phpにプロバイダー設定を集約し、コード側はシンプルに保つ設計です。
一方Prism PHPは、呼び出し側で明示的にプロバイダーとモデルを指定するため、コードを見るだけで「今どのモデルを叩いているか」が分かりやすいという利点があります。

よくあるつまずきポイント・エラー対処

❌Before:withPrompt()を忘れてgenerate()した

実際に手を動かしていたとき、withPrompt()を書き忘れたままうっかりgenerate()まで進めてしまいました。

Prism\Prism\Exceptions\PrismException: No prompt or messages have been provided.

✅After:メソッドチェーンの順序を見直して解決

原因は単純なコードの書き忘れだったのですが、Laravel AI SDKのprompt()との名前の違い(Prism PHPはwithPrompt())に慣れておらず、IDEの補完を信用しすぎて中身を確認していなかったことが根本原因でした。

// ❌Before(withPromptが抜けている)
$response = Prism::text()
    ->using(Provider::OpenAI, 'gpt-4o-mini')
    ->generate();

// ✅After
$response = Prism::text()
    ->using(Provider::OpenAI, 'gpt-4o-mini')
    ->withPrompt('質問内容')
    ->generate();

Laravel AI SDKとPrism PHPを行き来していると、メソッド名の細かい違い(prompt()withPrompt()か)で混乱しがちです。
両方を併用するプロジェクトでは、どちらの記法かをコメントで明示しておくと後々のミスを防げます。

応用・一歩先の使い方

Prism PHPは、レスポンスを一括で受け取るだけでなく、生成中のテキストを少しずつ受け取るストリーミングにも対応しています。
チャット画面でAIの返答が徐々に表示されていく、あの体験を作れます。

$stream = Prism::text()
    ->using(Provider::OpenAI, 'gpt-4o-mini')
    ->withPrompt('長めの解説を書いてください')
    ->asStream();

foreach ($stream as $chunk) {
    echo $chunk->text;
}

ストリーミングの実装は設定すべき点が多いため、次回の記事でじっくり扱います。

まとめ

この記事のポイント

  • Prism PHPはPrism::text()->using()->withPrompt()->generate()という書き方が基本
  • プロバイダーとモデルをコード上で明示するため、可読性が高い
  • Laravel AI SDKのprompt()とPrism PHPのwithPrompt()はメソッド名が異なるので混同しないよう注意する
  • Prism PHPはストリーミングにも標準対応している

次に読むべき記事

  • ストリーミングレスポンスを実装する(次回公開予定)

コメント

タイトルとURLをコピーしました