トークン数・チャンク分割・Streamlitキャッシュの基礎知識まとめ
✍️ はじめに
LLM(大規模言語モデル)を使ったアプリを作る際、避けて通れない概念があります。それが以下の3つ:
- トークン(token)
- チャンク分割(text chunking)
これらを「なんとなく」で使い始めてしまうと、後でトラブルになりがちです。本記事では、PythonとLangChainでLLMアプリを構築する前提として、必ず理解しておきたい基礎知識をやさしく解説します。
🧠 トークンとは何か?なぜカウントするのか?
LLMが文章を理解・処理するときの最小単位、それが トークン(token) です。
トークン数を数える理由は主に3つ。
| 理由 | 説明 |
|---|---|
| 入力制限のため | APIごとに「トークン数の上限」がある(例:gpt-4oは128k) |
| コスト管理のため | OpenAIなどのAPIは「トークン数ベース」で課金される |
| 精密な分割のため | 特に日本語やコードは「文字数≠トークン数」なので、より正確な基準として用いる |
たとえば、tiktoken ライブラリを使えば、モデルごとのトークン数を簡単に測れます:
import tiktoken
encoding = tiktoken.encoding_for_model("gpt-4o-mini")
num_tokens = len(encoding.encode("これはテストです。"))
✂️ チャンク分割とは?chunk_sizeは文字数 or トークン数?
LangChainなどで使うチャンク分割関数は、テキストを一定サイズで分割します。そのサイズの単位は**length_function の設定次第**で変わります。
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=1000,
chunk_overlap=200,
length_function=len, # ← ここが「文字数ベース」
)
この例では len を指定しているので、**chunk_sizeは「文字数」**です。
🔁 もしトークン数で分割したければ、こう変えます:
length_function=lambda x: len(tiktoken.encoding_for_model("gpt-4o").encode(x))
👣 embeddingの理解は後回しでOK? → YES!
埋め込み(embedding)とは、テキストを「ベクトル(数値のかたまり)」に変換して、意味的な近さを比較できるようにする技術です。
💡 今の段階では:
- 「embedding = 類似検索やチャット履歴フィルタに使うもの」
- 「ベクトルで意味を数値化してる」
これだけ把握しておけば十分。
写経しながら、あとで振り返って理解するスタイルでOKです!
✅ まとめ
LLMアプリを作る前に最低限おさえておきたいのは以下の3点:
- トークン単位で処理することの重要性
- チャンク分割は「文字数」か「トークン数」かを意識する
- Streamlitでは「データ用」と「道具用」でキャッシュを分ける