生成AIの活用ノウハウや、 注目の技術に関する記事を掲載
公開

Amazon Bedrockの基盤モデルパーサーを実測する――解析料金とRetrieveレスポンスの中身

はじめに

前回の記事では、基盤モデルパーサーがグラフやスキャン画像からテキストを取り出せることを確認しました。ただ、実際に運用するかどうかを決めるとなると、別の情報が必要になります。同期のたびにモデルが何回呼ばれ、何トークンを消費し、いくらかかるのか。そして、検索結果はどのような形でアプリケーションへ返ってくるのか。どちらもマネジメントコンソールの画面には表示されません。

そこで、前回と同じ3種類のPDF(テキストだけ・グラフを含む・スキャン画像だけ)をもう一度同期し、Model invocation loggingとRetrieve APIのレスポンスから実測しました。本記事で確認するのは次の4点です。

  • 基盤モデルパーサーは1回の同期で何回呼ばれ、何トークンを消費するのか
  • 解析料金は何によって決まり、PDFの構成によってどう変わるのか
  • パース後のテキストは、どの単位で埋め込みモデルへ渡されるのか
  • Retrieve APIは、テキストと画像をどのフィールドへ返すのか

Knowledge Basesの構築手順、Model invocation loggingの設定、パーサーの種類ごとの違いは、それぞれ次の記事で扱っています。

生成AI関連
Amazon Bedrock Knowledge Base × S3 VectorsでRAGを作って…
生成AI関連
Amazon BedrockのModel invocation logging入門――入出力とトーク…
生成AI関連
Amazon Bedrock Knowledge Basesの「パーサーとしての基盤モデル」とは

検証条件

Knowledge Basesのデータ取り込みは、文書のパース、チャンク分割、埋め込み生成、ベクトルストアへの保存という順に進みます。料金とレスポンスを読み解くには、この4つを混ぜずに観測する必要があります。パーサーへの入力単位と、Retrieveが返す検索結果の単位は、必ずしも一致しないためです。

観測に使ったのは、Model invocation loggingとRetrieve APIのレスポンスです。Knowledge Bases内部からのモデル呼び出しもログに記録されるため、パーサーと埋め込みモデルの呼び出しはどちらも追えます。
ログの出力先はCloudWatch LogsとS3から選べます。本記事ではS3へ出力したログを使用しました。

段階 確認した内容 確認先
パーサー入力 ページ画像と抽出済みテキストの有無 Model invocation logging
パーサー出力 生成されたテキストと入出力トークン数 Model invocation logging
埋め込み入力 埋め込みへ渡されたテキストとトークン数 Model invocation logging
Retrieve結果 content.type、返却フィールド、メタデータ Retrieve APIのレスポンス

検証対象のPDFは前回と同じ3ファイルです。パーサー以外の設定は固定し、3ファイルを1つずつ個別に同期しました。まとめて同期すると、どのログがどのPDFのものか判断しづらくなるためです。

項目 設定
AWSリージョン ap-northeast-1
データソース Amazon S3
解析戦略 基盤モデルパーサー
解析用モデル jp.anthropic.claude-haiku-4-5-20251001-v1:0
解析用プロンプト デフォルト
チャンク戦略 固定(3,072トークン/オーバーラップ10%)
埋め込みモデル amazon.titan-embed-text-v2:0
ベクトルストア Amazon S3 Vectors
PDFのページ数 テキスト:3/グラフ:6/スキャン:1
検証日 2026年8月21日

基盤モデルパーサーはPDFの1ページに1回呼ばれる

ログを確認すると、解析用モデルの呼び出し回数はPDFのページ数と完全に一致しました。3ページのPDFでは3回、6ページでは6回、1ページでは1回です。

PDF ページ数 パーサー呼び出し回数 入力トークン 出力トークン
テキストだけ 3 3 10,286 3,734
グラフを含む 6 6 16,666 4,053
スキャン画像だけ 1 1 2,160 300
合計 10 10 29,112 8,087

入力の内容にも共通点がありました。3種類のPDFすべてで、モデルへの入力にページを画像化したデータが含まれていました。テキストレイヤーを持つPDFでは、抽出済みのテキストも同じ入力に同梱されます。一方、モデルからの出力はいずれもテキストだけでした。

次のログは、テキストだけのPDFの1ページを解析した1回分の呼び出しです。長い行は右端で見切れています。

基盤モデルパーサーが1ページを解析した呼び出しのログ

テキストだけのPDFの1ページ分の呼び出しログ。入力にページ画像と抽出済みテキストが含まれ、出力はMarkdownのテキストで返る

呼び出しに使われているAPIはConverseで、入力は3つのブロックで構成されています。1つ目はデフォルトの解析用プロンプトです。画像ページの内容をMarkdown構文で出力し、<markdown>タグで囲むよう指示しています。2つ目がページを画像化したPNG、3つ目がPDFから抽出済みのテキストです。抽出済みテキストは<context>タグで囲まれ、画像を読み取るときの参照情報として渡されています。
出力は<markdown>タグで囲まれたテキスト1ブロックだけです。この呼び出しでは入力が3,469トークン、出力が1,273トークンでした。

ページ画像の記録方法は、ログの出力先によって変わります。S3へ出力した場合は、上のログのように画像のS3パスが記録されます。CloudWatch Logsへ出力した場合は、画像のバイト列がログ本体に記録されます。同じ内容を確認するつもりでも、出力先によってログの見た目は大きく変わります。
つまり、基盤モデルパーサーは「1ページを画像として見て、その内容をMarkdownへ書き起こす」処理を、ページ数だけ繰り返しています。ページ数から呼び出し回数を見積もれるため、解析料金は事前に概算できます。

テキストの密度が料金を左右する

基盤モデルパーサーの料金は、解析用モデルの入出力トークン数で決まります。今回使ったClaude Haiku 4.5の単価は、入力が100万トークンあたり1.00ドル、出力が5.00ドルです(2026年8月時点、ap-northeast-1)。単価はモデル、推論方式、リージョンによって変わるため、見積もり時はAmazon Bedrock料金ページで確認してください。

料金 計算方法
入力料金 入力トークン合計 ÷ 100万 × 入力単価
出力料金 出力トークン合計 ÷ 100万 × 出力単価
パーサー料金 入力料金 + 出力料金

この式で計算した結果が次の表です。円換算は1ドル=165円としています。

PDF ページ数 入力トークン 出力トークン パーサー料金 円換算 1ページあたり
テキストだけ 3 10,286 3,734 $0.028956 ¥4.78 ¥1.59
グラフを含む 6 16,666 4,053 $0.036931 ¥6.09 ¥1.02
スキャン画像だけ 1 2,160 300 $0.003660 ¥0.60 ¥0.60
合計 10 29,112 8,087 $0.069547 ¥11.48 ¥1.15

10ページで11.48円、1ページあたり1.15円です。1,000ページの文書群を同期しても1,200円程度に収まる計算になります。基盤モデルを使う解析としては、金額そのものは大きくありません。
ただし、1ページあたりの内訳を見ると、直感とは逆の結果が出ています。最も高いのはテキストだけのPDF(1.59円)で、グラフを含むPDF(1.02円)より高く、スキャン画像だけのPDF(0.60円)の2倍以上です。視覚情報が多いほど高くなるわけではありません。

理由は、本文のテキストが入力と出力の両方でカウントされることです。
入力の内訳は、解析用プロンプト、ページ画像、抽出済みの本文テキストの3つでした。テキストレイヤーを持たないスキャンPDFには、このうち本文テキストがありません。実際、1ページあたりの入力トークンはスキャンPDFが2,160で、これがプロンプトとページ画像だけの場合のおおよその量にあたります。ここへ本文が加わると、グラフPDFは2,778、テキストPDFは3,429まで増えました。増分はそれぞれ約620トークンと約1,270トークンです。
一方、1ページあたりの出力トークンはグラフPDFが676、テキストPDFが1,245でした。入力に加算された本文の分と、ほぼ同じ規模です。パーサーは本文を入力として受け取り、同じ本文をMarkdownとして書き出すため、本文の量が入力と出力に1回ずつ乗ります。
しかも出力単価は入力単価の5倍です。今回の合計では、料金の約6割が出力側で発生しました。文字がびっしり詰まったページほど、入力と出力の両方が膨らみ、そのうえ増えた分の多くが5倍の単価で課金されます。図やグラフが多いページのほうが安いのは、書き起こすテキストが少ないからです。

そしてもう1点、費用面で押さえておきたい挙動があります。PDFがテキストだけで構成されていても、デフォルトパーサーに自動で切り替わることはありません。基盤モデルパーサーを指定した以上、視覚情報を含まないページも基盤モデルへ渡され、料金が発生します。

埋め込みモデルの料金はパーサーの270分の1

パーサーが出力したテキストは、指定したチャンク戦略で分割された後、埋め込みモデルへ渡されます。この段階もログに記録されるため、同じように実測できます。
今回使ったAmazon Titan Text Embeddings V2の単価は、入力が1,000トークンあたり0.000029ドル(100万トークンあたり0.029ドル)です(2026年8月時点、ap-northeast-1)。埋め込みモデルは入力のみの課金で、出力側の料金はありません。単価はリージョンによって差があるため、Amazon Bedrock料金ページで自分のリージョンの値を確認してください。

PDF ページ数 埋め込み呼び出し回数 入力トークン 埋め込み料金 円換算
テキストだけ 3 3 4,195 $0.00012166 ¥0.0201
グラフを含む 6 16 4,270 $0.00012383 ¥0.0204
スキャン画像だけ 1 4 339 $0.00000983 ¥0.0016
合計 10 23 8,804 $0.00025532 ¥0.0421

10ページ分の埋め込み料金は合計0.04円で、同じPDFのパーサー料金11.48円に対して約270分の1でした。基盤モデルパーサーを使う場合、費用の見積もりはパーサー側だけを見ればほぼ足ります。
トークン数も比較しておきます。パーサーの出力が合計8,087トークン、埋め込みへの入力が8,804トークンで、ほぼ同じ規模です。パーサーが書き起こしたテキストが、そのまま埋め込みへ流れていると考えて差し支えありません。ただし両者はトークナイザーが異なるため、数値の一致そのものに意味を求めないでください。

一方、呼び出し回数はページ数と一致しませんでした。3ページのテキストPDFは3回でしたが、6ページのグラフPDFは16回、1ページのスキャンPDFは4回です。1回あたりの入力トークンを割り戻すと、テキストPDFは約1,400、グラフPDFは約270、スキャンPDFは約85となり、指定した3,072トークンの上限にはどれも達していません。
ここから「呼び出し1回=チャンク1件」と読みたくなりますが、そう断定はできません。チャンク分割の仕組みを説明した公式ドキュメントには、基盤モデルパーサーのような高度なパーサーで解析した内容はページやセクションの論理境界をまたいで結合されないと記載がありますが、内部のモデル呼び出しとベクトルストアに保存されるチャンクがどう対応するかまでは書かれていません。サービス内部でまとめて処理されている可能性もあります。ログから読み取れるのは呼び出し回数と入力テキストまでで、チャンクの境界はここでは確定できません。

Retrieveは同じデータソースからTEXTとIMAGEの両方を返す

ここからはレスポンス側です。Knowledge BasesのRetrieve APIは、検索結果をretrievalResults配列で返します。RetrievalResultContentの定義どおり、各要素のcontent.typeを見れば、その結果がテキスト、画像、行、音声、動画のどれなのかを判別できます。

content.type 読むフィールド 内容
TEXT content.text 検索されたテキストチャンク
IMAGE content.byteContent Base64でエンコードされた画像のData URI
ROW content.row 構造化データの行
AUDIO content.audio 音声セグメント
VIDEO content.video 動画セグメント

今回の3ファイルで実際に返ってきた種別は、次のとおりでした。

PDF パーサーへの入力 パーサーの出力 Retrieveのcontent.type
テキストだけ(TEXT_ONLY ページ画像とテキスト テキスト TEXT
グラフを含む(TEXT_AND_GRAPH ページ画像とテキスト テキスト IMAGE
スキャン画像だけ(SCAN_PDF ページ画像 テキスト TEXT

同じデータソース、同じパーサー、同じ設定でも、TEXTIMAGEの両方が返っています。パーサーの出力はすべてテキストだったにもかかわらず、グラフを含むPDFだけは画像として返ってきました。「基盤モデルパーサーを使うと常にbyteContentで返る」という理解も、「出力がテキストだからtextで返る」という理解も、どちらも成り立ちません。
ナレッジベースへの問い合わせを説明した公式ドキュメントには、Retrieveがテキストチャンクまたは抽出した画像を返すことは書かれていますが、どちらを選ぶかの条件は明記されていません。今回の結果も、その条件を特定できるものではありません。PDFの構成やパーサーの種類から返却形式を決め打ちしないほうが安全です。
次の例は、実際のレスポンスからIMAGETEXTの結果を1件ずつ抜き出したものです。Request ID、アクセス制御用の値、長いBase64文字列、本文は省略し、S3バケット名は匿名化しています。文字列中の"…"は省略部分を表します。

content.type == IMAGE

{
  "retrievalResults": [
    {
      "content": {
        "type": "IMAGE",
        "byteContent": "data:image/png;base64,..."
      },
      "location": {
        "s3Location": {
          "uri": "s3://<source-bucket>/documents/TEXT_AND_GRAPH.pdf"
        },
        "type": "S3"
      },
      "metadata": {
        "x-amz-bedrock-kb-document-page-number": 4.0,
        "x-amz-bedrock-kb-description": "<figure>\nFigure: Concerns about using generative AI features in PDF\n...\n</figure>",
        "documentName": "TEXT_AND_GRAPH.pdf",
        "x-amz-bedrock-kb-byte-content-source": "s3://<multimodal-bucket>/.../image.png"
      }
    }
content.type == TEXT

    {
      "content": {
        "type": "TEXT",
        "text": "## 4. 生成 AI と検索エンジンの違い\n生成 AI は..."
      },
      "location": {
        "s3Location": {
          "uri": "s3://<source-bucket>/documents/TEXT_ONLY.pdf"
        },
        "type": "S3"
      },
      "metadata": {
        "x-amz-bedrock-kb-document-page-number": 1.0,
        "documentName": "TEXT_ONLY.pdf"
      }
    }
  ]
}

typeIMAGEならbyteContentTEXTならtextが、同じcontentオブジェクトの中に入ります。フィールド名が違うだけで、階層は同じです。

実装上の注意点はここです。content.textの有無だけで分岐すると、画像の結果を静かに取りこぼします。最初にcontent.typeを判定し、TEXTIMAGEを別々に処理してください。
もっとも、この違いを扱う必要があるかは構成によります。RetrieveAndGenerateのようにKnowledge Basesへ検索から回答生成まで任せる場合、種別の判定はサービス側で完結するため、アプリケーションで意識する場面は限られます。Retrieveだけを呼び出して独自にプロンプトを組み立てる場合は、結果種別に応じた処理が必要です。

画像結果のメタデータは公式説明と一致しなかった

画像として返ってきた結果には、contentのほかに2つの値が付いていました。x-amz-bedrock-kb-byte-content-sourcex-amz-bedrock-kb-descriptionです。前者は、抽出された画像が保存されているマルチモーダルストレージのS3 URIを示します。
なお、AWS公式ユーザーガイドはこの2つを「レスポンスヘッダー」と説明しています。

If the retrieved data contains images, the response also returns the following response headers, which contain metadata for source chunks returned in the response

しかし今回のレスポンスでは、どちらも各検索結果のmetadataオブジェクトの中に入っていました。
注意したいのは後者の中身です。同じユーザーガイドは、x-amz-bedrock-kb-descriptionを画像のBase64文字列として説明しています。しかし今回のTEXT_AND_GRAPHでは、このフィールドに入っていたのはBase64文字列ではなく、<figure>タグで囲まれたパース後のテキストでした。図のキャプションと内容の説明が、そのまま読める形で格納されています。

画像結果でもパース後のテキストが手に入るため、独自にプロンプトを組み立てる場合は使い道があります。ただし、公式の説明と実測が食い違っている状態なので、仕様として当てにするのは避けたほうがよいでしょう。ここで示したのは、Claude Haiku 4.5をパーサー、Amazon Titan Text Embeddings V2を埋め込みモデルとし、ap-northeast-1で実行した1回の検証結果です。今後仕様が変わる可能性もあるため、実装前に、自分の環境のレスポンスを保存して確認してください。

文書の種類でデータソースを分ける

実測値をまとめると、基盤モデルパーサーの費用は次のように動きます。料金はページ数と、そのページに含まれる文字の量で決まります。視覚情報の有無ではありません。テキストが密なページほど入力と出力の両方のトークンが増え、1ページあたりの単価が上がります。
この結果は、データソース分割の判断に直結します。基盤モデルパーサーが必要なのは、グラフやスキャン画像の中にしか情報がないPDFです。テキストレイヤーだけで検索に足りるPDFを同じデータソースに置くと、そのファイルが本文量の多い文書であるほど、無駄な費用が積み上がります。

対策は、文書の種類ごとにデータソースを分けることです。テキスト中心のPDFはデフォルトパーサーのデータソースへ、視覚情報を含むPDFは基盤モデルパーサーのデータソースへ振り分けます。データソースの取り込み設定で指定する解析戦略は、同じデータソース内のファイルへ一律に適用されるため、ファイル単位での切り替えはできません。
なお、解析戦略の種類は、データソースを接続した後に変更できません。同じ種類の中で解析用モデルや解析用プロンプトを変更することはできますが、デフォルトパーサーと基盤モデルパーサーの切り替えは種類の変更にあたるため、後から切り替えたい場合は、新しいデータソースを作成して同期し直すことになります。分割の方針は、最初の設計時点で決めておくほうが手戻りが少なくなります。

まとめ

基盤モデルパーサーの実測から分かったことを整理します。

費用面のポイントは次の6点です。

  • 呼び出しはページ単位:PDFの1ページにつき1回呼ばれ、ページを画像として読んでMarkdownへ書き起こします。
  • 10ページで11.48円:1ページあたりに直すと1.15円でした。
  • 本文は2回カウントされる:テキストレイヤーを持つPDFでは本文が入力と出力の両方に乗り、しかも出力単価は入力単価の5倍です。
  • 効くのは文字の密度:視覚情報の量ではなく文字量で決まり、今回は文字が密なテキストPDFが1ページあたり最も高くなりました。
  • 自動で切り替わらない:テキストだけのPDFでもデフォルトパーサーへは切り替わらず、基盤モデルの料金が発生します。
  • 埋め込みは誤差の範囲:パーサー料金の約270分の1で、見積もりでは考慮不要な規模です。

レスポンス側で押さえておきたいのは次の3点です。

  • TEXTとIMAGEが混在する:同じデータソース、同じ設定でも両方が返りました。
  • 返却形式を決め打ちしない:パーサーの種類や出力形式から推測せず、content.typeを判定してからtextとbyteContentを読み分けてください。
  • 公式の説明と食い違う場合がある:x-amz-bedrock-kb-descriptionのような例があるため、実装前に自分の環境のレスポンスを確認しておくと安全です。

パーサーの選択は、解析精度だけでなく費用でも決まります。テキストだけのPDFまで基盤モデルへ渡す必要があるかを見直し、文書の種類ごとにデータソースを分けることで、検索できる情報と同期料金のバランスを取れます。

生成AI活用支援サービスのご紹介

Tech Funでは、お客様のフェーズに合わせ、生成AI活用に向けた様々な支援をご提供しています。

  1. 無料診断パック:業務・プロセスの現状を無料で診断し、生成AI活用の可能性をレポートします。
  2. 検証(PoC)パック:診断で有効性が確認された業務を対象に、プロトタイプ構築を支援します。
  3. コンサルティングサービス:生成AI導入戦略の策定から運用体制構築までを包括的に支援します。
  4. Plain RAG:社内文書をもとに回答し、社内問い合わせを効率化するAIチャットパッケージです。

生成AIに限らず、Web・業務システム開発やインフラ設計など、技術領域を問わずご相談を承っています。「何から始めれば良いか分からない」という段階でも構いませんので、ぜひお気軽にお問い合わせください。

執筆・編集

Tech Fun Magazine R&Dチーム
Tech Funの生成AI研究に携わるエンジニアが、最新のAIモデル動向やプロンプト設計、実業務への応用手法など、生成AIに特化した知見を執筆・編集しています。
モデル評価や業務シナリオに応じたAI活用設計など、日々のR&D活動で得られる実践的なノウハウをわかりやすく紹介します。

ARTICLE
生成AI関連記事一覧

生成AI関連

Amazon Bedrockの基盤モデルパーサーを実測する―…

生成AI関連

ChatGPT WorkのScheduled TasksをW…

生成AI関連

Amazon Bedrock Knowledge Bases…

生成AI関連

ChatGPTのChat・Work・Codexの違い|5時間…

生成AI関連

Amazon BedrockのModel invocatio…

生成AI関連

CodexデスクトップアプリでWebアプリを作る方法|非エン…

生成AI関連

DynamoDBネイティブベクトル検索をAWSコンソールとP…

生成AI関連

Agent Skillsは作るだけではダメ?13万件のSKI…

生成AI関連

Amazon DynamoDBのネイティブベクトル検索とは―…

記事一覧を見る