発生原因Transformersライブラリを使い始めて10分も経てば、おそらくこの警告に遭遇することでしょう。ウェブスクレイパーやSQLデータベースからテキストを取得し、それを直接tokenizerに渡しているかもしれません。このエラーは、入力テキストがモデルのアーキテクチャで処理できる許容範囲を超えているために発生します。
bert-base-uncasedのような標準的なモデルには、512トークンという厳格な制限があります。これは適当な数字ではなく、モデルの位置エンベディング(positional embeddings)に組み込まれたものです。512のスロットしかないアーキテクチャに1,523トークンを無理やり押し込もうとしても、モデルは余分な1,011トークンをどのようにインデックス付けすればよいか分かりません。この不一致が以下のエラーを引き起こします。
Token indices sequence length is longer than the specified maximum sequence length for this model (1523 > 512). Running this sequence through the model will result in indexing errors
デバッグプロセスまず、なぜシーケンスが肥大化しているのかを突き止めましょう。実際のパイプラインにおいて、長いシーケンスは通常、次の2つの特定の問題に起因します。
- ノイズの多いデータ: 生のテキストにHTMLタグ、CSSブロック、または大量のURLエンコードされた文字列が含まれており、それらがトークン数を増大させている。- 長文コンテンツ: 契約書、医療論文、長編エッセイなど、自然に512トークンの閾値を超えるテキストを処理している。トークン化の前に、常に文字列の長さを確認してください。10,000文字の文字列があれば、それは危険信号です。時には、1つの長いURLだけで100トークン以上を消費することもあります。私は巨大な文字列が本当に有用なコンテンツなのか、それともGPUに送る前に除去すべき単なるトラッキング用のジャンクデータなのかを確認するために、よくこのURLデコーダーを使用します。
解決策### 1. 最も素早い修正:切り捨て(Truncation)ニュースの感情分析やトピック分類などでよくあるように、最も価値のあるデータがテキストの冒頭にある場合は、末尾を切り落とすだけです。これがコードを動かすための最短の方法です。
from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased")
text = "ここに非常に長いテキストが入ります..."
# 修正:明示的に切り捨てを有効にする
inputs = tokenizer(
text,
truncation=True,
max_length=512,
return_tensors="pt"
)
2. 標準的な修正:パディングと切り捨て文章のバッチを処理する場合、GPUがそれらを処理できるように、すべて同じ長さにする必要があります。切り捨てとパディングを組み合わせて、バッチ内のすべてのテンソルが正確に512トークンになるようにします。
inputs = tokenizer(
batch_of_sentences,
padding="max_length",
truncation=True,
max_length=512,
return_tensors="pt"
)
3. 「すべて保持する」修正:スライディングウィンドウ一言も失いたくない場合もあります。そのような状況では、return_overflowing_tokensを使用します。この手法は、1つの長いドキュメントを、いくつかの重なり合うチャンク(ウィンドウ)に分割します。
inputs = tokenizer(
text,
truncation=True,
max_length=512,
stride=128, # チャンク間の重なり
return_overflowing_tokens=True,
return_offsets_mapping=True,
padding="max_length",
return_tensors="pt"
)
これにより、1つのドキュメントからチャンクのバッチが生成されます。分類を行う場合は、すべてのチャンクからのスコアを平均化するなど、結果を統合する戦略が必要になります。
検証input_idsの形状(shape)を確認して、修正を検証します。max_length=512を設定した場合、テンソルの2番目の次元は512を超えてはいけません。
print(inputs['input_ids'].shape)
# 期待される出力: torch.Size([1, 512])
もし依然として1523のような数字が表示される場合は、誤ってmodel_max_lengthを上書きしていないか、あるいはtruncation=Trueフラグを忘れていないか再確認してください。

