Mac 上の RAG はモデル選びよりインジェストが本丸。チャンク境界・バッチ・永続パスを一枚のマトリクスにし、インデクサ横に貼る。

オフライン索引オンライン検索 は分離が前提。失敗パターンは埋め込み 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 -hulimit -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_constructM もチャンク・バッチと同じマニフェストに記録。

まとめ: overlap・batch・RAM ピーク・永続パスは連動制御。環境変数で固定し、リモート受け入れとリグレ後に本番へ。