【PHP × Gemini API】回答絶対JSON化

前回の記事では、Geminiに「JSONで返して!」とお願いし、返ってきた回答からマークダウン( ```json )を力技で削り取る方法をご紹介しました。

しかし、私は未熟者です。
Gemini APIには「最初からJSON以外で返さない」という、エンジニアにとって非常に便利な設定項目が存在してました。今回はその「JSONモード」をPHPで実装する方法を解説します!

1. 従来の「力技」の悩み

これまでは、Geminiが気を利かせて「はい、JSONですね!どうぞ!」と余計な一言(マークダウン)を付けてくるため、以下のような処理が必要でした。

// 前回の方法:マークダウンを削る
$result = str_replace(['```json', '```', "\n", "\r"], '', $result);
$json = json_decode($result, true);

これでも動きますが、たまにGeminiが余計な解説を頭に付けてくると、json_decode が失敗してエラーになる…という「AI特有の不安定さ」が悩みどころでした。

2. 解決策:response_mime_type を指定する

Gemini APIの最新仕様では、リクエスト時に 「回答は application/json で頼むよ」 と宣言することができます。これを行うだけで、Geminiは余計な説明文やマークダウンを一切出力しなくなります。

実装コード(PHP)

前回のコードに generationConfig を追加するだけです。モデル名は最新の gemini-2.5-flash などを指定します。

<?php
$apiKey = 'YOUR_API_KEY';
$url = 'https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent?key=' . $apiKey;

$data = [
    'contents' => [
        [
            'parts' => [
                ['text' => '商品「りんごのパウンドケーキ」のPR文を3つ、紹介文(rei)というキーを持つJSON形式で提案してください。']
            ]
        ]
    ],
    // ここがポイント!
    'generationConfig' => [
        'response_mime_type' => 'application/json',
    ]
];

$options = [
    'http' => [
        'method' => 'POST',
        'header' => ['Content-Type: application/json'],
        'content' => json_encode($data),
    ],
];

$context = stream_context_create($options);
$response = file_get_contents($url, false, $context);
$result = json_decode($response, true);

// Geminiの回答(中身はもうきれいなJSON!)
$jsonText = $result['candidates'][0]['content']['parts'][0]['text'];

// 直接デコードできる! str_replaceは不要!
$products = json_decode($jsonText, true);

print_r($products);

3. さらに鉄壁にするなら「Response Schema」

application/json を指定するだけでも強力ですが、さらに「このキー名(rei)を絶対に使って!」と強制したい場合は、response_schema を設定することも可能です。

'generationConfig' => [
    'response_mime_type' => 'application/json',
    'response_schema' => [
        'type' => 'OBJECT',
        'properties' => [
            'introductions' => [
                'type' => 'ARRAY',
                'items' => [
                    'type' => 'OBJECT',
                    'properties' => [
                        'rei' => ['type' => 'STRING']
                    ]
                ]
            ]
        ]
    ]
]

ここまで書けば、Geminiがキー名を間違えることもなくなります。まさに「AIをプログラムの関数のように扱う」完成形です。

まとめ:AIに「型」を教える

AIに「言葉でお願い」するのも大切ですが、APIの設定で「出口の型を縛る」ことで返ってくる回答の型が定まり、後続の処理に余計なことを考える必要がなくなりました

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です