✅
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;
}
}
}
ドキュメント名には英数字やハイフン、括弧など限られた文字しか使用できないため、正規表現で余分な文字を除去しています。
実行
- 今回は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での実装を検討されている方の参考になれば幸いです。
Discussion