本日0件のお問い合わせがありました。

✉️FIELDにお問い合わせ

システム開発

AI時代のweb制作及び開発で必須-AIエージェントの作り方-

最近、これから「ただのシステムベンダー」は本当に淘汰されるのかという質問をいろいろ受けます。

結論から言うと、“仕様どおりの画面とAPIを作るだけのシステムベンダー” は、かなりの確率で淘汰されるのではないかなと感じています。

理由はシンプルで、

  • 画面設計
  • CRUD API
  • バリデーション
  • 一覧・詳細・編集フォーム

このあたりは GPT+ノーコード/ローコードでかなりの部分まで自動生成できるようになるからですね。

これから本当に価値を持つもの

一方で、これから本当に価値を持つのは、

「職種が違う作業ステップ」や「人と人のコミュニケーション」をまたいだ、一連の仕事の流れそのものを “AIエージェント” として設計し、目的達成まで自律的に動かす企業になるのではないかと感じています。

  • LPを作る前段のヒアリング
  • 営業担当・マーケ・デザイナーのコミュニケーション
  • 補助金申請での要件整理 → 計画書作成 → 数値シミュレーション
  • 求人票作成 → 採用サイト反映 → 広告出稿 → 結果のPDCA

こういった「人が会話しながらやっている仕事の流れ」を API + 状態管理 + ループ に落とし込んだものが、AIエージェントです。

そこで、AIエージェントの作り方を紹介します。

この記事では、よく皆さんが使えるlaravelを例に

  • AIエージェントの本質を言語化し
  • 実際のコードレベル(Laravel)での開発フローを示し
  • 「このロジックであらゆるエージェントが作れる」という視点を共有します。

「これからAIエージェントを作ろうとしている企業」が、“ただのAI連携SaaS” ではなく “エージェント企業” に変わるための設計図として使える内容にしました。

AIエージェントの本質:API × 状態管理 × ループ

まず、AIエージェントの本質を1行で書くとこうなります。

AIエージェント = LLM を司令塔にして、外部APIを呼びながら、状態を更新しつつ、目的達成までループする仕組み

要素を分解すると 4 つです。

  1. LLM(思考エンジン)
    GPT など。「次に何をするべきか?」を判断する頭脳部分。
  2. API(手足)
    DB、外部サービス、Google Ads、メール送信、PDF生成、スクレイピングなど。
  3. 状態管理(ステートマシン)
    「今どこまで終わっていて」「何を持っていて」「次は何をするか」を JSON や DB で持つ。
  4. ループ(自律性)
    状態を見ながら「観察 → 判断 → 行動 → 更新」を繰り返す。

このうち、単なるチャットボットとの決定的な違いは 3 と 4 です。“会話して終わり” ではなく、“仕事を完遂する” ところまで含めて設計します。

状態管理をどう持つか:JSONステートの例

AIエージェントは、頭の中身を JSONの状態として持つと扱いやすくなります。

例えば「LPを自動生成するエージェント」なら、状態はこんなイメージです。

{
    "meta": {
        "agent_name": "lp_generator",
        "version": "1.0.0",
        "task_started_at": "2025-11-23T12:34:00+09:00"
    },
    "credit": {
        "used": 5,
        "limit": 50,
        "remaining": 45
    },
    "current": {
        "status": "generate_aidma_copy",
        "step": 3,
        "step_name": "AIDMAコピー生成中",
        "progress_percent": 40
    },
    "workflow": {
        "steps": [
            { "id": 1, "name": "input_validation", "done": true },
            { "id": 2, "name": "business_analysis", "done": true },
            { "id": 3, "name": "generate_aidma_copy", "done": false },
            { "id": 4, "name": "generate_color_theme", "done": false },
            { "id": 5, "name": "generate_html_blocks", "done": false },
            { "id": 6, "name": "assemble_lp", "done": false }
        ]
    },
    "memory": {
        "raw_input_text": "ユーザーが入力した事業説明...",
        "business_summary": null,
        "aidma_copy": null,
        "color_theme": null,
        "html_blocks": null,
        "lp_variants": null
    },
    "decision": {
        "next_action": "generate_aidma_copy",
        "reason": "事業分析が完了したため、次はAIDMAコピーを生成する"
    }
}

これがあれば、いつでも質問できます。

  • 今どのフェーズか? → current.status
  • どこまで処理が終わっているか? → workflow.steps
  • 次に何をすべきか? → decision.next_action
  • クレジット残高はいくらか? → credit.remaining

この “状態管理の設計” ができる会社が、これからのAIエージェント時代の OS を握る側になります。

Laravelで実際にエージェントを動かす:全体像

ここからは、例として 「LP自動生成エージェント」を Laravel で実装するフローを示します。

※全コードを書くと長くなるので、 「構造がわかる最小限の実装」 に絞ります。

このロジックで、あらゆるAIエージェントが作れる

ここまで紹介した構造は「LPエージェント」の例ですが、ワークフローとプロンプトを差し替えるだけで、別のエージェントに化けます。

  • 求人サイト作成エージェント
    求人票 → 構造化 → JobPosting → HTML
  • コーポレートサイトエージェント
    会社情報 → MVコピー → 事業紹介 → 採用
  • ECサイトエージェント
    商品情報 → 商品説明 → カテゴリ設計 → LP
  • 補助金申請エージェント
    ヒアリング → 計画書 → 数値計画 → PDF
  • 広告PDCAエージェント
    広告結果 → 分析 → 改善案 → 次回案
  • HTMLブロック提案エージェント
    HTML解析 → セクション抽出 → ブロック化

変わるのは「何ステップで」「どんなJSONを持って」「どんなプロンプトを投げるか」だけです。

裏側の構造(Agentモデル、state/memory JSON、Workflowクラス)は、共通の “エージェントOS” として再利用できます。

こんな感じでAIエージェントは作れます。
実際に弊社ではこの中の2つをすでに実装済みで使用しています

みなさんも欲しいエージェントを自作してみると体験的に理解できるかと思います。

最後に:実際に Laravel で AIエージェントを構築するためのソースツリーとコード例

ここまで述べてきたように、AIエージェントの本質は 「API × 状態管理 × ループ」 にあります。では実際に、これを Laravel でどう構築するのか?

以下では、AIエージェントを Laravel 上で実装する際の 最低限のソースツリーコード例 を紹介します。

実際の Laravel ソースツリー(最小構成)
/app
    /Agents
        /LP
            LPAgent.php
            LPWorkflow.php
            LPStateMachine.php

    /Services
        /AI
            OpenAIService.php
        /LP
            LPAssembler.php

    /Models
        Agent.php

    /Http/Controllers
        LPAgentController.php

/database
    /migrations
        create_agents_table.php

/routes
    api.php
            

この構成は、以下の思想でできています:

  • LPAgent → どのステップを実行するか決める司令塔
  • LPWorkflow → 実際の処理(GPTコール)が書かれる場所
  • LPStateMachine → 「次のアクション」を決める脳みそ
  • Agentモデル → state/memory を JSON で保持
  • OpenAIService → GPT への API 呼び出し統合
  • LPAssembler → HTML合成など結果物の組み立て
  • Controller → APIエンドポイント
  • Migration → エージェント状態のDB保存

どんなエージェントでも、このテンプレートで複製できます。

Agentモデル & Migration

/database/migrations/create_agents_table.php
Schema::create('agents', function (Blueprint $table) {
    $table->id();
    $table->string('type'); // 'lp', 'job', 'subsidy' など
    $table->json('state')->nullable(); // next_action / progress など
    $table->json('memory')->nullable(); // GPTの中間生成物
    $table->timestamps();
});
        
/app/Models/Agent.php
class Agent extends Model
{
    protected $fillable = ['type', 'state', 'memory'];

    protected $casts = [
        'state' => 'array',
        'memory' => 'array',
    ];
}
        

これは AIエージェントの頭脳の保存場所 です。

LPエージェントの実装(司令塔)

/app/Agents/LP/LPAgent.php
namespace App\Agents\LP;

use App\Models\Agent;

class LPAgent
{
    public function runStep(Agent $agent)
    {
        $state = $agent->state;

        // 今やるべきアクション
        $nextAction = $state['decision']['next_action'] ?? 'start_analysis';

        $workflow = app(LPWorkflow::class);

        if (!method_exists($workflow, $nextAction)) {
            throw new \RuntimeException("Unknown action: {$nextAction}");
        }

        return $workflow->{$nextAction}($agent);
    }
}
        

これが エージェントのメインループ です。今のステップを読み取り、そのステップのメソッドを実行し、結果を state/memory に保存して次へ進みます。

状態管理(ステートマシン)

/app/Agents/LP/LPStateMachine.php
namespace App\Agents\LP;

use App\Models\Agent;

class LPStateMachine
{
    public function updateState(Agent $agent, string $next)
    {
        $state = $agent->state;

        // 次のステップに移動
        $state['decision']['next_action'] = $next;
        $state['current']['status'] = $next;

        // クレジット消費管理(GPT呼び出し回数)
        $state['credit']['used'] += 1;
        $state['credit']['remaining'] =
            $state['credit']['limit'] - $state['credit']['used'];

        $agent->state = $state;
        $agent->save();

        return $agent;
    }
}
        

AI開発なのに「ステートマシン」が重要なのは、AIが暴走せず、確実に目的を達成するために必要な構造だからです。

LPエージェントの処理(ワークフロー)

/app/Agents/LP/LPWorkflow.php
namespace App\Agents\LP;

use App\Models\Agent;
use App\Services\AI\OpenAIService;
use App\Services\LP\LPAssembler;

class LPWorkflow
{
    public function __construct(
        protected OpenAIService $ai,
        protected LPAssembler $assemble
    ) {}

    /** STEP1: ヒアリング分析 */
    public function start_analysis(Agent $agent)
    {
        $input = $agent->memory['raw_input_text'];

        $json = $this->ai->gptJson(<<<PROMPT 以下の事業説明から - 事業目的 - USP - ターゲットの悩み を抽出しJSONで返してください。 {$input} PROMPT);
        $memory=$agent->memory;
        $memory['business_summary'] = $json;
        $agent->memory = $memory;

        return app(LPStateMachine::class)
            ->updateState($agent, 'generate_aidma_copy');
    }

    /** STEP2: AIDMAコピー生成 */
    public function generate_aidma_copy(Agent $agent)
    {
        $summary = json_encode($agent->memory['business_summary']);

        $json = $this->ai->gptJson(<<<PROMPT 以下の要約から AIDMAのA/I/D/M/A2を3パターンずつ生成しJSONで返してください。 {$summary} PROMPT);
        $mem=$agent->memory;
        $mem['aidma_copy'] = $json;
        $agent->memory = $mem;

        return app(LPStateMachine::class)
            ->updateState($agent, 'generate_color_theme');
    }

    /** STEP3: カラーテーマ */
    public function generate_color_theme(Agent $agent)
    {
        $json = $this->ai->gptJson(<<<PROMPT 以下の事業概要に合うLPのカラーテーマを main/sub/accent/emphasis/cta の5色で
            3パターン生成しJSONで返してください。 {$agent->memory['business_summary']}
            PROMPT);

        $mem = $agent->memory;
        $mem['color_theme'] = $json;
        $agent->memory = $mem;

        return app(LPStateMachine::class)
            ->updateState($agent, 'generate_html_blocks');
    }

    /** STEP4: HTMLブロック生成 */
    public function generate_html_blocks(Agent $agent)
    {
        $json = $this->ai->gptJson(<<<PROMPT 以下のAIDMAコピーとカラーテーマから、 Bootstrap5で使えるHTMLセクションを A/I/D/M/A2
            各3パターン生成してください。 AIDMA: {$agent->memory['aidma_copy']}

            Theme:
            {$agent->memory['color_theme']}
            PROMPT);

        $mem = $agent->memory;
        $mem['html_blocks'] = $json;
        $agent->memory = $mem;

        return app(LPStateMachine::class)
            ->updateState($agent, 'assemble_lp');
    }

    /** STEP5: LP完成品の組み立て */
    public function assemble_lp(Agent $agent)
    {
        $lp = $this->assemble->build($agent->memory);

        $agent->memory['lp_variants'] = $lp;
        $agent->save();

        return app(LPStateMachine::class)
            ->updateState($agent, 'completed');
    }
}
        

GPT を呼び出すサービス

/app/Services/AI/OpenAIService.php
namespace App\Services\AI;

use Illuminate\Support\Facades\Http;

class OpenAIService
{
    public function gptJson(string $prompt): array
    {
        $res = Http::withToken(env('OPENAI_API_KEY'))
            ->post('https://api.openai.com/v1/chat/completions', [
                'model' => 'gpt-4o-mini',
                'response_format' => ['type' => 'json_object'],
                'messages' => [
                    ['role' => 'user', 'content' => $prompt]
                ]
            ]);

        $content = $res->json()['choices'][0]['message']['content'] ?? '{}';

        return json_decode($content, true);
    }
}
        

LPを組み立てるサービス

/app/Services/LP/LPAssembler.php
namespace App\Services\LP;

class LPAssembler
{
    public function build(array $memory): array
    {
        $blocks = $memory['html_blocks'];

        return [
            'variant_1' => $blocks['A'][0] . $blocks['I'][0] . $blocks['D'][0] . $blocks['M'][0] . $blocks['A2'][0],
            'variant_2' => $blocks['A'][1] . $blocks['I'][1] . $blocks['D'][1] . $blocks['M'][1] . $blocks['A2'][1],
            'variant_3' => $blocks['A'][2] . $blocks['I'][2] . $blocks['D'][2] . $blocks['M'][2] . $blocks['A2'][2],
        ];
    }
}
        

APIエンドポイント

/app/Http/Controllers/LPAgentController.php
class LPAgentController extends Controller
{
    public function start(Request $req)
    {
        $agent = Agent::create([
            'type' => 'lp',
            'state' => [
                'decision' => ['next_action' => 'start_analysis'],
                'credit' => ['used' => 0, 'limit' => 50, 'remaining' => 50],
            ],
            'memory' => [
                'raw_input_text' => $req->input('text'),
            ],
        ]);

        return response()->json(['agent_id' => $agent->id]);
    }

    public function run($id)
    {
        $agent = Agent::findOrFail($id);

        app(\App\Agents\LP\LPAgent::class)->runStep($agent);

        return $agent->fresh();
    }

    public function status($id)
    {
        return Agent::findOrFail($id);
    }
}
        
/routes/api.php
Route::post('/lp/start', [LPAgentController::class, 'start']);
Route::post('/lp/run/{id}', [LPAgentController::class, 'run']);
Route::get('/lp/status/{id}', [LPAgentController::class, 'status']);
        

まとめ:この構造は「どんなエージェントでも」量産できる。LPエージェント以外にもそのまま流用できます。JobAgentや補助金エージェントなど、ワークフロー部分だけ差し替えれば済みます。

これをAIエージェントの雛形にすることで最小単位のエージェントを作ることができます。ご参考までに

Yamamoto Yuya

プロフェッショナルとしての高いスキルと知識を持ち、誠実さと責任感を大切にする。常に向上心を持ち、新たな挑戦にも積極的に取り組む努力家。