MyVitals извлекает лабораторные значения одним вызовом LLM, затем согласовывает необработанные имена с общим словарем — точное совпадение, нечеткое совпадение, а затем вызов LLM для остатков. Если этот вызов полностью завершится неудачей, конвейер не откажется от загрузки — он ухудшится...
MyVitals извлекает лабораторные значения одним вызовом LLM, затем согласовывает необработанные имена с общим словарем — точное совпадение, нечеткое совпадение, а затем вызов LLM для остатков. Если этот вызов сразу завершается неудачей, конвейер не отклоняет загрузку — он ухудшается: несовпадающие метрики автоматически создают новую запись в словаре вместо поиска правильной. Хороший дизайн сам по себе.
Вот в чем проблема: переменная env, предназначенная для конечной точки OCR, была установлена в переменной, которая вместо этого переходит в завершение чата. Каждый вызов по сопоставлению метрик в течение месяца приводил к ошибке 400 Invalid Model. Каждый. И из-за плавной деградации, описанной выше, каждая загрузка по-прежнему сообщала об успехе.
Почему никто не заметил
Видимый симптом не был ошибкой — это был словарь канонических метрик, медленно фрагментирующийся на почти дубликаты. Ничто в этом не выглядит как ошибка снаружи. Показатель «успех ли загрузок» остался на уровне 100%.
Урок: когда этап предназначен для ухудшения качества, а не громкого сбоя, успех операции, в которую он встроен, ничего не говорит вам о том, работал ли этот этап. Вам нужна метрика для самого этапа.
Что на самом деле зацепило
Не оповещение, не тест — нет интеграционных проводов