オフライン索引 と オンライン検索 は分離が前提。失敗パターンは埋め込み RAM 急増、再起動後のパス迷子、評価セットなしのチャンク変更だ。ホーム、ローカル LLM の文脈は テックブログ、ゲートウェイや依存同期は OpenClaw・自動化記事 と併読。専用リモート Mac は 購入ページ で比較。
シナリオ
コード+チケット は見出し・関数単位の構造分割+小さめ overlap。PDF/OCR は固定文字窓+表跨ぎ対策の overlap。高 QPS は短文チャンク+メタフィルタ、バッチ負荷は索引側へ。多言語・法務 は埋め込み器と同一トークナイザ基準;顧客削除ならチャンク ID と墓碑化可能な永続レイアウトが必須。
データ準備
正規化後、メタに ソースパス+オフセット/ページ。散文はチャンク長の 10〜20% overlap、512〜1024 トークン帯の技術文書は 64〜128 トークン overlap から試す。文単位 と 固定文字 のハイブリッド(MD/PDF 分離)も定番。前処理版をベクトルスナップショットとセットでログする。
CI とリモートジョブで再現するため、ノブは環境変数に逃がす:
export RAG_CHUNK_SIZE=768
export RAG_CHUNK_OVERLAP=96
export RAG_EMBED_BATCH=24
export RAG_MAX_CHARS_PER_CHUNK=3200監査しやすい最小 CLI 例(スタックに合わせ置き換え):
python -m app.rag_index \
--chunk-size "${RAG_CHUNK_SIZE}" \
--overlap "${RAG_CHUNK_OVERLAP}" \
--embed-batch "${RAG_EMBED_BATCH}" \
--persist-dir "${RAG_VECTOR_DIR}"ベクトルストアの比較
16〜64 GB UMA Mac の ローカル優先 目安。RAM ピークはバッチ・次元・生文常駐で変動するオーダー感。
| プロファイル | チャンク overlap | 埋め込み batch | 索引時 RAM ピーク(目安) | ベクトルクォータ・上限 | 永続化パス |
|---|---|---|---|---|---|
| 埋め込み SQLite/単一ファイル | 低(5〜12%)→ 行数抑制 | 8〜16 | 2〜6 GB + モデル | 単一 DB ファイル;最大行数・PRAGMA page_size で cap | ~/Library/Application Support/yourapp/rag/sqlite_vec.db |
| Chroma 永続クライアント | 中;チャンク ID 重複に注意 | 16〜32 | 4〜10 GB + モデル | コレクション単位セグメント;inode・ディスク使用率を監視 | ~/Library/Application Support/yourapp/chroma |
| LanceDB(カラムナ) | 大規模コーパス向けに柔軟 | 24〜48 | 6〜14 GB + モデル | テーブルシャード;バルク upsert 後はコンパクション | ~/Library/Application Support/yourapp/lancedb |
| Qdrant(localhost) | ペイロードフィルタと併用チューニング | 32〜64 | 8〜18 GB(デーモン含む) | 設定で max_collection_size /ディスクウォーターマーク |
Docker ボリュームまたは /usr/local/var/qdrant |
クォータ: 件数+バイトの二段 cap、再索引前に永続ディレをスナップショット。~/Library/Application Support か専用 APFS で rsync ルートを一本化。
export RAG_VECTOR_DIR="$HOME/Library/Application Support/yourapp/vectors"
export CHROMA_TELEMETRY_DISABLED=1
export OMP_NUM_THREADS=8評価とリグレッション
引用付き ゴールデン質問(30〜100)を固定し、変更時は同一マシン級で hit@k・MRR(あれば)・p95 レイテンシ。トークナイザ・モデル版・チャンク値を成果物に残す。
リモート長時間ジョブ受け入れ:
- 事前: 空き容量 ≥ 見積 2×;
df -h・ulimit -nをログ化。 - 決定性: ロック固定・モデル checksum・必要なら
RAG_SEED。 - 再開: 冪等チャンク ID、
RAG_VECTOR_DIRにチェックポイント。 - 計測: 壁時計、行/秒、ピーク RSS(
/usr/bin/time -l等)。 - 合格: ベースライン比デルタ内、敵対クエリ 5 本、tarball+SHA-256 マニフェスト。
運用は OpenClaw 自動化 の依存同期と同様、繰り返し可能に。
FAQ
大バッチは常に速い? スワップで逆効果。{8…48} をスイープして膝を取る。
DB は一つ? dev/prod 分離必須。マルチテナントは永続ルート分割でクォータとバックアップを簡素化。
再索引は? モデル更新は必須。チャンク変更は評価後のみ。ID→ソースが明確なら部分再索引。
Metal/Core ML? プローブで CPU と数値整合を確認してから。ドリフト無確認の高速化は危険。
ANN パラメータ? ef_construct/M もチャンク・バッチと同じマニフェストに記録。
まとめ: overlap・batch・RAM ピーク・永続パスは連動制御。環境変数で固定し、リモート受け入れとリグレ後に本番へ。