Геометрия ингредиентов: почему векторный поиск слепнет в пищевой химии
Инженер по качеству в стартапе по выпуску растительного молока отправляет запрос во внутреннюю векторную базу: «Найти спецификации поставщиков, подтверждающие, что эмульгатор не содержит производных говяжьего жира».
Векторный движок возвращает ответ за сорок миллисекунд. Первый результат в выдаче с впечатляющим косинусным сходством 0.94:
«Партия №4482: Моно- и диглицериды жирных кислот (E471). Вспомогательное вещество содержит производные говяжьего жира на второй стадии этерификации».
Векторная база посчитала прямо противоположный факт почти идеальным смысловым совпадением. Если бы эта автоматическая проверка попала в итоговое досье для европейского ритейла, производителя ждал бы отзыв всей партии с полок супермаркетов и крупный штраф за фальсификацию состава.
Так проявляется фундаментальное слепое пятно наивного векторного поиска.
Координаты в кухонном шкафу
Чтобы разобраться, почему поисковый движок путает противоположные смыслы, стоит взглянуть на логику работы моделей эмбеддингов.
Модель эмбеддингов похожа на организацию гигантского шкафа со специями не по алфавиту, а по вкусовому профилю. Вместо того чтобы ставить анис рядом с апельсиновой цедрой на букву «А», корицу ставят рядом с мускатным орехом, гвоздикой и кардамоном. Уксус, лимонный сок и яблочная кислота стоят на противоположном конце кухни на полке кислых ингредиентов. У каждой баночки есть свои координаты в пространстве.
Нейросеть читает текст и превращает его в длинный список чисел — вектор. Фраза с описанием овсяного белка превращается в стрелку-координату в 1536-мерном пространстве. Предложения о растительных напитках смотрят примерно в одну сторону. Тексты про дизельные генераторы указывают в совершенно другой угол координатной сетки.
Здесь аналогия дает трещину: на настоящей кухне повар легко отличит миндальный сироп от чистого эфирного масла горького миндаля по запаху. В многомерном пространстве алгоритм измеряет исключительно угол между математическими стрелками. У модели нет обоняния или здравого смысла.
Ловушка отрицания и косинусное сходство
Векторный поиск сопоставляет тексты через косинусное сходство — косинус угла между двумя многомерными векторами:
Cosine Similarity(u, v) = (u · v) / (||u|| × ||v||)
Если два вектора направлены абсолютно одинаково, угол между ними равен нулю, а косинусное сходство составляет 1.0. Если они перпендикулярны, сходство равно 0.0.
Посмотрим, что происходит внутри трансформера при обработке двух фраз:
- Фраза А: «Стабилизатор содержит животные жиры».
- Фраза Б: «Стабилизатор не содержит животных жиров».
Пять слов из шести совпадают по смыслу и корням. Обе фразы активируют абсолютно одинаковые смысловые кластеры: пищевые добавки, липиды, биохимия, сырьевой состав.
Одинокая частица «не» смещает направление вектора лишь на крошечную долю градуса. Слои внимания распределяют смысл по контексту всего предложения, поэтому результирующий вектор для фразы Б ложится вплотную к вектору фразы А. Формула выдает косинусное сходство порядка 0.93–0.94.
Для векторного индекса эти два предложения — ближайшие родственники. Для аудитора V-Label и стандарта ISO 23662:2021 частица «не» определяет всю юридическую границу между сертифицированным веганским продуктом и обманом потребителей.
Числовая черная дыра: 0.05 PPM против 50 PPM
Слепота к отрицаниям — не единственная проблема в сертификации. Модели эмбеддингов одинаково беспомощны перед числовыми порогами и химическими кодами.
Возьмем результаты лабораторного иммуноферментного анализа (ИФА/ELISA) на следы белков молока:
- Фрагмент 1: «Анализ смывной воды выявил 0.05 PPM казеина».
- Фрагмент 2: «Анализ смывной воды выявил 50.0 PPM казеина».
По международным нормативам 0.05 частей на миллион (PPM) находится глубоко в пределах допустимого фона случайного контакта на чистой линии. Концентрация 50.0 PPM означает массивное перекрестное загрязнение с молочной линии, аннулирующее веганский сертификат и требующее маркировки об опасном аллергене.
В векторном пространстве оба фрагмента говорят о смывной воде, лабораторном протоколе, частях на миллион и молочном казеине. Модель эмбеддингов не воспринимает числа как отметки на шкале прибора. Для токенизатора 0.05 и 50.0 — это просто отдельные строковые токены в словаре. Расстояние между ними в векторе никак не отражает их реальную физическую величину.
Та же беда происходит с номерами химических реестров:
- CAS 56-81-5: Глицерин (растительный увлажнитель и растворитель)
- CAS 56-40-6: Глицин (аминокислота, часто получаемая гидролизом животного желатина)
Для векторной модели случайные наборы цифр с дефисами почти лишены семантического контекста. Запросы на конкретные модификации добавок просто проскальзывают мимо.
Размытие при усреднении
Когда документы нарезают на чанки по триста слов, возникает еще одно геометрическое искажение: усреднение векторов.
Если технический паспорт сырья описывает температурные режимы, габариты поддонов, влажность и срок годности, а на четырнадцатой строчке мелким шрифтом упоминается фермент животного происхождения, слой пулинга смешивает все триста слов в одну усредненную точку.
Общие темы параграфа — логистика, упаковка и сроки хранения — заглушают короткое химическое примечание. Критический факт растворяется в геометрическом шуме.
Инженерные барьеры против векторной слепоты
В промышленных системах соответствия нормативам эти ограничения решают отказом от слепого доверия голым векторам:
# Паттерн промышленного RAG: гибридная фильтрация перед генерацией
def query_compliance_store(ingredient_name: str, max_ppm_threshold: float):
# 1. Детерминированный фильтр по метаданным исключает числовую ошибку
strict_filter = {
"allergen_ppm": {"$lte": max_ppm_threshold},
"status": "verified"
}
# 2. Гибридный поиск связывает точные коды добавок со смыслом
results = vector_db.query(
query_text=f"origin and carrier for {ingredient_name}",
filter=strict_filter,
alpha=0.4 # Повышенный вес точных ключевых слов BM25 для E-кодов
)
return results
- Точный лексический поиск (BM25): Плотные семантические векторы связывают в связку с классическим инвертированным индексом BM25. Пока векторы ищут общее смысловое описание растительных масел, BM25 намертво фиксирует точные коды (
E471,E120) и номера CAS. - Извлечение метаданных до векторизации: Лабораторные протоколы прогоняют через регулярные выражения и структурные парсеры до генерации эмбеддингов. Числовые значения PPM, номера партий и даты должны лежать в реляционных столбцах метаданных, а не теряться в координатах.
- Переранжирование кросс-энкодером: Отобрав пятьдесят кандидатов широким поиском, их пропускают через модель Cross-Encoder. Она сопоставляет запрос и текст пословно, мгновенно отлавливая частицы «не», которые смазало косинусное сходство.
Векторы дают машинам интуицию для работы с языком. Но в строгой сертификации интуиция без детерминированных ограничений приводит к дорогостоящим ошибкам.
В Главе 3 мы разберем Ансамбль из пяти моделей эмбеддингов: почему опора на одну модель неизбежно создает слепые зоны и как прогон химических спецификаций через разные модели вскрывает их скрытые перекосы.
Случалось ли вам сталкиваться с тем, что векторный поиск выдавал ровно противоположный результат из-за одного пропущенного отрицания в тексте?