PHPでAmazon Bedrock Converse APIを使ってPDF解析してみた

に公開

はじめに

Fusicのレオナです。本ブログは、PHP, Laravelを使ってAmazon Bedrock Converse APIでPDFを解析してみました。Amazon Bedrockが提供するConverse APIは、テキストだけでなくPDFや画像ファイルなども、モデルとの間でメッセージとして送受信できるAPIです。

環境構築

  • PHP 8.3 / Laravel 12
  • AWS SDK for PHP
  • Laravelプロジェクトのcomposer.jsonは以下のように設定
composer.json
{
    "require": {
        "php": "^8.3",
        "aws/aws-sdk-php": "^3.351",
        "laravel/framework": "^12.0"
    }
}
  • Bedrock用の認証情報は.envファイルで定義
.env
AWS_BEDROCK_REGION=us-west-2
AWS_BEDROCK_ACCESS_KEY_ID=your_access_key
AWS_BEDROCK_SECRET_ACCESS_KEY=your_secret_key
AWS_BEDROCK_MODEL_ID=us.anthropic.claude-3-7-sonnet-20250219-v1:0

実装

app/Console/Commands/BedrockPdfAnalysisCommand.php
<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;
use Aws\BedrockRuntime\BedrockRuntimeClient;
use Aws\Exception\AwsException;

class BedrockPdfAnalysisCommand extends Command
{
    protected $signature = 'bedrock:pdf-analysis';
    protected $description = 'Analyze PDF content using Amazon Bedrock Converse API';

    public function handle()
    {
        // クライアントの初期化
        $client = new BedrockRuntimeClient([
            'region'  => env('AWS_BEDROCK_REGION'),
            'version' => 'latest',
            'credentials' => [
                'key'    => env('AWS_BEDROCK_ACCESS_KEY_ID'),
                'secret' => env('AWS_BEDROCK_SECRET_ACCESS_KEY'),
            ],
        ]);

        // PDFを読み込む
        $filePath = storage_path('app/report.pdf'); // 実際のパスとファイル名にする
        if (!file_exists($filePath)) {
            $this->error("PDFが見つかりません: {$filePath}");
            return 1;
        }
        $documentBytes = file_get_contents($filePath);

        // ファイル名をサニタイズ
        $name = basename($filePath);
        $cleanName = preg_replace('/[^A-Za-z0-9 \-\(\)\[\]]+/', '', $name);
        $cleanName = preg_replace('/ {2,}/', ' ', $cleanName);
        $cleanName = trim($cleanName);

        // メッセージの組み立て
        $conversation = [
            [
                'role'    => 'user',
                'content' => [
                    ['text' => 'このPDFの主要な内容を解析し、要点をまとめてください。'],
                    [
                        'document' => [
                            'format' => 'pdf',
                            'name'   => $cleanName,
                            'source' => ['bytes' => $documentBytes],
                        ],
                    ],
                ],
            ],
        ];

        try {
            // Converse APIを呼び出す
            $response = $client->converse([
                'modelId'  => env('AWS_BEDROCK_MODEL_ID'),
                'messages' => $conversation,
                'inferenceConfig' => [
                    'maxTokens'   => 4000,
                    'temperature' => 0.0,
                ],
            ]);

            // 解析結果を表示
            $analysis = $response['output']['message']['content'][0]['text'];
            $this->info("=== Analysis Result ===");
            $this->line($analysis);

            return 0;
        } catch (AwsException $e) {
            $this->error('Converse APIエラー: ' . $e->getAwsErrorMessage());
            return 1;
        }
    }
}

ドキュメント名には英数字やハイフン、括弧など限られた文字しか使用できないため、正規表現で余分な文字を除去しています。

https://docs.aws.amazon.com/bedrock/latest/userguide/conversation-inference-call.html

実行

  • 今回はAWS認定試験の結果レポートを解析させます。
php artisan bedrock:pdf-analysis

出力結果

# AWS認定試験結果の要約
## 基本情報
- **試験名**: AWS Certified Machine Learning Engineer - Associate
- **スコア**: 855点(合格ラインは720点)

## 試験セクション別の成績
1. **第1分野**: 機械学習(ML)のためのデータ準備 (9%) - コンピテンシーを満たしている
2. **第2分野**: MLモデルの開発 (26%) - コンピテンシーを満たしている
3. **第3分野**: MLワークフローのデプロイとオーケストレーション (22%) - コンピテンシーを満たしている
4. **第4分野**: MLソリューションのモニタリング、保守、セキュリティ (24%) - コンピテンシーを満たしている

最後に

Amazon Bedrock Converse APIを使った実装例はPythonでは多く見られますが、PHPでの事例はまだ少ないのが現状です。本ブログがPHPでの実装を検討されている方の参考になれば幸いです。

Fusic 技術ブログ

Discussion