はじめに
Amazon Bedrock Guardrails のコンテキストグラウンディングチェックに、新しく Standard ティアが追加されました。
コンテキストグラウンディングチェックとは
モデルの回答が参照資料に基づいているかを採点し、ハルシネーションを止める機能です。
過去にこんな記事も書いていますので、よければ参考に
忙しい方に向けて AI で図解理解
アップデート概要
| 項目 | Classic ティア(従来) | Standard ティア(新規) |
|---|---|---|
| 採点の考え方 | 資料にない情報は推論でも減点 | 推論・会話的な言い回しを含む回答に対応 |
| 言い回しの違い | スコアがぶれやすい | 同じ意味ならスコアが安定 |
| 言語 | 英語・フランス語・スペイン語 | 日本語を含む多言語 |
| クロスリージョン推論 | 非対応 | 必須(ガードレールプロファイルの指定) |
| 料金 | 同額 | 同額 |
やってみた
同じ設定で Classic と Standard のガードレールをサクッと 1 つずつ作り、ApplyGuardrail API(モデルを呼ばずにガードレールだけを当てる API)に同じ回答を流してスコアを比べます。
手順 1: ガードレールを 2 つ作る
違いは tierConfig と、Standard だけに必要な --cross-region-config です。
東京から使うプロファイルは apac.guardrail.v1:0 です(プロファイル一覧)。
今回はスコアを見たいので action を NONE(検出しても止めずに結果だけ返す)にしています。
export AWS_REGION=ap-northeast-1
CLASSIC_ID=$(aws bedrock create-guardrail --name grounding-classic \
--blocked-input-messaging "blocked" --blocked-outputs-messaging "blocked" \
--contextual-grounding-policy-config '{"filtersConfig":[{"type":"GROUNDING","threshold":0.7,"action":"NONE"},{"type":"RELEVANCE","threshold":0.7,"action":"NONE"}],"tierConfig":{"tierName":"CLASSIC"}}' \
--query guardrailId --output text)
STANDARD_ID=$(aws bedrock create-guardrail --name grounding-standard \
--blocked-input-messaging "blocked" --blocked-outputs-messaging "blocked" \
--contextual-grounding-policy-config '{"filtersConfig":[{"type":"GROUNDING","threshold":0.7,"action":"NONE"},{"type":"RELEVANCE","threshold":0.7,"action":"NONE"}],"tierConfig":{"tierName":"STANDARD"}}' \
--cross-region-config guardrailProfileIdentifier=apac.guardrail.v1:0 \
--query guardrailId --output text)
echo "$CLASSIC_ID $STANDARD_ID"
手順 2: 同じ回答を両方に当てる
参照資料・質問・回答の 3 つを qualifiers で区別して渡す小さな関数を用意し、会話調で計算も含む正しい回答と、ハルシネーションを含む誤った回答の 2 つを当てます。
check() {
jq -n --arg s "$1" --arg q "$2" --arg r "$3" \
'[{text:{text:$s,qualifiers:["grounding_source"]}},{text:{text:$q,qualifiers:["query"]}},{text:{text:$r}}]' > content.json
for id in "$CLASSIC_ID" "$STANDARD_ID"; do
aws bedrock-runtime apply-guardrail --guardrail-identifier "$id" --guardrail-version DRAFT \
--source OUTPUT --content file://content.json \
--query 'assessments[0].contextualGroundingPolicy.filters[].[type,score]' --output text | paste - -
done
}
SRC='普通預金口座の開設手数料は無料です。口座維持手数料は月額1,000円です。海外送金には1%の手数料がかかります。国内送金は無料です。'
Q='普通預金口座にはいくらかかりますか?'
check "$SRC" "$Q" 'ご質問ありがとうございます!口座の開設は無料で、維持には毎月1,000円かかります。1年間だと合計12,000円ですね。ほかにも気になる点があればお気軽にどうぞ。'
check "$SRC" "$Q" '口座の開設には3,000円かかり、維持手数料は月額500円です。'
それぞれ 1 行目が Classic、2 行目が Standard の結果です。
前半の 2 行が正しい回答、後半の 2 行がハルシネーションを含む回答の結果です。
結果
閾値 0.7 で判定した結果がこちらです(左が Grounding / 右が Relevance)。
| 回答のタイプ | Classic | Standard |
|---|---|---|
| 会話調 + 計算(正しい回答) | 0.03 / 0.97 → 誤検知 | 0.6 / 1.0 → 誤検知 |
| ハルシネーション(誤った回答) | 0.0 / 0.99 | 0.0 / 0.4 |
正しい回答の Grounding スコアは Standard で 0.03 から 0.6 まで上がりましたが、しきい値 0.7 には届かず、どちらのティアでもブロック対象になりました。 誤った回答はどちらも Grounding 0.0 で捕まえていて、Standard は Relevance も 0.4 まで下げています。
後片付け
aws bedrock delete-guardrail --guardrail-identifier "$CLASSIC_ID"
aws bedrock delete-guardrail --guardrail-identifier "$STANDARD_ID"
rm -f content.json
注意点
- 切り替え前にしきい値を試す: 同じ回答でもティアでスコアが変わります(今回は 0.03 → 0.6)
- Standard でもスコアは揺れる: 同じ回答を別の回に試すと 1.0 になることもあり、しきい値付近では結果が変わります
まとめ
- 会話調や計算を含む正しい回答でも、Standard は Classic よりかなり高いスコアを付けてくれます。ただし今回はしきい値 0.7 に届かなかったので、しきい値の調整はセットで考えた方が良さそうです
- 料金は同じなので、日本語アプリでグラウンディングチェックを使うなら Standard を選んでおくのが良さそうです


