0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Laravel 13 AI SDKを試して一問一答形式のテストアプリを作成してみた(Claude APIを使用)

0
Posted at

はじめに

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 に設定

.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
スクリーンショット 2026-05-31 17.34.34.png
Top画面

src/resources/views/question.blade.php
スクリーンショット 2026-05-31 17.34.55.png
質問画面

src/resources/views/ansers.blade.php
スクリーンショット 2026-05-31 17.34.12.png
回答一覧画面


各画面のビジネスロジックは以下の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の編集

src/config/ai.php
# 今回はClaude APIを利用するので以下のように変更
'default' => 'anthropic',

② Agentの作成

php artisan make:agent AnserAgent

③ src/app/Ai/Agents/AnserAgent.phpの編集

instructions()には、claudeやChatGPTに普段書いているようなプロンプトを記載します。
今回は質問に対して回答を生成して返す記述にしました。

src/app/Ai/Agents/AnserAgent.php
<?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で呼び出します。

src/app/Services/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);
        }
    }
}

これで完成です。
テスト実行していきます。

実行してみる

質問画面に、事項を記入して「回答を生成」ボタンを押します。
スクリーンショット 2026-05-31 17.02.30.png

しばらくすると、回答一覧画面に回答が表示されました。
回答内容が少し簡素かなと思いましたが、プロンプトやモデルによって調整可能だと考えます。
スクリーンショット 2026-05-31 18.05.15.png
スクリーンショット 2026-05-31 18.05.37.png


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

まとめ

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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?