Для конвейера RAG на Apple Silicon критично развести стоимость токенов облачного text-embedding-3-small и предсказуемую задержку локального bge-m3 в графах ONNX и CoreML EP: иначе индекс «плывёт» по качеству, а бюджет — по неожиданным всплескам нагрузки после релиза чанкера.

Оглавление: задержка и деньги · ограничения · матрица стеков · пороги стоимости · скан батча · ключи кэша · отказ и откат · приёмка узла · FAQ

Ниже — практическая матрица для команд, которые уже держат чанки в векторном хранилище и хотят сопоставить OpenAI с локальным M4. Связанные материалы: квоты чанков и эмбеддингов, индексы FAISS и sqlite-vec, мультимодальные эмбеддинги CLIP и SigLIP.

Задержка сети и деньги против локального инференса

Облачный text-embedding-3-small добавляет RTT и очередь провайдера к чистому времени матмулов, зато снимает с вас упаковку модели и совместимость размерности при условии явного выбора целевой D в запросе. Локальный bge-m3 через ONNX Runtime даёт контроль над батчем и профилем потоков, а CoreML Execution Provider может снизить задержку на серии однотипных длин после прогрева, если конвертация графа и версия macOS совпадают с боевым контуре. Сравнивайте не абсолютные миллисекунды в изоляции, а p95 на документ с учётом сериализации, нормализации вектора и записи в индекс.

Три жёстких ограничения до выбора стека

  1. Фиксированная размерность индекса: смешение 1536 из облака и 1024 из bge-m3 без отдельной коллекции ломает метрики поиска и усложняет A/B тесты качества ответа ретривера.
  2. Пик памяти по батчу: на unified memory M4 рост batch_size резко поднимает RSS графа; без сканирования вы останетесь на безопасном, но медленном режиме или получите нестабильные OOM в ночной переиндексации.
  3. Скрытая стоимость ретраев: при деградации API клиенты часто умножают попытки; локальный откат без бюджетного предохранителя так же раздувает CPU и мешает интерактивным сценариям на той же машине.

Матрица: облако против локального графа

Критерий text-embedding-3-small bge-m3 ONNX / CoreML EP
Размерность D Настраиваемая усечённая проекция, типично 1536 или меньше по политике продукта Фиксируется весами экспорта, чаще 1024; проверяйте выходной тензор в Netron
Деньги Переменная стоимость по токенам; растёт с длиной чанка и частотой переиндексации Капекс времени инженеров и амортизация Mac; операционно почти линейно от электричества и аренды узла
Задержка Доминируют сеть и лимиты провайдера; хвосты на стороне клиента Доминируют выбранный EP, потоки ORT и размер батча
Квантизация Не применяется на вашей стороне int8 и смешанная точность уменьшают память; требуют отдельной калибровочной выборки для контроля дрейфа recall
Приватность Данные покидают периметр при каждом вызове Тексты остаются на хосте; важна дисциплина логирования и маскирования

Пороги стоимости и сигналы переключения

Заведите простую модель: помесячно суммируйте миллионы токенов индексации и типичный коэффициент переобновления чанков после правок. Если прогнозируемый счёт облака стабильно превышает амортизированную стоимость выделенного Mac mini M4 плюс часы сопровождения конвертации ONNX, смещайте основной поток на локальный граф с кэшем. Обратный сигнал — редкие пики нагрузки и жёсткие требования к самым свежим весам без команды, готовой пересобирать артефакты: тогда оставьте API основным контуром, а локальный режим используйте для офлайн-песочниц и регрессий качества.

Исполняемое сканирование размера батча

Зафиксируйте версии onnxruntime, список зарегистрированных провайдеров и переменные окружения, влияющие на потоки, затем удваивайте batch_size на репрезентативной смеси длин, пока не упрётесь в плато throughput, рост p95 латентности на элемент или лимит памяти. Отдельно прогоните тот же протокол с включённым CoreML EP и сравните не только среднее, но и разброс на холодном старте после перезагрузки демона индексации.

# Псевдопараметры ORT: зафиксируйте потоки и провайдер перед циклом батча import onnxruntime as ort so = ort.SessionOptions() so.intra_op_num_threads = 8 # под ядра P-кластера M4 so.inter_op_num_threads = 1 providers = [("CoreMLExecutionProvider", {"use_cpu_only": False}), "CPUExecutionProvider"] # Далее: for B in [1,2,4,8,...]: измеряйте RSS и p95 на чанк

Ключи кэша и детерминированный препроцессинг

Ключ должен включать идентификатор модели, строку провайдера вычислений, флаг квантизации, выбранную нормализацию L2, итоговую D и хэш текста после канонизации пробелов и единого правила нижнего регистра, если оно входит в контракт чанкера. Для облака добавьте версию эндпоинта и параметры усечения размерности, чтобы не смешивать ответы разных релизов API в одном индексе. Любое изменение токенизатора или правила склейки полей метаданных объявляйте новой версией кэша с фоновой инвалидацией партициями.

Отказ локального графа и откат к API

Опишите явный конечный автомат: при ошибке загрузки mlmodelc, провале валидации формы входа или превышении бюджета времени на партию переключайтесь на text-embedding-3-small с отдельной очередью и отдельной меткой версии вектора. Не смешивайте в одной транзакции записи разные D; лучше держать параллельную коллекцию «аварийного» индекса с собственным именем и TTL. Логируйте причину отката одной строкой без сырого текста документов.

Чек-лист приёмки удалённого арендованного узла под эталон

Шаг 1. Снимите sysctl hw и версию ОС, сравните с локальной эталонной машиной. Шаг 2. Установите те же колёса Python и хэши артефактов модели. Шаг 3. Прогрейте граф серией фиксированных длин. Шаг 4. Выполните скан батча и сохраните CSV с RSS и p95. Шаг 5. Прогоните тот же корпус через API с лимитом RPM и сравните стоимость по фактическим токенам. Шаг 6. Зафиксируйте политику отката и ключи кэша в репозитории инфраструктуры как код.

FAQ

Нужен ли отдельный узел, если есть мощный MacBook? Да, если вы хотите исключить дросселирование от питания от батареи и фоновых сервисов; арендованный Mac mini M4 даёт повторяемые цифры для согласования с финансами.

Совместимы ли разные квантизации с одним FAISS-индексом? Только после измерения дрейфа расстояний; на практике держите отдельные индексы на каждую комбинацию весов и калибровки.

Как учесть стоимость владения? Делите аренду узла на ожидаемые миллионы эмбеддингов в месяц и сравните с прогнозом счёчика OpenAI по прайсу на дату замера, не забывая про трафик повторной индексации.

Цифры для слайда руководству: типичный Mac mini M4 с достаточной unified memory держит ночной реиндекс средних корпусов при аккуратном batch_size; коммерческий API масштабируется ровно до следующего счёта. Три контрольные метрики: p95 на чанк, пик RSS, доллар за миллион токенов по факту.

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

Итог: сопоставьте text-embedding-3-small и bge-m3 по D, деньгам и хвостам задержки, затем закрепите скан батча, ключи кэша и откат в коде; удалённый эталонный Mac снимет споры о цифрах между командами.