« Faire tourner un RAG (génération augmentée par récupération) sur un Mac Apple Silicon, ce n’est pas seulement choisir le dernier modèle d’embedding à la mode : l’enjeu est l’ingestion stable — frontières de chunks, dimensionnement des batch face à la mémoire unifiée, et l’endroit où les vecteurs persistent réellement sur le disque. » Ce guide est une matrice de décision compacte à coller à côté de votre indexeur.

Nous partons du principe que vous séparez déjà l’indexation hors ligne de la requête en ligne. Les échecs qui font perdre un week-end se répètent : RAM qui explose pendant l’embedding, confusion de chemins après un redémarrage, régression silencieuse quand on change la taille des chunks sans jeu d’évaluation figé. Combinez cette note avec nos articles sur l’automatisation, les LLM et OpenClaw et, pour un playbook pont IDE / santé de service, le guide OpenClaw (2026) sur Mac distant. Parcourez l’accueil pour le contexte produit et la page d’achat lorsque vous voulez un Mac distant dédié plutôt que votre portable.

Scénarios

Code privé et tickets. Vous avez besoin de frontières de sections déterministes (fonctions, titres) plus qu’une fenêtre de tokens unique. Privilégiez un découpage sensible à la structure avec un chevauchement modéré pour que les diffs ne déchiquètent pas la récupération.

PDF et OCR hétérogène. Les fenêtres à taille fixe en caractères gagnent ; le overlap assure contre les lignes de tableaux coupées entre deux chunks. Attendez-vous à une variance de rappel plus forte — prévoyez tôt un banc d’évaluation.

Chat à QPS élevé sur un corpus figé. Réduisez le texte par chunk, resserrez les filtres de métadonnées et reportez le coût du batching sur l’indexeur pour garder une latence de requête plate. Apple Silicon profite souvent de batch moyens et réguliers plutôt que de micro-batch qui sous-remplissent l’accélérateur.

Corpus multilingue ou juridique. Alignez le chunking sur le même tokenizer que votre embedder ; un mélange CJK et latin peut faire varier le nombre effectif de tokens de 30 % ou plus. Si la conformité impose la suppression d’un client, il vous faut des identifiants de chunks et une persistance qui permettent le tombstoning ciblé sans reconstruire tout le graphe HNSW.

Préparation des données

Normalisez les espaces, retirez en-têtes et pieds de page répétés, et stockez chemin source + offset octet ou page dans les métadonnées avant l’embedding. Pour le chevauchement, un point de départ pragmatique sur Mac en 2026 est 10–20 % de la longueur du chunk pour la prose, et 64–128 tokens fixes pour la doc technique lorsque la taille de chunk se situe entre 512 et 1 024 tokens. Augmentez l’overlap quand les réponses se nichent souvent à la jointure de deux chunks ; diminuez-le quand la redondance pollue le reranker.

Choisissez entre des fenêtres aware des phrases (meilleure fluidité, prétraitement plus lent) et des fenêtres à nombre de caractères fixe (débit prévisible). Les pipelines hybrides découpent souvent le Markdown par phrases et les PDF par fenêtre fixe. Quel que soit le choix, journalisez la version du préprocesseur à côté du snapshot vectoriel pour comparer les régressions sans deviner.

Exposez ces paramètres via des variables d’environnement afin que CI et jobs distants restent reproductibles :

export RAG_CHUNK_SIZE=768 export RAG_CHUNK_OVERLAP=96 export RAG_EMBED_BATCH=24 export RAG_MAX_CHARS_PER_CHUNK=3200

Un appel minimal façon CLI (adaptez à votre stack) rend les audits évidents :

python -m app.rag_index \ --chunk-size "${RAG_CHUNK_SIZE}" \ --overlap "${RAG_CHUNK_OVERLAP}" \ --embed-batch "${RAG_EMBED_BATCH}" \ --persist-dir "${RAG_VECTOR_DIR}"

Comparaison des bases vectorielles

Le tableau ci-dessous est une matrice indicative pour des flux local-first sur un Mac à mémoire unifiée 16–64 Go. Les pics RAM sont des ordres de grandeur : ils varient avec la taille de batch, la dimensionnalité des embeddings et le fait de garder ou non les documents bruts en mémoire.

Profil Chevauchement (overlap) Batch d’embedding Pic RAM indexeur (indicatif) Quota / plafonds Chemin de persistance
SQLite embarqué / fichier local Faible (5–12 %) → moins de lignes 8–16 2–6 Go + modèle Fichier DB unique ; plafond par nombre de lignes / taille de page PRAGMA ~/Library/Application Support/yourapp/rag/sqlite_vec.db
Chroma (client persistant) Moyen ; dédoublonnez les IDs de chunks 16–32 4–10 Go + modèle Fichiers segmentés par collection ; surveillez inodes et % disque ~/Library/Application Support/yourapp/chroma
LanceDB (columnar) Souple pour gros corpus 24–48 6–14 Go + modèle Sharding par table ; compaction après gros upsert ~/Library/Application Support/yourapp/lancedb
Qdrant (localhost) Réglez avec filtres de payload 32–64 8–18 Go incl. démon max_collection_size / seuil disque dans la config Volume Docker ou /usr/local/var/qdrant

Discipline de quota : limitez la taille des collections avec un nombre max de documents et des octets stockés max ; faites un snapshot du répertoire de persistance avant toute réindexation destructive. Sur macOS, gardez les données sous ~/Library/Application Support ou un volume APFS dédié pour que Time Machine et les jobs rsync distants aient une racine unique.

export RAG_VECTOR_DIR="$HOME/Library/Application Support/yourapp/vectors" export CHROMA_TELEMETRY_DISABLED=1 export OMP_NUM_THREADS=8

Évaluation et régression

Figez un jeu de questions dorées (30–100 entrées) avec citations sources attendues. Lorsque vous modifiez le chunking ou les embeddings, relancez : hit@k, MRR si vous avez des jugements de pertinence, et latence p95 sur la même classe de machine. Journalisez le hash du tokenizer, la révision du modèle et les paramètres de chunk dans l’artefact d’évaluation.

Checklist d’acceptation pour jobs longs distants (indexation sur Mac loué ou agent CI) :

  • Pré-vol : quota disque ≥ 2× corpus + empreinte vectorielle ; df -h et ulimit -n consignés dans le journal du job.
  • Déterminisme : lockfile de dépendances épinglé ; somme de contrôle du modèle d’embedding vérifiée ; RAG_SEED fixé si votre stack échantillonne.
  • Reprise : IDs de chunks idempotents ; écriture d’un fichier de point de contrôle sous RAG_VECTOR_DIR en cas de crash.
  • Télémétrie : temps réel, lignes insérées/s, pic RSS via /usr/bin/time -l (macOS) ou profiler par échantillonnage.
  • Critères de sortie : métriques d’éval dans le delta convenu par rapport à la baseline ; contrôle manuel de cinq requêtes adverses ; tarball de RAG_VECTOR_DIR avec manifeste SHA-256.

Automatisez la dernière étape avec les mêmes schémas que pour la synchronisation des dépendances dans le volet automatisation OpenClaw — votre indexeur doit être aussi ennuyeux et répétable qu’un miroir nocturne.

FAQ

Un batch plus gros accélère-t-il toujours l’embedding ? Non au-delà du point où la pression sur la mémoire unifiée déclenche le swap. Balayez {8,16,24,32,48} et retenez le coude où le gain de débit s’aplatit.

Une seule base vectorielle pour tout ? Séparez au minimum les collections dev/prod. Pour du SaaS multi-locataire, des racines de persistance distinctes par locataire simplifient quotas et sauvegardes.

À quelle fréquence réindexer ? Toujours lors d’un changement de modèle d’embedding ; lors d’un changement de politique de chunks seulement après qu’une éval montre un bénéfice net. La réindexation partielle bat la reconstruction complète quand les métadonnées mappent proprement chunk → source.

Faut-il forcer Metal ou Core ML pour les embeddings ? Si le runtime le permet, oui — après avoir vérifié la parité bit-à-bit ou quasi sur une centaine de vecteurs de sonde. La dérive numérique silencieuse entre CPU et GPU a déjà brûlé des équipes qui ne mesuraient que le speedup.

Et les paramètres d’index ANN ? Traitez ef_construct, M ou équivalents comme partie de la même matrice : des valeurs plus hautes augmentent RAM et disque à la construction, des valeurs plus basses nuisent au rappel. Capturez ces réglages à côté des paramètres de chunk et de batch dans votre manifeste d’acceptation.

En résumé : chevauchement des chunks, taille de batch, pics mémoire et chemins de persistance sont des leviers couplés. Documentez-les en variables d’environnement, imposez des garde-fous d’acceptation sur les jobs distants et régressez avant de promouvoir un nouvel indexeur vers la production.