こんにちは~ 浮田です。
今回は短めに、踏んだ上限の話をひとつ。
Titan Text Embeddings V2(文章をベクトルにする埋め込みモデル)の仕様には、最大入力 8192 トークン、最大 50,000 文字と書いてあります。
これを見て「5 万文字入るのか、じゃあ記事 1 本まるごと 1 チャンクでいけるな」と思いました。
実際には入りませんでした。日本語だと 9,000 文字あたりで 400 エラーになります。
AWS のドキュメントには、英語での文字とトークンの比率は平均で 1 トークンあたり 4.7 文字、と書いてあります。8192 トークンと 50,000 文字という 2 つの上限は、英語ならだいたい同じところに来る値です。
日本語はそうなりません。かなや漢字は 1 文字がおおむね 1 トークン前後なので、文字数の上限に届くずっと手前でトークンの上限に当たります。上限は 2 つあって、先に当たったほうで止まります。日本語では必ずトークンのほうが先です。
推測しても仕方ないので、実際に叩いて確かめました。InvokeModel のレスポンスには inputTextTokenCount が入っていて、入力が何トークンとして数えられたかが分かります。
r = bedrock.invoke_model(
modelId="amazon.titan-embed-text-v2:0",
body=json.dumps({"inputText": text, "dimensions": 1024, "normalize": True}),
contentType="application/json", accept="application/json")
d = json.loads(r["body"].read())
print(d["inputTextTokenCount"])
手元の日本語の技術記事を見出し単位で切った 80 チャンク(合計 44,302 文字)を、検索対象の文章のまとまり、つまりコーパスとして用意し、1 チャンクずつ投げて測りました。
|
|
値 |
|
合計文字数 |
44,302 |
|
合計トークン数 |
36,605 |
|
1 文字あたりのトークン数(平均) |
0.83 |
|
同(中央値) |
0.86 |
|
同(最小 / 最大) |
0.45 / 1.04 |
1 文字が 0.8〜0.9 トークン。
1 トークンあたりに直すと約 1.2 文字で、英語の 4.7 文字とは 4 倍近く違います。コードブロックや英単語が多いチャンクは低め(0.45)で、文字数よりトークン数のほうが多くなるチャンクもありました(1.04)。
8192 トークンに 1.2 文字を掛けると、およそ 9,800 文字です。
平均で見た日本語の上限はこのあたりですが、文章によって上下します。次の節で実際に投げた文章は、これより手前で当たりました。
文字数を増やしながら投げてみました。
|
入力文字数 |
結果 |
|
5,000 |
成功。4,790 トークン |
|
9,000 |
エラー。8,217 トークン |
|
12,000 |
エラー。10,784 トークン |
|
49,000 |
エラー。36,531 トークン |
9,000 文字で超えました。このとき 1 文字あたり 0.91 トークンで、平均の 0.83 より重い文章だったぶん、9,800 文字より手前で当たっています。返ってくるのはこれです。
ValidationException: 400 Bad Request: Too many input tokens.
Max input tokens: 8192, request input token count: 8217
私は「超えた分は黙って切り捨てられて、後半の話題が検索に引っかからなくなる」と思い込んでいましたが、直接 InvokeModel を叩く限り、超えた瞬間に 400 で弾かれます。黙って切られるより、ずっとマシです。
ただ、「記事 1 本を 1 チャンクに」という設計で投入バッチを組んでいると、日本語では 9,000 文字を超える記事が全部落ちます。バッチの途中で止まって初めて気づく、というのが一番ありそうな踏み方です。
チャンクを短くすれば済みます。
そもそも公式ドキュメントは、検索用途では段落やセクションのような論理的な単位に分割することを推奨しています。
8192 は入力の限界であって、推奨値ではありません。
私のコーパスでは見出し単位で切って 1 チャンク 150〜1,300 文字、トークンにして最大 1,104 で、8192 トークンの上限には近づきもしませんでした。
それから、自分のコーパスで inputTextTokenCount を一度見ておくことです。日本語の技術記事なら 1 文字 0.83 トークンでしたが、文章の種類で変わります。別の検証で民法や会社法の条文 2,000 条あまりを埋め込んだときは、1 文字 1.2 トークンでした。漢字の多い硬い文章ほど重くなります。
※この記事は 2026 年 9 月時点の仕様に基づきます。トークン比率は私のコーパスでの実測値です。Bedrock のナレッジベース経由で投入する場合は、間に入る層の挙動が別なので、そちらは確かめていません。