← Назад в блог

Геометрия ингредиентов: почему векторный поиск слепнет в пищевой химии

10 октября 2026 г. · 5 мин чтения
Геометрия ингредиентов: почему векторный поиск слепнет в пищевой химии - Как эмбеддинги превращают химию в геометрию и почему векторный поиск путает «содержит животные жиры» и «не содержит». Ловушки косинусного сходства.

Инженер по качеству в стартапе по выпуску растительного молока отправляет запрос во внутреннюю векторную базу: «Найти спецификации поставщиков, подтверждающие, что эмульгатор не содержит производных говяжьего жира».

Векторный движок возвращает ответ за сорок миллисекунд. Первый результат в выдаче с впечатляющим косинусным сходством 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
  1. Точный лексический поиск (BM25): Плотные семантические векторы связывают в связку с классическим инвертированным индексом BM25. Пока векторы ищут общее смысловое описание растительных масел, BM25 намертво фиксирует точные коды (E471, E120) и номера CAS.
  2. Извлечение метаданных до векторизации: Лабораторные протоколы прогоняют через регулярные выражения и структурные парсеры до генерации эмбеддингов. Числовые значения PPM, номера партий и даты должны лежать в реляционных столбцах метаданных, а не теряться в координатах.
  3. Переранжирование кросс-энкодером: Отобрав пятьдесят кандидатов широким поиском, их пропускают через модель Cross-Encoder. Она сопоставляет запрос и текст пословно, мгновенно отлавливая частицы «не», которые смазало косинусное сходство.

Векторы дают машинам интуицию для работы с языком. Но в строгой сертификации интуиция без детерминированных ограничений приводит к дорогостоящим ошибкам.

В Главе 3 мы разберем Ансамбль из пяти моделей эмбеддингов: почему опора на одну модель неизбежно создает слепые зоны и как прогон химических спецификаций через разные модели вскрывает их скрытые перекосы.


Случалось ли вам сталкиваться с тем, что векторный поиск выдавал ровно противоположный результат из-за одного пропущенного отрицания в тексте?

Есть проект на прицеле?

Давайте обсудим, как мы можем помочь.

Есть идея проекта? →