В продакшене RAG чаще ломается не «модель плохо отвечает», а невалидные аргументы инструмента, зависший векторный поиск, который тянет весь Pipeline, и нечитаемый для дежурного сбой без стадии и correlation id. Haystack 2.x декомпозирует генерацию, ретривер и инструменты; OpenClaw оставляет единый контур аутентификации и короткие саммари наружу.

Оглавление: узкие места · стек против LiteLLM и LangGraph · установка и шлюз · шаги внедрения · типовые сбои · цифры и инварианты · FAQ

Материал для команд, которые выносят инференс и индексацию на арендованный удалённый Mac с Apple Silicon и собирают RAG на Haystack 2.x Pipeline. Мы не строим центральный маршрут моделей через LiteLLM Proxy с алиасами и RPM-бюджетом: эта статья про компоненты Haystack, изолированный дедлайн Retriever и проверку JSON Schema у инструментов. Если вам не нужен граф состояний LangGraph, не копируйте целиком сценарий с ToolNode, но перенесите идеи узкого токена шлюза; шаблоны ретраев и схемы — в гайде по JSON Schema и повторам. Параметры чанков и квоты векторного хранилища сверьте с матрицей локального RAG, поля трасс — с наблюдаемостью GenAI. Страницы покупки и тарифов открыты без входа в аккаунт, как и публичная документация.

Три узких места до первого инцидента

Инструменты. Если модель отдаёт произвольный JSON в HTTP-обвязку без схемы, вы получите тихие порчи данных или лишние записи в CRM. Таймауты. Один общий лимит на LLM и Retriever смешивает «медленный индекс» с «мёртвым сервисом», маскируя реальную причину. Наблюдаемость. Без имени компонента и request id ночной разбор на удалённом узле превращается в поиск по гигабайтам stderr.

Сопоставление стека: Haystack, LiteLLM, LangGraph

Тема Эта статья (Haystack 2.x) Другие материалы серии
Единица оркестрации Pipeline и Component: явные рёбра между генератором, Retriever, ToolInvoker LiteLLM: единый OpenAI-совместимый proxy; LangGraph: граф и checkpoint
Где режем отказы Дедлайн ретривера, короткое замыкание при невалидной схеме, шаблон ретраев на границе инструмента LiteLLM: RPM/TPM и breaker маршрута; LangGraph: retry_policy и объединённые health-пробы
Общий знаменатель OpenClaw gateway с Bearer, минимальный scope, структурированный failure summary без промпта

Краткая таблица: установка и шлюз

Компонент Рекомендация Замечание по Mac-узлу
Python и Haystack venv или uv, закрепить haystack-ai и зависимости в lock Согласуйте версию torch с Metal и embeddings, избегайте двух стеков в одном venv без нужды
Индекс Отдельный каталог данных; бэкап снапшотов по расписанию Ночная переиндексация на том же диске, что онлайн-запросы, даёт джиттер — разведите тома
OpenClaw Слушать 127.0.0.1, plist launchd, токен из Dashboard Инструментальные HTTP-сервисы Haystack только за loopback; наружу — шлюз с заголовком Authorization

Воспроизводимые шаги внедрения

1) Изоляция и секреты. Создайте системного пользователя для сервиса, корень вроде ~/haystack-edge с подкаталогами config, data, logs; ключи API и строки подключения к векторной БД держите в env-файле с правами 0600, не кладите значения в git.

2) Шлюз и идентификаторы. Поднимите OpenClaw gateway на фиксированном loopback-порту, прокидывайте X-Request-ID вниз к пайплайну и обратно в access-лог, чтобы склеивать инцидент с вызовом инструмента.

3) Pipeline и JSON Schema. Для каждого инструмента опишите контракт draft-07: типы полей, обязательные ключи, ограничения строк. Выполняйте jsonschema.validate до сетевого вызова; при ошибке возвращайте код вроде TOOL_SCHEMA_INVALID и не трогайте внешние системы.

4) Таймаут и breaker ретривера. Задайте retriever_timeout_ms существенно ниже llm_timeout_ms; ведите счётчик последовательных таймаутов и при пороге переводите цепочку в полуоткрытое состояние: редкие пробные запросы, остальное — деградация с явным «контекст недоступен».

5) Шаблон ретраев. Для временных сбоев транспорта используйте экспоненциальный бэкофф с полным джиттером, жёсткий предел попыток и явную проверку идемпотентности side-effect инструментов.

6) Сводка сбоя. На выходе формируйте компактный JSON: стадия, имя компонента, HTTP-статус, подкод провайдера, усечённое сообщение, correlation id; опционально webhook в тот же контур, что и поля GenAI в трассах. Не пишите пользовательский текст запроса и полный completion в алерт.

# Контракт границ: схема до сети, дедлайн ретривера отдельно от LLM # jsonschema.validate(payload, TOOL_SCHEMA) # retriever_deadline_ms меньше llm_deadline_ms # on_breaker: emit {stage, component, code, request_id, snippet_256}

Типовые сбои и быстрая диагностика

  • 401 на границе. Сравните Bearer в запросе к шлюзу и время жизни токена в Dashboard; тот же идентификатор запроса должен появиться в логе Haystack.
  • Всплеск ошибок схемы. Зафиксируйте версию промпта и версию JSON Schema одним релизным тегом; иначе модель переименует поля без обновления контракта.
  • Ложные срабатывания таймаута. Увеличьте дедлайн для тяжёлых тенантов или вынесите прогрев индекса в офлайн-джоб; возвращайте пустой контекст с меткой, чтобы генератор не ссылался на выдуманные документы.
  • Шторм webhook. Поставьте отдельную очередь для пробного трафика после breaker и лимитируйте параллелизм на приёмнике сводок.

Что можно цитировать в runbook

  • Версии схемы инструмента и конфигурации пайплайна храните в одном git-теге — постмортем сводится к одному коммиту.
  • Метрики таймаутов ретривера и LLM ведите раздельными счётчиками, иначе SLA по ответу смешивается с SLA по поиску.
  • Поля failure summary совместимы с семантикой GenAI в OpenTelemetry — проще строить единый дашборд над арендованным узлом.

Краткие ответы

Обязателен ли OpenClaw? Для продакшена с внешними клиентами — да: иначе приходится открывать HTTP инструментов или ключи шире периметра SSH.

Можно ли поставить LiteLLM перед генератором Haystack? Да как поставщика моделей, но не дублируйте два независимых RPM-breaker подряд без явной иерархии — иначе получите ложные отключения маршрута.

Где крутить ночную переиндексацию? На выделенном удалённом Mac с стабильным питанием и диском; ноутбук команды оставьте тонким клиентом.

Публичные страницы без логина: тарифы, покупка, центр помощи, каталог блога.