前書き
最近、AWS Bedrockを使ってエージェントの開発をしています。ベースモデルとして Claude 3.5 Sonnet
を使用していますが、そのモデルの出力制御に苦労しています。
事象
フロントエンドが処理しやすいように、モデルにJSON形式で出力してもらいたくて、以下のようなプロンプトを定義しました。
最終的な回答は、以下のJSON形式で**必ず**答えてください:
{
"code": 200,
"message": "君の見解"
}
- **出力は必ずこのJSON形式のみ**とし、JSON形式以外の文字やテキストを絶対に含めてはいけません。
- 「君の見解」の部分には、質問に対する丁寧な回答を記載してください。
- **例外なく**、JSON以外のメタ情報や補足説明は含めてはいけません。
- JSON以外のテキストを出力することは厳禁です。
さあ、実際に出力してみましょう
指定通りにJSON形式で出力してくれました。
ここまでは順調でしたが、次にアクショングループを用意し、そのアクショングループに天気情報を取得できるLambdaを追加しました。
JSON形式ではあるものの、その前に余計な情報も出力されてしまいました
プロンプトを修正しても改善が見られず、ちょっと 中の人 に聞いてみました。
「DO NOT TALK JUST GENERATE ANSWER
」
これをプロンプトの最後に追加すれば良いとのことでした。
テスト
余計な口出しをしなくなりました
最後
まだたまに余計な出力がされることもありますが、かなり改善されたと思います。
補足
まだ安定してるわけではないので、下記のメソッド作ってマッピングもしてます、よかったら参考にしてください。
type Data = {
code: number;
message: string;
};
export function extractJsonData(input: string): Data | null {
const jsonStringMatch = input.match(/{\s*"code"\s*:\s*200[\s\S]*?}\s*}/);
if (jsonStringMatch) {
try {
const cleanedJsonString = jsonStringMatch[0].replace(/[\x00-\x1F\x7F]/g, "");
const salesData: Data = JSON.parse(cleanedJsonString);
return salesData
} catch (error) {
console.error('JSONのパースに失敗しました:', error);
return null
}
} else {
console.error('適切なJSONが見つかりませんでした');
return null
}
}