PDFインプット時のトークン数を実測してみた
Azure OpenAI(AOAI)の Responses API では、PDFファイルをそのまま入力として渡し、内容を理解した上で回答させることができます。
RAGで検索結果のチャンクだけを情報源とするのではなく、元ファイルをそのまま使えれば回答精度が上がると考え(Long Context RAGの要素含む)、そのような方法は現実的なのかを検証しました。
本記事では、PDFを直接インプットした場合のトークン数・処理時間を実測し、現実的にどこまで使えるかを検証しています。
最初に結論
ファイル内の文字数がインプットトークン数に大きく影響があります。
10万文字を超えるような大きいファイルの場合、10万トークンを超えてくることもあり、コンテキスト長の限界に達します。
そこまで大きなPDFがない前提なら可能ですが、トークン数の保証はできず、PDFインプットのみでのRAG回答は、本番システムとしては難しそうです。
前提条件(検証環境)
本検証での前提条件は以下の通りです。
- API: Azure OpenAI Responses API
- モデル: gpt-5-chat
- 最大コンテキスト長: 128,000 tokens
- PDF入力方式:
- 事前にテキスト抽出等はせず、PDFをそのまま入力
- 価格(input):
- $1.25 / 1M tokens
- 為替レート: 1ドル = 150円 で計算
- RAG構成:(今回は回答部分のみの実験で、RAG構成を用意しているわけではない)
- 通常、RAGシステムでは検索結果のチャンクごとの元ファイルも取得できているものと想定し、元ファイルをインプットに使うような改修は容易と考えられる
使用したPDFファイル一覧
| ファイル名 | サイズ(KB) | ページ数 | 文字数 ※ | URL |
|---|---|---|---|---|
| 人口動態統計速報.pdf | 292 | 4 | 4,999 | https://www.mhlw.go.jp/toukei/saikin/hw/jinkou/geppo/s2025/dl/202504.pdf |
| 技能実習生のための日本語みどり.pdf | 385 | 4 | 3,841 | https://hiroba.jitco.or.jp/images/sample/aboutmidori-jp.pdf |
| バジルソースチラシ.pdf | 479 | 2 | - | https://www.aioi.co.jp/pdf/basil_web.pdf |
| カレーレシピBOOK食べ方BOOK.pdf | 530 | 2 | - | https://www.shokuhin-kikaku.com/%E3%83%AC%E3%82%B7%E3%83%94/ |
| 日本民間公益活動連携機構_就業規則.pdf | 846 | 44 | 41,994 | https://www.janpia.or.jp/_assets/download/about/rule/rule_16.pdf |
| モデル就業規則.pdf | 1,034 | 93 | 68,511 | https://www.mhlw.go.jp/stf/seisakunitsuite/bunya/koyou_roudou/roudoukijun/zigyonushi/model/index.html |
| 就業規則の手引全文.pdf | 7,737 | 145 | 110,759 | https://www.hataraku.metro.tokyo.lg.jp/shiryo/R5.3_%E5%B0%B1%E6%A5%AD%E8%A6%8F%E5%89%87%E3%81%AE%E6%89%8B%E5%BC%95%E5%85%A8%E6%96%87.pdf |
| 観光の動向.pdf | 9,271 | 63 | 52,908 | https://www.mlit.go.jp/statistics/content/001890796.pdf |
| 観光白書.pdf | 2,884 | 18 | 15,570 | https://www.mlit.go.jp/kankocho/content/001890451.pdf |
※ 文字数は、Wordで計測できたものを載せています。
実装(PDF入力)
実装は Microsoft の公式ドキュメントを参考にしています。
PDFを Base64に変換して Responses API に渡す 方法です。
1ファイルを入力した場合の測定結果
ファイルごとに処理時間(1回の実行なので参考程度)、入力トークン数を調べました。
以下の添付PDFを解析して簡潔に要約してください。というプロンプトで実行しています。
| ファイル名 | サイズ(KB) | ページ数 | 文字数 | 処理時間(秒) | 入力トークン数 | モデル | 入力コスト(円) | 備考 |
|---|---|---|---|---|---|---|---|---|
| 人口動態統計速報.pdf | 292 | 4 | 4,999 | 52.336 | 5,110 | gpt-5-chat | 0.96 | |
| 技能実習生のための日本語みどり.pdf | 385 | 4 | 3,841 | 42.847 | 3,294 | gpt-5-chat | 0.62 | |
| バジルソースチラシ.pdf | 479 | 2 | - | 9.983 | 167 | gpt-5-chat | 0.03 | 画像多めのファイル |
| カレーレシピBOOK食べ方BOOK.pdf | 530 | 2 | - | 17.811 | 167 | gpt-5-chat | 0.03 | 画像多めのファイル |
| 日本民間公益活動連携機構_就業規則.pdf | 846 | 44 | 41,994 | 27.322 | 32,076 | gpt-5-chat | 6.01 | |
| モデル就業規則.pdf | 1,034 | 93 | 68,511 | 53.516 | 62,346 | gpt-5-chat | 11.69 | |
| 就業規則の手引全文.pdf | 7,737 | 145 | 110,759 | – | – | gpt-5-chat | 0 | エラー |
| 観光の動向.pdf | 9,271 | 63 | 52,908 | 46.568 | 48,865 | gpt-5-chat | 9.16 | 図表多めのファイル |
| 観光白書.pdf | 2,884 | 18 | 15,570 | 35.642 | 15,135 | gpt-5-chat | 2.83 | 図表かなり多めのファイル |
コンテキスト超過エラー
「就業規則の手引全文.pdf」では、以下のエラーが発生しました。gpt-5-chatのコンテキスト長である 128,000 トークンを超えてしまいました。
openai.BadRequestError: Error code: 400 - {'error': {'message': 'Your input exceeds the context window of this model. Please adjust your input and try again.', 'type': 'invalid_request_error', 'param': 'input', 'code': 'context_length_exceeded'}}
1ファイル検証の考察
- ページ数やファイルサイズはトークン数と比例してはいない
- 文字数が概ねトークン数と概ね比例関係があり、ファイル中の画像や図表はあまり影響しない
- 処理時間はトークン数と比例はしないが、大きいファイルだと30秒から1分かかった
- 日本語では、文字数10万文字が10万トークンの目安になりそう
- PDFをそのまま渡す方式は便利だが、トークン数の計算はブラックボックス寄りであり、保証や計算は難しい
2ファイルを入力した場合の測定結果
RAGでは複数の情報源をインプットすることが通常なので、2ファイルのインプットを試しました。
この2つのPDFで共通している内容はあるか。というプロンプトで実行しています。
| 入力PDF | 処理時間(秒) | 入力トークン数 | モデル | 入力コスト(円) | 備考 |
|---|---|---|---|---|---|
| バジルソースチラシ.pdf + カレーレシピBOOK食べ方BOOK.pdf | 22.234 | 312 | gpt-5-chat | 0.06 | |
| モデル就業規則.pdf + 日本民間公益活動連携機構_就業規則.pdf | 37.715 | 94,400 | gpt-5-chat | 17.70 |
2ファイル検証の考察
- 複数PDFは単純にトークン数が加算される
- 処理時間は単純に増えるということではない
実際に回答できるか
これだけ長いファイルを添付して、実際に正しい回答ができるのかも試しました。
-
対象ファイル:特にトークン数が多い「モデル就業規則.pdf」(6万2千トークン)
-
共通の指示文:
以下の添付PDFを参照して解答してください。一般知識では回答せず、以下の添付PDFからの情報でのみ回答してください。 -
質問と回答結果
質問1
1年勤続した場合の有給休暇は何日付与されますか。回答1
モデル就業規則(令和5年7月版、厚生労働省)によれば、 \n第23条〔年次有給休暇〕の規定に基づき、次のように定められています:\n\n> 採用日から6か月間継続勤務し、所定労働日の8割以上出勤した労働者に対しては、10日の年次有給休暇を与える。 \n> その後1年間継続勤務するごとに、当該1年間において所定労働日の8割以上出勤した労働者に対しては、下表のとおり勤続期間に応じた日数を付与する。\n\n表によると:\n\n| 勤続期間 | 付与日数 |\n|------------|-----------|\n| 6か月 | 10日 |\n| 1年6か月 | 11日 |\n| 2年6か月 | 12日 |\n| 3年6か月 | 14日 |\n| 4年6か月 | 16日 |\n| 5年6か月 | 18日 |\n| 6年6か月以上 | 20日 |\n\nしたがって、 \n**1年間勤続した場合(=入社から1年6か月経過時)には、11日の年次有給休暇** が付与されます。 \n\n(出典:厚生労働省「モデル就業規則 令和5年7月版」第23条),質問2
20年で退職した場合、退職金はいくらもらえますか。回答2
添付されたPDF(厚生労働省「モデル就業規則 令和5年7月版」)によると、 \n退職金については第8章「退職金」で以下のように定められています。\n\n---\n\n### 【第55条 退職金の額】\n> 退職金の額は、退職又は解雇の時の基本給の額に、勤続年数に応じて定めた下表の支給率を乗じた金額とする。\n\n| 勤続年数 | 支給率 |\n|------------|-----------|\n| 5年未満 | 1.0 |\n| 5年~10年 | 3.0 |\n| 11年~15年 | 5.0 |\n| 16年~20年 | 7.0 |\n| 21年~25年 | 10.0 |\n| 26年~30年 | 15.0 |\n| 31年~35年 | 17.0 |\n| 36年~40年 | 20.0 |\n| 41年~ | 25.0 |\n\n---\n\nしたがって、**20年で退職した場合の退職金の支給率は「7.0」**です。 \nつまり、**退職金=退職時の基本給 × 7.0** となります。\n\n(注)PDFには具体的な「基本給の金額」は示されていませんので、もらえる退職金の総額はその時点の基本給により異なります。
いずれも適切な箇所を引用して解答できていました。
今のモデルは6万文字超の引用でも正しく回答できるようです。
まとめ
-
AOAI Responses APIでは PDFをそのまま入力してRAG的な回答は可能
-
実務でのポイントは以下
- 制限になるのは トークン数
- トークン数は、ファイルサイズ、ページ数、画像や図表の影響はあまりなく、文字数の影響が大きい
- コンテキスト長10万トークンとした場合、7万文字前後が一つの安全ラインか
- 大きなPDFや複数PDFを扱う場合は
- 分割
- 要約
- チャンク化(通常のRAG)
が現実的
- 費用はファイルによっては1回10円ぐらいかかる
-
「とりあえずPDFを突っ込んで聞く」は便利だが、スケールさせるなら通常のRAG設計は必須
-
妥協案としては、処理に時間がかかってもよければ、まずPDFで回答にトライして、コンテキスト長の上限に達したら通常のRAGのチャンクで回答する、という方法も考えられそう
