# Tiling Check Chunked Embeddings Implementation Plan > **For Claude:** REQUIRED SUB-SKILL: Use superpowers:executing-plans to implement this plan task-by-task. **Goal:** `nomic-embed-text` の 2,048 トークン上限を超える wiki ページでも、内容を欠落させずにページ単位の埋め込みを計算できるようにする。 **Architecture:** 本文を UTF-8 バイト数の保守的な上限で分割し、段落・改行境界を優先しつつ、巨大な単一段落は必ずハード分割する。各チャンクを既存のローカル Ollama API で埋め込み、チャンク長による重み付き平均と L2 正規化でページベクトルへ集約する。埋め込み方式の識別子を本文ハッシュへ含め、旧方式のキャッシュと混在させない。 **Tech Stack:** Python 標準ライブラリ、`unittest`、Ollama `/api/embeddings` --- ## 設計判断 - `/api/embed` の既定切り詰めは使わない。HTTP エラーは消えるが、ページ後半が埋め込みから失われるためである。 - モデル固有のトークナイザー依存は追加しない。UTF-8 バイト上限を保守的な代理値として使い、特殊トークン分の余裕を残す。 - ページキャッシュのスキーマは維持する。保存する値は従来どおりページ単位のベクトルである。 - 分割処理は `contextual-prefix.py` から流用しない。同処理は巨大な単一段落を上限以下へ保証できないためである。 ### Task 1: 長文分割の回帰テスト **Files:** - Create: `scripts/test_tiling_check.py` - Modify: `scripts/tiling-check.py` 1. 長い日本語本文が複数リクエストへ分割される失敗テストを書く。 2. `python3.13 -m unittest scripts/test_tiling_check.py -v` で期待どおり失敗することを確認する。 3. UTF-8 文字を壊さず、各チャンクを上限以下にする最小の分割処理を実装する。 4. 同テストが成功することを確認する。 ### Task 2: ページベクトル集約 **Files:** - Modify: `scripts/test_tiling_check.py` - Modify: `scripts/tiling-check.py` 1. チャンク長による重み付き平均、L2 正規化、次元不一致拒否の失敗テストを書く。 2. テストが期待どおり失敗することを確認する。 3. 最小の集約処理を実装する。 4. 短文の単一リクエスト互換性を含めてテストする。 ### Task 3: キャッシュと実環境の検証 **Files:** - Modify: `scripts/test_tiling_check.py` - Modify: `scripts/tiling-check.py` 1. 新方式が旧方式と異なる本文ハッシュになる失敗テストを書く。 2. 埋め込み方式識別子をハッシュへ含める。 3. 単体テストと構文検査を実行する。 4. `wiki/CLAUDE.md` と長い concept ページを実 Ollama で埋め込み、HTTP 500 が再発せず複数チャンクが処理されることを確認する。 ## 検証結果 - Python 3.13 の単体テスト 7 件に成功。 - `wiki/CLAUDE.md`: 4 チャンク、最大 1,657 バイト、768 次元。 - `wiki/concepts/2σ手法.md`: 6 チャンク、最大 1,797 バイト、768 次元。 - `wiki/concepts/AIOps.md`: 28 チャンク、最大 1,792 バイト、768 次元。 - 上記 3 ページはいずれも Ollama 0.30.9 の実モデルで HTTP エラーなく埋め込みを完了し、集約後のベクトルは L2 ノルム 1.0 となった。