Навигация: среда M4 · шлюз и allowlist · таймауты и ретраи · failure summary в CI · FAQ embedding · итог
Смежные материалы: матрица локальных эмбеддингов на Mac, LlamaIndex Workflows и стоимость узла, LiteLLM Proxy за шлюзом OpenClaw, QueryEngine и allowlist. Публично: главная, покупка узла, блог.
GraphRAG на M4: окружение и пороги batch_size community detection
- Смешение стеков: локальные эмбеддинги bge-m3 и облачный text-embedding-3-small в одном parquet ломают размерность и дают ложные community reports — держите один провайдер на прогон индекса.
- Пик на community detection: batch_size по умолчанию рассчитан на сервер с большой RAM; на M4 с 24–32 ГБ unified memory граф сущностей плюс батч отчётов часто даёт OOM_EMBED до того, как сработает таймаут LLM.
- Обход шлюза: прямой httpx к OpenAI из graphrag CLI обходит Bearer, egress и allowlist — любой tool-call и chat completion для извлечения сущностей должны идти через loopback шлюза.
Ориентиры для Mac mini M4 (32 ГБ): GRAPHRAG_EMBED_BATCH=8–16, COMMUNITY_REPORT_BATCH=4–8, отдельный каталог artifacts/ на быстром диске; для 16 ГБ снизьте оба порога вдвое и включите потоковую запись parquet между этапами extract и embed.
openclaw onboard, токен шлюза и egress allowlist
| Слой | Минимальная политика | Стандарт продакшена |
|---|---|---|
| Аутентификация | Bearer из token-file chmod 0600 вне git | ротация токена раз в 30 дней, отдельный токен CI |
| Инструменты шлюза | allowlist: graph_index, graph_query, embed_batch | + schema_id на каждый tool, deny по умолчанию |
| Egress | только loopback шлюза и сокет локальной БД | allowlist доменов провайдера LLM через шлюз, не из Python |
| Node / CLI | Node 22 LTS, openclaw 2026.5.x | openclaw doctor --json в preflight job |
Шаг 1. openclaw onboard на узле, gateway listen 127.0.0.1. Шаг 2. Смонтируйте token-file из панели LlmMac, не копируйте в репозиторий. Шаг 3. В settings.yaml GraphRAG укажите api_base: http://127.0.0.1:<port>/v1 и заголовок Authorization из того же файла. Шаг 4. Запретите произвольный DNS из venv: egress deny-by-default, разрешите только loopback и unix-сокет векторного хранилища.
Индексация и запрос: таймауты, предохранитель batch_size и шаблон ретраев
Шаг 5. Разделите дедлайны: extract entities (45–90 мин на корпус), embed (15–40 мин), community reports (20–60 мин), global search query (30–120 с). Внешний HTTP-таймаут клиента шлюза должен быть на 15–20% больше внутреннего этапа.
Шаг 6. Полуоткрытый breaker: после трёх подряд TIMEOUT или OOM_EMBED на community detection уменьшите COMMUNITY_REPORT_BATCH на один уровень и введите cooldown 120 с; не ретраите SCHEMA_REJECT и OOM без смены batch.
# шаблон ретрая только для транспорта (псевдокод)
for attempt in range(3):
try:
return gateway.invoke(tool, payload, timeout=INDEX_STAGE_SEC)
except TransportError as e:
if attempt == 2: raise
sleep(jitter(2 ** attempt))
# OOM_EMBED / SCHEMA_REJECT -> failure summary, без ретраяFailure summary в PR и CI: воспроизводимый артефакт
Шаг 7. По завершении этапа или при отказе пишите JSONL и компактный failure_summary.json с полями stage, correlation_id, error_class, опционально community_level, batch_size_hint. Без сырых чанков, системных промптов и Bearer.
Шаг 8. В GitHub Actions: actions/upload-artifact для failure_summary и хвоста JSONL; в job summary выведите одну строку hint для ревьюера. Свяжите correlation_id с OpenTelemetry trace, если включён OTel на узле.
Шаг 9. Preflight: openclaw doctor --json и curl -H "Authorization: Bearer …" http://127.0.0.1/health тем же токеном, что у воркера индексации — иначе ночной прогон упадёт до первого чанка.
FAQ: embedding и память на GraphRAG
Вопрос: процесс убит по памяти на embed, граф уже построен — что делать? Ответ: не удаляйте parquet; перезапустите только embed с меньшим GRAPHRAG_EMBED_BATCH, освободите другие модели на узле (Ollama, MLX). Проверьте, что размерность эмбеддинга совпадает с матрицей в статье про bge-m3.
Вопрос: global search медленный при том же шлюзе? Ответ: увеличьте QUERY_TIMEOUT, но не community batch; для fan-out нескольких моделей см. маршрутизацию LiteLLM.
Вопрос: нужен ли GraphRAG для каждой базы? Ответ: только при междокументных связях и community summaries; иначе достаточно локального конвейера Workflows — дешевле по памяти и проще в приёмке.
Ориентиры для цитирования и приёмки узла
- Три обязательных поля failure summary: stage, correlation_id, error_class (TIMEOUT, OOM_EMBED, SCHEMA_REJECT, EGRESS_DENY).
- Два запрета на ретрай: OOM_EMBED без уменьшения batch и SCHEMA_REJECT без смены схемы tool.
- Один эталонный прогон: фиксированный корпус 50–200 МБ текста, те же batch на ноутбуке и на арендованном M4 — сравните wall-clock и пик RSS.
- Четыре проверки перед продом: doctor зелёный, egress закрыт, allowlist инструментов совпадает с кодом, артефакт CI без секретов.
Итог: локальный RAG-контур и аренда узла
GraphRAG на удалённом Mac становится воспроизводимым, когда индексация и запрос идут через OpenClaw с белым списком инструментов, community detection ограничен batch_size и предохранителем, а сбои возвращаются в PR как failure summary. Для соседних решений откройте статьи про локальные эмбеддинги и LiteLLM-маршрутизацию; для долгих ночных прогонов — аренду Mac mini M4 под LLM и тарифы без входа в консоль.
Резюме: M4-тюнинг batch, шлюз с allowlist и egress, раздельные таймауты этапов, компактный JSON для CI и FAQ по OOM закрывают типовой контур GraphRAG для команд знаний.