Практические замечания: Что делать, если модель встраивания вашего агента скоро перестанет работать?
Пошаговое руководство по практическим рекомендациям: что делать, если модель встраивания вашего агента скоро уйдёт с эксплуатации? — контракты, проверки и готовые блоки кода для команд, использующих эту схему.
Используйте это как переработанную версию идей из статьи «Что, если модель встраивания вашего агента скоро уйдет в прошлое?», ориентированную на операторов: четкие этапы, упорядоченные блоки кода и записи о восстановлении, сохраняющиеся при передаче задач. Этап Обзора работает наилучшим образом, если рассматривать его как измеримую основу. Соберите один идеальный пример работы, один случай сбоя и запись о возврате к предыдущему состоянию перед расширением объема работ. Записывайте временные показатели, а также стоимость токенов или запросов рядом с функциональными результатами. Отображение стоимости на ранних этапах предотвращает неожиданные счета при переходе от демо-версии к общим средам.
Backfill
↓
Validate
↓
Canary
↓
Cut over
↓
Soak
↓
Clean up
Проблема
На этапе «Проблема» необходимо определить входные данные, ответственного за выполнение шага и критерии завершения перед изменением кода. Операторы должны иметь возможность перезапустить шаг с известной точки контроля, не догадываясь о скрытом состоянии. Конфигурацию следует хранить отдельно от кода приложения. Файлы среды, хранилища секретов и флаги функций должны находиться в одном месте, чтобы операторы могли их проверять, не читая весь код. При следующем шаге, представляющем собой код или вызов инструмента, следует предпочитать структурированные выходные данные с проверкой схемы вместо свободного текста.
1. Исторические данные
На этапе 1 «Исторические данные» необходимо определить входные данные, ответственного за выполнение шага и критерии завершения перед изменением кода. Операторы должны иметь возможность перезапустить шаг с известной точки контроля, не догадываясь о скрытом состоянии. Необходимо задокументировать как успешный, так и восстановительный сценарии работы. Повторные попытки, проверки человеком и обработка неработоспособных сообщений являются частью продукта, а не этапом последующей доработки. При следующем шаге, представляющем собой код или вызов инструмента, следует отдавать предпочтение структурированным выводам с проверкой по схеме перед свободным текстовым описанием.
2. Актуальные данные
На этапе обработки данных 2 Live необходимо заранее определить входные данные, ответственного за выполнение шага и критерии завершения перед внесением изменений в код. Операторы должны иметь возможность перезапустить шаг с известной точки контроля, не догадываясь о скрытом состоянии. Лучше использовать небольшие, тестируемые единицы кода вместо обширных скриптов. При сбое шага причина должна быть связана с конкретной функцией, а не с запутанной структурой всего процесса. При следующем шаге, являющемся кодом или вызовом инструмента, предпочтительнее использовать структурированные выходные данные с проверкой соответствия шаблону вместо свободного текста. На этапе обработки данных 2 Live необходимо заранее определить входные данные, ответственного за выполнение шага и критерии завершения перед внесением изменений в код. Операторы должны иметь возможность перезапустить шаг с известной точки контроля, не догадываясь о скрытом состоянии. Рядом с функциональными результатами следует записывать время выполнения, а также стоимость токенов или запросов. Отображение затрат на раннем этапе предотвращает неожиданные счета при переходе от демо-среды к общедоступным средам.
3. Трафик в производстве
При работе над третьим этапом обработки трафика в режиме производства сначала запишите условия контракта: необходимые входные данные, сигнал о успешном выполнении и действия при частичной неудаче. Такой чек-лист помогает сохранять честность при последующих изменениях кода. Храните конфигурацию отдельно от кода приложения. Файлы среды, хранилища секретов и флаги функций должны находиться в одном месте, чтобы операторы могли их проверять, не читая весь код. Храните в кэше стабильные инструкции системы и схемы инструментов. Пересылка одинаковых заголовков — распространенная причина избыточных затрат ресурсов.
Historical data → distributed backfill
Live changes → async dual-write
Production traffic → canary + guardrails
Первое правило проектирования: версионирование эмбеддингов
При работе над этапом «Первое правило проектирования» сначала запишите условия работы: необходимые входные данные, сигнал о успешном выполнении и действия при частичной неудаче. Такой список поможет сохранять честность при последующих изменениях кода. Документируйте одновременно «успешный путь» и путь восстановления. Повторные попытки, проверки человеком и обработка неработоспособных сообщений являются частью продукта, а не элементами последующей доработки. Храните в кэше стабильные инструкции системы и схемы инструментов. Пересылка одинакового преамбула — распространенная причина износа оборудования.
record
├── namespace
├── knowledge-base version
├── embed_version
└── embedding
CREATE TABLE semantic_cache (
id BIGSERIAL,
embed_version TEXT NOT NULL,
namespace TEXT NOT NULL,
query_hash BYTEA NOT NULL,
embedding vector(...) NOT NULL,
response JSONB NOT NULL,
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
last_hit_at TIMESTAMPTZ NOT NULL DEFAULT now(),
hit_count INT NOT NULL DEFAULT 0,
expires_at TIMESTAMPTZ NOT NULL,
PRIMARY KEY (embed_version, id)
) PARTITION BY LIST (embed_version);
CREATE TABLE semantic_cache_v1
PARTITION OF semantic_cache
FOR VALUES IN ('gemini-embedding-001');
CREATE TABLE semantic_cache_v2
PARTITION OF semantic_cache
FOR VALUES IN ('text-embedding-3-large');
semantic_cache
│
┌───────────┴───────────┐
│ │
embed_version=V1 embed_version=V2
│ │
V1 vectors V2 vectors
Этап 0 — Заполнение представления V2
При работе над этапом заполнения данных на фазе 0 сначала опишите контракт: необходимые входные данные, сигнал о успешном выполнении и действия при частичной неудаче. Такой список помогает сохранять честность при последующих изменениях кода. Предпочитайте небольшие, тестируемые единицы кода вместо обширных скриптов. Если какой-то шаг не сработает, причина должна быть связана с конкретной функцией, а не с запутанной цепочкой операций. Храните в кэше стабильные инструкции системы и схемы инструментов. Повторная отправка одинаковых данных — распространённая причина избыточных затрат. При работе над этапом заполнения данных на фазе 0 сначала опишите контракт: необходимые входные данные, сигнал о успешном выполнении и действия при частичной неудаче. Такой список помогает сохранять честность при последующих изменениях кода. Записывайте время выполнения и стоимость токенов или запросов рядом с функциональными результатами. Отслеживание затрат на раннем этапе предотвращает неожиданные счета при переходе от демо-среды к общедоступным средам.
SELECT * FROM semantic_cache;
0.1 Создание раздела V2
Подход «0 1: Создание сцены» работает наилучшим образом, когда его рассматривают как измеримую поверхность. Соберите один пример успешного выполнения, один случай сбоя и запись о возврате к предыдущему состоянию перед расширением объёма работ. Храните конфигурацию вне кода приложения. Файлы среды, хранилища секретов и флаги функций должны находиться в одном месте, чтобы операторы могли их проверять, не читая весь код. Установите лимиты на количество токенов за раунд и сессию. Инструменты типа агентов активно расширяют контекст; строгие ограничения предотвращают появление неожиданных счетов при демонстрациях.
V1 partition
│
│ still serving
▼
V2 partition
│
│ being populated
▼
migration control table
0.2 Разделение корпуса данных на управляемые диапазоны
Подход с разделением на этапы 0 и 2 работает наилучшим образом, когда его рассматривают как измеримую поверхность. Соберите один пример успешного выполнения, один случай сбоя и запись о возврате к предыдущему состоянию перед расширением объема работ. Документируйте одновременно путь успешного выполнения и путь восстановления. Повторные попытки, проверки человеком и обработка неработающих сообщений являются частью продукта, а не элементами последующей доработки. Установите лимиты на количество токенов за один ход и за сессию. Инструменты агентов активно расширяют объем контекста; жесткие ограничения предотвращают появление неожиданных счетов при демонстрациях.
┌─────────────────────────────────────────┐
│ Migration control table │
├──────────────┬─────────────┬────────────┤
│ Range │ Status │ Worker │
├──────────────┼─────────────┼────────────┤
│ 1 - 50K │ complete │ worker-1 │
│ 50K - 100K │ processing │ worker-2 │
│ 100K - 150K │ pending │ worker-3 │
│ 150K - 200K │ pending │ worker-4 │
└──────────────┴─────────────┴────────────┘
SELECT ...
FOR UPDATE SKIP LOCKED;
0.3 Получение данных с пагинацией по набору ключей
Подход 0 3 Fetch with stage работает наилучшим образом, когда его рассматривают как измеримую структуру. Соберите один идеальный пример работы, один случай сбоя и запись о возврате к предыдущему состоянию перед расширением объема работ. Предпочитайте небольшие, тестируемые единицы кода вместо обширных скриптов. При сбое какого-либо шага причина должна быть связана с конкретной функцией, а не с запутанной цепочкой операций. Установите лимиты на количество токенов за один ход и за сессию. Инструменты агентного типа активно расширяют объем контекста; жесткие ограничения помогают избежать неожиданных счетов. Подход 0 3 Fetch with stage работает наилучшим образом, когда его рассматривают как измеримую структуру. Соберите один идеальный пример работы, один случай сбоя и запись о возврате к предыдущему состоянию перед расширением объема работ. Записывайте время выполнения и стоимость токенов или запросов рядом с функциональными результатами. Отслеживание затрат на раннем этапе предотвращает неожиданные счета при переходе от демо-версии к общим средам.
SELECT ...
FROM semantic_cache_v1
WHERE id > :last_id
AND id <= :range_end
ORDER BY id
LIMIT :batch_size;
Migration range
≈ scheduling/checkpoint boundary
Embedding batch
≈ model/provider throughput boundary
0.4 Генерация эмбеддингов с использованием специального пула
На этапе 0.4 Генерация эмбеддингов необходимо заранее определить входные данные, ответственного за выполнение шага и критерии завершения перед внесением изменений в код. Операторы должны иметь возможность перезапустить шаг на основе известной точки контроля, не догадываясь о скрытом состоянии. Конфигурацию следует хранить отдельно от кода приложения. Файлы среды, хранилища секретов и флаги функций должны находиться в одном месте, чтобы операторы могли их проверять, не читая весь код. При следующем шаге, представляющем собой код или вызов инструмента, следует отдавать предпочтение структурированным выводам с проверкой схемы перед текстовыми данными произвольной формы.
Embedding capacity
│
┌──────────────┴──────────────┐
│ │
online traffic migration traffic
│ │
▼ ▼
production path dedicated pool
0.5 Буферизация и регулирование частоты записи
Для буфера и этапа 0.5 необходимо заранее определить входные данные, ответственного за выполнение шага и критерии завершения перед изменением кода. Операторы должны иметь возможность перезапустить шаг с известной точки контроля, не догадываясь о скрытом состоянии. Необходимо одновременно задокументировать успешный сценарий выполнения и сценарий восстановления. Повторные попытки, проверки человеком и обработка неработоспособных сообщений являются частью продукта, а не этапом последующей доработки. При следующем шаге, представляющем собой код или вызов инструмента, следует отдавать предпочтение структурированным выводам с проверкой по схеме перед свободным текстовым описанием.
existing records
│
▼
embedding batches
│
▼
buffer
│
▼
throttled writes
│
▼
V2 partition
0.6 Проверка каждого завершённого диапазона
Для этапа 0 6 необходимо проверять каждый этап, определять входные данные, ответственного за выполнение шага и критерии завершения перед изменением кода. Операторы должны иметь возможность перезапустить шаг с известной точки контроля, не догадываясь о скрытом состоянии. Лучше использовать небольшие, тестируемые единицы вместо обширных скриптов. При сбое шага он должен указывать на конкретную причину, а не на сложную цепочку операций. При следующем шаге, являющемся кодом или вызовом инструмента, предпочтительнее структурированные выводы с проверкой схемы вместо свободного текста. Для этапа 0 6 необходимо проверять каждый этап, определять входные данные, ответственного за выполнение шага и критерии завершения перед изменением кода. Операторы должны иметь возможность перезапустить шаг с известной точки контроля, не догадываясь о скрытом состоянии. Рядом с функциональными результатами следует записывать время выполнения и стоимость токенов или запросов. Отображение затрат на раннем этапе предотвращает неожиданные счета при переходе от демо-среды к общедоступным средам.
write range
│
▼
validate
│
┌──┴────┐
PASS FAIL
│ │
▼ ▼
checkpoint retry
complete │
▼
persistent failure
│
▼
halt + alert
0.7 Создание индексов V2
При работе над этапом 0.7 Создание запишите сначала спецификацию: необходимые входные данные, сигнал о успешном выполнении и действия при частичной неудаче. Такой список помогает избегать ошибок при последующих изменениях кода. Храните конфигурацию отдельно от кода приложения. Файлы среды, хранилища секретов и флаги функций должны находиться в одном месте, чтобы операторы могли их проверять, не читая весь код. Храните в кэше стабильные инструкции системы и схемы инструментов. Повторная отправка одинаковых данных является распространенной причиной ресурсозатрат.
V1
├── existing data
└── existing index
V2
├── migrated data
└── new index
Этап 1 — Проверка V2 перед запуском в производство
При работе над этапом «Подтверждение версии 2», соответствующим первой фазе, сначала запишите условия работы: необходимые входные данные, сигнал о успешном выполнении и действия при частичной неудаче. Такой чек-лист поможет сохранять честность при последующих изменениях кода. Документируйте одновременно успешный и восстановительный сценарии работы. Повторные попытки, проверки со стороны оператора и обработка некорректных сообщений являются частью продукта, а не элементами последующей доработки. Храните в кэше стабильные инструкции системы и схемы инструментов. Пересылка одинаковых заголовков — распространенная причина избыточных затрат ресурсов.
row_count(V1) == row_count(V2)
retrieval_quality(V2) < retrieval_quality(V1)
Golden-set query
│
├──────────────► V1 retrieval
│
└──────────────► V2 retrieval
│
▼
quality comparison
Golden-set evaluation
│
┌───┴───┐
PASS FAIL
│ │
▼ ▼
Canary Stop
tune
Фаза 2 — Тестирование нового пути с использованием канарейок
При работе над этапом Phase 2 Canary сначала запишите условия взаимодействия: необходимые входные данные, сигнал о успешном выполнении и действия при частичной неудаче. Такой список помогает сохранять честность при последующих изменениях кода. Предпочитайте небольшие, тестируемые модули вместо обширных скриптов. Если какой-то шаг не сработает, причина должна быть связана с конкретной функцией, а не с запутанной цепочкой операций. Храните в кэше стабильные инструкции системы и схемы инструментов. Повторная отправка одинаковых данных — распространённая причина избыточных затрат. При работе над этапом Phase 2 Canary сначала запишите условия взаимодействия: необходимые входные данные, сигнал о успешном выполнении и действия при частичной неудаче. Такой список помогает сохранять честность при последующих изменениях кода. Записывайте время выполнения, а также стоимость токенов или запросов рядом с функциональными результатами. Отслеживание затрат на раннем этапе предотвращает неожиданные расходы при переходе с демо-среды в общедоступные среды.
1% → 10% → 50% → 100%
2.1 Путь запроса
На этапе запроса лучший результат достигается, если рассматривать его как измеримую величину. Соберите один идеальный пример обработки запроса, один пример сбоя и запись о возврате к предыдущему состоянию перед расширением объёма работ. Храните конфигурацию вне кода приложения. Файлы среды, хранилища секретов и флаги функций должны находиться в одном месте, чтобы операторы могли их проверять, не читая весь код. Установите лимиты на количество токенов за раунд и за сессию. Инструменты типа агентов активно расширяют контекст; жёсткие ограничения предотвращают появление неожиданных счетов при демонстрации функций.
Incoming query
│
▼
L1 cache
│
┌──┴───┐
HIT MISS
│ │
▼ ▼
return V2 embedding
│
▼
V2 retrieval
│
▼
quality check
┌──┴───┐
strong weak
│ │
▼ ▼
RAG fallback V1
│ │
└──┬────┘
▼
response
Поиск с учётом версии
Этап извлечения с учетом версии работает наилучшим образом, когда его рассматривают как измеримую характеристику. Соберите один идеальный пример обработки, один случай сбоя и записку о возврате к предыдущему состоянию перед расширением объема работ. Документируйте одновременно успешный и восстановительный сценарии работы. Повторные попытки, проверки человеком и обработка неработающих сообщений являются частью продукта, а не этапом последующей доработки. Установите лимиты на количество токенов за один запрос и за сессию. Инструменты агентов активно расширяют объем контекста; жесткие ограничения предотвращают появление неожиданных счетов при демонстрации функций.
namespace
+
knowledge-base version
+
embedding version
namespace = customer-A
kb_version = 42
embed_version = V2
2.2 Регламенты качества
Этап 2 2 Quality Guardrails работает наилучшим образом, когда его рассматривают как измеримую поверхность. Соберите один идеальный пример работы, один случай сбоя и записку о возврате к предыдущему состоянию перед расширением объема работ. Предпочитайте небольшие, тестируемые единицы кода вместо обширных скриптов. Когда какой-то шаг сбивается, причина сбоя должна указывать на конкретный элемент ответственности, а не на запутанную цепочку операций. Установите лимиты на количество токенов за один ход и за сессию. Инструменты агентов активно расширяют объем контекста; жесткие ограничения предотвращают появление неожиданных счетов. Этап 2 2 Quality Guardrails работает наилучшим образом, когда его рассматривают как измеримую поверхность. Соберите один идеальный пример работы, один случай сбоя и записку о возврате к предыдущему состоянию перед расширением объема работ. Записывайте время выполнения и стоимость токенов или запросов рядом с функциональными результатами. Отслеживание затрат на раннем этапе предотвращает неожиданные счета при переходе от демо-версии к общим средам.
Состояние системы
На этапе проверки работоспособности системы необходимо заранее определить входные данные, ответственного за выполнение шага и критерии завершения перед внесением изменений в код. Операторы должны иметь возможность перезапустить шаг, исходя из известной точки контроля, без необходимости угадывания скрытого состояния. Конфигурацию следует хранить отдельно от кода приложения. Файлы среды, хранилища секретов и флаги функций должны находиться в одном месте, чтобы операторы могли их проверять, не читая весь код. При следующем шаге, представляющем собой выполнение кода или вызов инструмента, предпочтительнее использовать структурированные выходные данные с проверкой соответствия шаблону, а не свободный текст.
Качество получения данных
На этапе проверки качества извлечения данных необходимо заранее определить входные данные, ответственного за выполнение шага и критерии завершения перед внесением изменений в код. Операторы должны иметь возможность перезапустить шаг, исходя из известной точки контроля, без необходимости угадывать скрытое состояние. Необходимо документировать как успешный, так и аварийный сценарии работы. Повторные попытки, проверки человеком и обработка неработоспособных сообщений являются частью продукта, а не этапом последующей доработки. При следующем шаге, представляющем собой код или вызов инструмента, следует отдавать предпочтение структурированным выводам с проверкой по схеме перед использованием свободного текста.
Состояние миграции
На этапе проверки состояния миграции необходимо заранее определить входные данные, ответственного за выполнение шага и критерии завершения перед внесением изменений в код. Операторы должны иметь возможность перезапустить шаг с известной точки контроля, не догадываясь о скрытом состоянии. Лучше использовать небольшие, тестируемые единицы кода вместо обширных скриптов. При сбое шага причина должна быть связана с конкретной функцией, а не с запутанной структурой всего процесса. При следующем шаге, представляющем собой код или вызов инструмента, лучше использовать структурированные результаты с проверкой соответствия шаблону вместо свободного текста. На этапе проверки состояния миграции необходимо заранее определить входные данные, ответственного за выполнение шага и критерии завершения перед внесением изменений в код. Операторы должны иметь возможность перезапустить шаг с известной точки контроля, не догадываясь о скрытом состоянии. Рядом с функциональными результатами следует записывать время выполнения и стоимость токенов или запросов. Отображение затрат на раннем этапе помогает избежать неожиданных счетов при переходе от демо-среды к общедоступным средам.
1%
│
▼
guardrail
│ PASS
▼
10%
│
▼
guardrail
│ PASS
▼
50%
│
▼
guardrail
│ PASS
▼
100%
2.3 Откат должен представлять собой изменение конфигурации
При работе над этапом 2.3 «Откат должен» сначала запишите условия работы: необходимые входные данные, сигнал о успешном выполнении и действия при частичной неудаче. Такой чек-лист поможет сохранять честность последующих изменений в коде. Храните конфигурацию отдельно от кода приложения. Файлы среды, хранилища секретов и флаги функций должны находиться в одном месте, чтобы операторы могли их проверять, не читая весь код. Храните в кэше стабильные инструкции системы и схемы инструментов. Пересылка одинаковых данных является распространенной причиной избыточных операций.
stop traffic
restore data
redeploy services
rebuild indexes
hope
active embed_version = V2
│
▼
config change
│
▼
active embed_version = V1
Конкурентные ситуации во время дополнения данных: как насчет реальных обновлений?
При работе над этапом The Race During Backfill сначала запишите условия контракта: необходимые входные данные, сигнал успешного выполнения и действия при частичной неудаче. Такой список поможет сохранять честность при последующих изменениях кода. Документируйте одновременно успешный и восстановительный сценарии работы. Повторные попытки, проверки со стороны оператора и обработка некорректных сообщений являются частью продукта, а не элементами последующей доработки. Храните в кэше стабильные инструкции системы и схемы инструментов. Пересылка одинаковых заголовков — распространенная причина избыточных ресурсов.
10:00 worker reads record A
10:01 record A is updated
10:02 worker writes V2 generated from the older content
application write
│
┌───────┴───────┐
│ │
▼ ▼
V1 write async queue
│
▼
V2 write
Этап 3 — Изменение пути чтения
При работе над этапом 3 «Flip the stage» сначала запишите условия взаимодействия: необходимые входные данные, сигнал о успешном выполнении и действия при частичной неудаче. Такой список помогает сохранять честность при последующих изменениях кода. Предпочитайте небольшие, тестируемые модули вместо обширных скриптов. Если какой-то шаг не сработает, причина должна быть связана с конкретной функцией, а не с запутанной цепочкой операций. Храните в кэше стабильные инструкции системы и схемы инструментов. Повторная отправка одинаковых данных — распространённая причина избыточных затрат. При работе над этапом 3 «Flip the stage» сначала запишите условия взаимодействия: необходимые входные данные, сигнал о успешном выполнении и действия при частичной неудаче. Такой список помогает сохранять честность при последующих изменениях кода. Регистрируйте время выполнения и стоимость токенов или запросов рядом с функциональными результатами. Отслеживание затрат на раннем этапе предотвращает неожиданные счета при переходе от демо-среды к общедоступным.
Before:
reads → V1
After:reads → V2
Этап 4 — Последующая настройка после изменений
Этап замачивания после изменения на этапе 4 работает наилучшим образом, если рассматривать его как измеримую поверхность. Соберите один пример успешной работы, один случай сбоя и записку о возврате к предыдущему состоянию перед расширением объёма работ. Храните конфигурацию вне кода приложения. Файлы среды, хранилища секретов и флаги функций должны находиться в одном месте, чтобы операторы могли их проверять, не читая весь код. Установите лимиты на количество токенов за раунд и сессию. Инструменты агентов активно расширяют контекст; жёсткие ограничения предотвращают появление неожиданных счетов при демонстрациях.
Этап 5 — окончательная проверка и уборка
Этап окончательной верификации на этапе 5 работает наилучшим образом, если рассматривать его как измеримую поверхность. Соберите один идеальный пример работы, один случай сбоя и записку о возврате к предыдущему состоянию перед расширением объема работ. Документируйте одновременно успешный и восстановительный сценарии работы. Повторные попытки, проверки человеком и обработка неработающих сообщений являются частью продукта, а не последующими доработками. Установите лимиты на количество токенов за одну попытку и за сессию. Инструменты агентов активно расширяют объем контекста; жесткие ограничения предотвращают появление неожиданных счетов при демонстрациях.
1. Прекратить двойное запись в версии V1
Этап двойного записи 1 Stop V1 работает наилучшим образом, когда его рассматривают как измеримую поверхность. Соберите один идеальный пример работы, один случай сбоя и запись о возврате к предыдущему состоянию перед расширением объема работ. Предпочитайте небольшие, тестируемые единицы вместо обширных скриптов. Когда какой-то шаг сбивается, причина сбоя должна указывать на конкретного ответственного, а не на запутанную цепочку операций. Установите лимиты на количество токенов за один ход и за сессию. Инструменты агентов активно расширяют объем контекста; строгие ограничения предотвращают появление неожиданных счетов. Этап двойного записи 1 Stop V1 работает наилучшим образом, когда его рассматривают как измеримую поверхность. Соберите один идеальный пример работы, один случай сбоя и запись о возврате к предыдущему состоянию перед расширением объема работ. Записывайте время выполнения и стоимость токенов или запросов рядом с функциональными результатами. Отслеживание затрат на раннем этапе предотвращает неожиданные счета при переходе от демо-версии к общим средам.
2. Проведите окончательную проверку
Для заключительной стадии проверки второго запуска необходимо заранее определить входные данные, ответственного за выполнение шага и критерии завершения перед внесением изменений в код. Операторы должны иметь возможность перезапустить шаг, исходя из известной точки контроля, без необходимости угадывать скрытое состояние. Конфигурацию следует хранить отдельно от кода приложения. Файлы среды, хранилища секретов и флаги функций должны находиться в одном месте, чтобы операторы могли их проверять, не читая весь код. При следующем шаге, представляющем собой код или вызов инструмента, следует предпочитать структурированные выходные данные с проверкой схемы вместо свободного текста.
V2
│
▼
final validation
│
├── FAIL → stop cleanup
│
└── PASS
│
▼
continue cleanup
3. Удалить представление V1
Для этапа 3 «Удаление V1» необходимо заранее определить входные данные, ответственного за выполнение шага и критерии завершения перед изменением кода. Операторы должны иметь возможность перезапустить шаг, исходя из известной точки контроля, без необходимости угадывать скрытое состояние. Необходимо документировать как успешный, так и аварийный сценарии работы. Повторные попытки, проверки человеком и обработка неработоспособных сообщений являются частью продукта, а не элементами последующей доработки. При следующем шаге, представляющем собой код или вызов инструмента, следует отдавать предпочтение структурированным выводам с проверкой по схеме перед свободным текстовым описанием.
Backfill
↓
Validate
↓
Canary
↓
100% V2
↓
Soak
↓
Final validation
↓
Delete V1
Полный жизненный цикл
На этапе «Полный жизненный цикл» необходимо заранее определить входные данные, ответственного за выполнение шага и критерии завершения перед внесением изменений в код. Операторы должны иметь возможность перезапустить шаг с известной точки контроля, не догадываясь о скрытом состоянии. Лучше использовать небольшие, тестируемые единицы кода вместо обширных скриптов. При сбое шага причина должна быть связана с конкретной функцией, а не с запутанной структурой всего процесса. При следующем шаге, представляющем собой код или вызов инструмента, лучше использовать структурированные результаты с проверкой соответствия шаблону вместо свободного текста. На этапе «Полный жизненный цикл» необходимо заранее определить входные данные, ответственного за выполнение шага и критерии завершения перед внесением изменений в код. Операторы должны иметь возможность перезапустить шаг с известной точки контроля, не догадываясь о скрытом состоянии. Рядом с функциональными результатами следует записывать время выполнения и стоимость токенов или запросов. Отображение затрат на раннем этапе помогает избежать неожиданных счетов при переходе от демо-среды к общедоступным средам.
EMBEDDING MIGRATION
│
▼
Create V2 storage
│
▼
Backfill V2
work stealing + retries
│
▼
Range validation
│
▼
Build V2 indexes
│
▼
Golden-set evaluation
│
┌──────┴──────┐
FAIL PASS
│ │
▼ ▼
stop/tune Canary
1% → 10% → 50%
│
▼
Guardrails
│
▼
100% V2
│
▼
Read flip
│
▼
V2 soak
│
▼
Final validation
│
▼
Drop V1
Live production writes
│
▼
V1 write
│
└──── async dual-write → V2
Migration safety
│
┌──────────────┼──────────────┐
▼ ▼ ▼
Data Quality Traffic
safety safety safety
│ │ │
checkpoints golden set canary
retries guardrails fallback
validation evaluation rollback
При работе над этапом «Уроки, которые можно применять в разных ситуациях», сначала запишите условия работы: необходимые входные данные, сигнал успешного выполнения и действия при частичной неудаче. Такой список поможет избежать ошибок при последующих изменениях кода. Храните конфигурацию отдельно от кода приложения. Файлы с настройками, хранилища секретов и флаги функций должны находиться в одном месте, чтобы операторы могли их проверять, не читая весь код. Храните в кэше стабильные инструкции системы и схемы инструментов. Повторная отправка одинаковых данных — частая причина избыточных расходов.
При работе над этапом 1 «Создание версии с встраиванием» сначала запишите контракт: необходимые входные данные, сигнал о успешном выполнении и действия при частичной неудаче. Такой чек-лист поможет сохранять честность при последующих изменениях кода. Документируйте одновременно успешный сценарий работы и сценарий восстановления. Повторные попытки, проверки человеком и обработка неработоспособных сообщений являются частью продукта, а не элементами последующей доработки. Храните в кэше стабильные инструкции системы и схемы инструментов. Пересылка одинакового преамбула — распространенная причина износа ресурсов.
2. Заполнение данных как инженер базы данных
При работе над этапом «Заполнение обратно» сначала запишите условия контракта: необходимые входные данные, сигнал успешного выполнения и действия при частичной неудаче. Такой список контроля помогает сохранять честность при последующих изменениях кода. Предпочитайте небольшие, тестируемые единицы кода вместо обширных скриптов. Когда какой-то шаг терпит неудачу, ошибка должна указывать на конкретную ответственность, а не на запутанную цепочку операций. Храните в кэше стабильные инструкции системы и схемы инструментов. Пересылка одинаковых данных является распространенной причиной избыточных ресурсов.
3. Разделяйте миграцию данных и миграцию трафика
V2 exists
≠
V2 is trusted
≠
V2 is serving production
4. Считайте качество получения данных частью корректности
Data correctness
+
Retrieval quality
+
Production health
5. Сохраняйте старый путь в качестве резерва
6. Сделайте процесс отката скучным
change configuration
change code + redeploy + restore state
7. Удаляйте последнее
Итоги
model identity
+
vector storage
+
traffic routing
Partition
↓
Backfill
↓
Validate
↓
Canary
↓
Cut over
↓
Soak
↓
Clean up