はじめに
Laravel 公式の AI SDK(laravel/ai)を使って、質問を入力すると AI が回答を生成して一覧表示する Q&A アプリを作りました。
Laravel13でAI SDKが正式安定版となったのでテスト感覚で作成してみました。
APIはClaudeのAPIを使用しました。
(今回の使用モデルはHaiku 4.5)
この記事では実装の流れ、アプリケーションの動作について順番に解説します。
主な技術スタック
- Laravel 13.x
- laravel/ai(Laravel 公式 AI SDK)
- Anthropic Claude(AI プロバイダー):Claude Haiku 4.5(課金額:5ドル)
Laravel AI SDKのインストール
まずはcomposer経由でインストールします。
(※今回Docker上で作成していますので、docker compose exec app bashでコンテナ内に入って作業)
composer require laravel/ai
インストールが完了したら、設定ファイルを作成します。
php artisan vendor:publish --provider="Laravel\Ai\AiServiceProvider"
このとき/database/migrations/yyyy_dd_mm_xxxxx_create_agent_conversations_table.phpのmigrationファイルが作成されるので、以下を実行します。
php artisan migrate
実行すると、
- agent_conversations
- agent_conversation_messages
こちらは、例えばChatGPTのように、チャット形式のように以前の質問を引用して回答を生成するようなアプリを作成する場合に使用します。
今回は、一問一答形式のテストアプリを作成するので使いません。
Claude API Keyの作成
① アカウント作成
https://console.anthropic.com に飛んで、サインインします。
② クレジットカード登録・チャージ
クレジットカードを登録して購入フローを完了させます。いくつか選択肢がありますが、今回は5ドルで課金しました。
③ API キーを作成
Claude Consoleというダッシュボードに遷移します。
メニューから「Get API keys(APIキーを取得)」を選択 → APIキーの名前を入力し、「Create Key(APIキーを作成)」ボタンを押して作成します。
④ キーをコピーして保存
キーが生成されると sk-ant-api03-から始まる長い文字列が表示されます。
この画面は一度しか表示されないので、必ずコピーして保管しておきます。
⑤ Laravel の .env に設定
ANTHROPIC_API_KEY=sk-ant-api03-xxxxxxxxxx
これで仕込みは完了です。
くれぐれも、.envをGitHubなどにpushしないよう気をつけてください。
View、Controller、Modelの作成について
今回はLaravel 13 AI SDKの解説なので、画面や処理のロジックは解説を省きます。
以下のGitHubのリポジトリを参考にしてください。
Viewファイルについては以下です。
src/resources/views/ai_index.blade.php

Top画面
src/resources/views/question.blade.php

質問画面
src/resources/views/ansers.blade.php

回答一覧画面
各画面のビジネスロジックは以下のControllerファイルに記載
- src/app/Http/Controllers/QuestionController.php
- src/app/Http/Controllers/AnsersController.php
レイヤードアーキテクチャ(3層構造)で構成
Controller ← リクエストの受け取り・レスポンスの返却のみ
↓ 呼び出す
Service ← ビジネスロジック(今回ならClaude API呼び出し、回答一覧の取得など)
↓ 呼び出す
Repository ← DBとのやり取り
↓ 呼び出す
Model / DB
Model / DBは以下のansersテーブルのみ作成しています。
| カラム名 | データ型 | コメント |
|---|---|---|
| id | bigint | |
| question | text | 質問内容 |
| answer | longtext | 回答 |
| status | tinyint | AIによる生成の、0: 待ち, 1: 完了, 2: 失敗 |
| created_at | timestamp | 作成日時 |
| updated_at | timestamp | 更新日時 |
Agent
Agentは、AIの役割をまとめるクラスになります。
① ai.phpの編集
# 今回はClaude APIを利用するので以下のように変更
'default' => 'anthropic',
② Agentの作成
php artisan make:agent AnserAgent
③ src/app/Ai/Agents/AnserAgent.phpの編集
instructions()には、claudeやChatGPTに普段書いているようなプロンプトを記載します。
今回は質問に対して回答を生成して返す記述にしました。
<?php
namespace App\Ai\Agents;
use Laravel\Ai\Contracts\Agent;
use Laravel\Ai\Promptable;
use Stringable;
class AnserAgent implements Agent
{
use Promptable;
public function instructions(): Stringable|string {
return <<<'PROMPT'
あなたは知識豊富なAIアシスタントです。
ユーザーから送られてくる質問に対して、正確でわかりやすい回答を提供してください。
厳守事項:
- 出力は必ず日本語にすること。
- 回答は簡潔かつ丁寧にまとめること。
- 不明な点や判断できない内容については、推測せずその旨を正直に伝えること。
- 質問の意図を正しく汲み取り、的外れな回答をしないこと。
PROMPT;
}
}
こちらで編集したクラスは、Controller側(Service)で呼び出します。
今回はQuestionService.phpで呼び出します。
<?php
namespace App\Services;
use App\Ai\Agents\AnserAgent;
use App\Repositories\QuestionRepository;
use Throwable;
class QuestionService
{
public function __construct(
private QuestionRepository $repository,
) {}
public function store(string $question): void {
$anser = $this->repository->create($question);
try {
# ansersテーブルに保存された質問事項を渡す
$response = AnserAgent::make()->prompt($anser->question);
$this->repository->save($anser, $response->text);
} catch (Throwable $e) {
logger()->error('AnserAgent failed', [
'message' => $e->getMessage(),
'trace' => $e->getTraceAsString(),
]);
$this->repository->failedSave($anser);
}
}
}
これで完成です。
テスト実行していきます。
実行してみる
しばらくすると、回答一覧画面に回答が表示されました。
回答内容が少し簡素かなと思いましたが、プロンプトやモデルによって調整可能だと考えます。


従量課金なので、Claude Consoleのダッシュボードに使用量が表示されます。
0.01ドル消費とのことなので、今回のようなテストなら約500回くらい試せそうです。

まとめ
Laravel AI SDKの正式安定版がリリースされたことにより、アプリケーションにAIが組み込みやす機能実装が容易になったと思いました。
今後もいろいろ試していこうと思います。
