Привет, хабр! Хочу поделиться историей о том, как столкнулся с проблемой, возможно знакомой многим разработчикам: необходимость внедрить систему рекомендаций в проект, который все еще работает на старой версии php 7.2

Обновление версии php в legacy-проекте — это часто настоящий квест. То времени нет, то бизнес-фичи надо пилить, то еще какие-то причины. И часто бывает, что обновление версии php в командах откладывается на потом. Так проекты, даже очень большие живут годами на старых версиях php.


Для наших задач подходила база qdrant, но все вменяемые клиенты для php 7.2 отсутствовали. Мир уже давно ушел вперед, а в php сложно найти что-то толковое для работы с современным стеком. Есть несколько клиентов для php, но там версии от 8.1

Вместо того чтобы грустить о недостаточной поддержке php в ai-сообществе, я просто написал свой клиент. И сегодня хочу рассказать о нем.

Что такое векторный поиск и при чем здесь AI?

Если вы не сталкивались с векторным поиском, то представьте себе, что вы смотрите контент в блоге, а на основе смысла статьи вам предлагают похожие статьи.

Как это работает?

  1. Векторизация: текст, изображение или другие данные с помощью нейросетевой модели превращаются в набор чисел - вектор. Это как цифровое представление смысла.

  2. Поиск по близости: Векторы помещаются в многомерное пространство, где семантически близкие объекты находятся рядом. Поиск сводится к нахождению "соседей" для вашего вектора-запроса.

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

С помощью этой связки — моей библиотеки и Qdrant — вы можете добавить в свой "старый" проект такие современные фичи:

  • Умный поиск по документации или товарам, который понимает, что вы имеете в виду, а не просто ищет совпадения слов.

  • Рекомендательная система "похожие товары/контент", которая работает на основе семантического сходства, а не просто просмотренных категорий.

  • Поиск дубликатов — находить почти идентичные статьи, товары или пользовательские запросы.

  • Автоматическая категоризация контента — когда система сама понимает, к каким темам относится текст.

  • Построение полноценного RAG для поддержки.

Откуда брать векторы?

Ключевой момент в этом всём - векторизация. Есть несколько путей:

  • API популярных сервисов, например OpenAI. Качество векторов высокое, но платные запросы.

  • Локальные модели, например nomic-embed-text поставить можно с помощью ollama. Рекомендую мою библиотеку для работы c ollama сервер на php 7.2 и выше

Есть и свои нюансы, с которыми стоит поэкспериментировать. Например, какой именно контент превращать в вектор — весь текст целиком, отдельные абзацы или может быть ключевые фразы? Разные подходы дают разный результат.

Но в целом пайплайн работы выглядит так:

  1. Индексируем данные: Берем весь наш контент (статьи, товары, документы), превращаем его в векторы и сохраняем в Qdrant.

  2. Ищем по запросу: Когда пользователь что-то ищет, мы превращаем его запрос в вектор и ищем самые близкие по смыслу вектора в базе.

Технически это не сложнее работы с обычной базой данных.

Быстрый старт

Установка библиотеки:

composer require tenqz/qdrant

А вот минимальный пример, как это работает:

<?php
require_once 'vendor/autoload.php';

use Tenqz\Qdrant\QdrantClient;
use Tenqz\Qdrant\Transport\Infrastructure\Factory\CurlHttpClientFactory;

// Создаем клиента
$factory = new CurlHttpClientFactory();
$httpClient = $factory->create("localhost", 6333);
$client = new QdrantClient($httpClient);

// Создаем коллекцию
$client->createCollection("articles", 384, "Cosine");

// Добавляем векторы статей
$client->upsertPoints("articles", [
    [
        "id" => 1,
        "vector" => [0.12, 0.34, 0.56, /* ... */], // ваш вектор
        "payload" => [
            "title" => "Векторный поиск для PHP",
            "url" => "/blog/vector-search-php"
        ]
    ]
]);

// Ищем похожие статьи
$results = $client->search(
    "articles", 
    [0.11, 0.35, 0.55, /* ... */], // вектор запроса
    5 // количество похожих записей
);

В реальном проекте размер вектора будет 384, 768 или больше — в зависимости от модели. И конечно, вам нужно где-то получать эти векторы, но как я писал выше — это отдельная, решаемая задача.

А вам приходилось в легаси проекты внедрять AI? Буду рад услышать ваши кейсы и опыт в комментариях!

Ссылки: