Практика: эмбеддинги на PHP с помощью трансформеров

Inference вместо обучения. TransformersPHP как инженерный инструмент.

В этой главе мы аккуратно приземлим теорию эмбеддингов на инженерную практику. Без обучения моделей, без GPU-кластеров и без магии. Только inference, готовые трансформеры и PHP как рабочий инструмент.

Наша цель проста и имеет практическую цель: научиться получать векторные представления текстов и использовать их для поиска, сравнения и анализа смысла. Мы будем относиться к трансформерам не как к объекту исследования, а как к инфраструктурному компоненту – примерно так же, как к базе данных или поисковому движку.

Почему inference, а не обучение

Если вы работаете с PHP, почти наверняка большая часть вашей реальности – это веб-приложения, API, сервисы, где важны стабильность, повторяемость и предсказуемость. Обучение трансформеров плохо вписывается в эту картину: оно требует больших датасетов, серьёзных вычислительных ресурсов и отдельной MLOps-инфраструктуры.

Inference, напротив, решает 80% прикладных задач:

  • семантический поиск

  • кластеризация документов

  • поиск похожих записей

  • рекомендации

  • дедупликация контента

  • интеллектуальная навигация

Мы берём уже обученную модель и используем её как функцию:

textvRd\text{text} \rightarrow \mathbf{v} \in \mathbb{R}^d

В этом и заключается инженерный подход.

Что такое эмбеддинг с точки зрения математики

Формально эмбеддинг – это отображение из пространства текстов в евклидово пространство фиксированной размерности:

f:TRdf : T \rightarrow \mathbb{R}^d

Где:

  • T – множество всех возможных текстов

  • d – размерность эмбеддинга (часто 384, 512, 768, 1024)

Ключевой момент здесь не в самой функции ff, а в геометрии получившегося пространства. Семантически близкие тексты отображаются в точки, расположенные близко друг к другу.

На практике мы почти никогда не работаем с координатами напрямую. Нас интересует только расстояние между векторами:

  • косинусное сходство

  • евклидово расстояние

  • иногда скалярное произведение

Косинусное сходство

Самая популярная мера:

cos(a,b)=abab\cos(a, b) = \frac{a \cdot b}{\lVert a \rVert \, \lVert b \rVert}

Она отвечает на вопрос: "насколько одинаково направлены два вектора". Для эмбеддингов это обычно важнее, чем их длина. Подробно мы разбирали эту тему в главе "Расстояния и сходство".

23.1 Векторы косинусного сходства

Трансформер как чёрный ящик

С инженерной точки зрения трансформер – это композиция функций:

Нас интересует только вход и выход. Всё, что внутри – self-attention, positional encoding, multi-head attention – важно концептуально, но не обязательно для практического использования.

Тем не менее полезно иметь интуицию.

23.2 Обзор трансформера

Рассмотрим TransformersPHP как инженерный инструмент

TransformersPHP – это PHP-обёртка вокруг идей и форматов, пришедших из экосистемы Hugging Face. Обычно она используется вместе с ONNX-моделями или через внешние inference-движки.

Вы можете подробнее ознакомиться с этим пакетом на сайте: https://transformers.codewithkyrian.com/arrow-up-right

или на репозитории: https://github.com/CodeWithKyrian/transformers-phparrow-up-right

Важно сразу зафиксировать философию:

  • PHP управляет процессом

  • модель – внешний, предобученный артефакт

  • inference детерминирован

  • никаких градиентов, оптимизаторов и эпох

Именно это делает подход надёжным и воспроизводимым.

Архитектура практического решения

Типичная схема выглядит так:

23.3 Конвейер встраивания (embedding pipeline)

Первый пример: получение эмбеддинга текста

Начнём с минимального примера. Предположим, у нас уже есть ONNX-модель для эмбеддингов, например из семейства sentence-transformers.

Здесь важно несколько моментов:

  • мы не обучаем модель

  • результат всегда одинаков для одного и того же текста

  • размерность вектора фиксирована

Pooling: почему это вообще нужно

Трансформер возвращает эмбеддинг для каждого токена. Но нам нужен один вектор на весь текст.

Самые популярные стратегии:

  • mean pooling – среднее по токенам

  • max pooling – максимум по каждому измерению

  • CLS token – специальный агрегирующий токен

На практике mean pooling чаще всего даёт стабильные результаты.

23.4 Объяснение объединения (pooling_explanation)

Пример: косинусное сходство на PHP

Теперь, когда у нас есть векторы, мы можем их сравнивать.

Использование:

Практический кейс: семантический поиск

Представим, что у нас есть набор статей или событий (например, таймлайн новостей), и мы хотим искать не по словам, а по смыслу.

Алгоритм:

  1. Предварительно вычислить эмбеддинги всех документов

  2. Сохранить их (БД, файл, vector store)

  3. Для запроса пользователя получить его эмбеддинг

  4. Найти ближайшие векторы

С точки зрения PHP это выглядит как обычная бизнес-логика, а не ML-экзотика.

23.5 Семантический поиск

Инженерные замечания

Несколько практических наблюдений, которые обычно приходят только с опытом:

  • Кэшируйте эмбеддинги. Inference хоть и дешевле обучения, но не бесплатен.

  • Нормализуйте векторы заранее, если часто считаете сходство.

  • Размерность важна меньше, чем качество модели.

  • Для большинства задач достаточно готовых sentence-моделей.

Где эмбеддинги особенно хорошо ложатся на PHP

Эмбеддинги неожиданно хорошо сочетаются с PHP-экосистемой:

  • CMS и контент-платформы

  • корпоративные базы знаний

  • поиск по логам и тикетам

  • e-commerce каталоги

  • аналитические панели

PHP здесь выступает не как ML-язык, а как связующее звено между бизнес-логикой и интеллектуальными моделями.

Итог

В этой главе мы посмотрели на эмбеддинги не как на абстрактную ML-концепцию, а как на инженерный инструмент. Трансформеры в режиме inference отлично вписываются в PHP-приложения, если относиться к ним прагматично.

Вы не обучаете модель. Вы используете её.

Именно в этом месте машинное обучение перестаёт быть наукой и становится частью системы.

Last updated