Введение

В сегодняшней цифровой среде, где множество веб-сайтов конкурируют за мимолетное внимание пользователей, необходимость увлекать и удерживать посетителей никогда не была более важной. Поскольку средний пользователь проводит на веб-странице всего 10 секунд, прежде чем перейти дальше, задача создания неизгладимого впечатления становится насущной проблемой. Итак, в чем же секрет поддержания интереса пользователя? Ответ кроется в системах рекомендаций — инновационной технологии, которая потенциально может изменить то, как мы взаимодействуем с онлайн-контентом.

Раскрытие возможностей рекомендательных систем

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

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

Постановка задачи

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

Навигация по решению

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

Стремясь создать эффективную систему рекомендаций, мы определили два важнейших варианта использования, которые определяют наш подход:

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

2. Расплывчатые описания товаров. Когда пользователи вводят расплывчатые описания, например «Предмет одежды + Девушка + Розовый», наша система рекомендаций по-прежнему работает. Выявляя наиболее подходящие продукты на основе описаний, созданных пользователями, мы обеспечиваем персонализированный опыт покупок, даже если намерение пользователя не указано явно.

Дизайн и функциональность

Если углубляться в основные функции нашего приложения, то первым шагом по запросу пользователя является преобразование результатов поиска во встраивания с использованием сложной модели машинного обучения. Внедрение — это, по сути, числовое представление текстовых данных, которое отражает присущие им характеристики в N-мерном пространстве. Такое расположение позволяет точно сопоставлять данные с общими свойствами или принадлежащие к одной и той же категории/классу или отображать схожие значения в сгенерированных внедрениях.

В первом случае использования, когда мы сталкиваемся с точным совпадением названия продукта или когда пользователь нажимает на продукт, мы используем различные параметры запроса, при этом идентификатор продукта служит искомым значением. Это позволяет нам извлечь встраивание искомого элемента из базы данных векторов. Затем аналогичные продукты можно получить, запросив базу данных векторов для получения идентификаторов продуктов на основе ближайших векторов. По сути, выполняются два вызова: один для получения фактического внедрения продукта, а другой — для получения его аналогов.

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

Элементы нашего приложения

  1. Набор данных. Для обучения модели и реализации этого проекта мы использовали marketing_sample_amazon_dataset. В нем было 10 тысяч строк, содержащих сведения о каталоге продуктов и такие функции, как название продукта, идентификатор, бренд, категория. Причиной выбора этого набора данных было разнообразие категорий предлагаемых им продуктов, благодаря чему наше приложение могло четко различать и отображать продукты в n-мерном пространстве.
  2. Модель. Для этого проекта мы использовали предварительно обученную языковую модель на основе преобразователя paraphrase-mpnet-base-v2. Он обучен на разнообразном и обширном наборе данных, состоящем из широкого спектра текстовых источников из Интернета. Таким образом, модель сможет понимать контекст, словесные ассоциации и даже сложные отношения между словами, что делает ее очень эффективной для нашего варианта использования.
  3. База данных векторов: Milvus — это векторная база данных с открытым исходным кодом, предназначенная для эффективного хранения и извлечения многомерных векторов, что делает ее особенно подходящей для приложений в области машинного обучения, компьютерного зрения и обработки естественного языка. Вот несколько конкретных причин использования Milvus:

    а. Поддержка индексирования
    Это относится к организационной структуре, которой следует Milvus при хранении n-мерных векторов. Способ хранения данных важен, поскольку он влияет на общие затраты на запросы и получение данных. Некоторые распространенные методы индексирования, поддерживаемые Milvus, включают: IVF (инвертированный файл), HNSW (иерархический навигационный малый мир), NSG (навигационный распределенный график), RNSG (случайный навигационный распределенный график)

    b. Разделение

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

    c. Открытый исходный код
    Являясь проектом с открытым исходным кодом, Milvus время от времени извлекает выгоду из вклада сообщества и обновлений.

    d. Гибридный поиск
    Здесь говорится о функциях поиска, которые предлагает Milvus. Milvus предоставляет как механизм поиска, включая традиционный поиск (поиск на основе идентификатора продукта в нашем случае), так и расширенную функциональность поиска по сходству (поиск на основе встраивания векторов для поиска других похожих продуктов).

4 . Бэкэнд-приложение:Для серверной части мы предоставили наше решение через вызов API. Таким образом, при локальной автономной настройке запрос сначала попадает на сервер flask, который, в свою очередь, направляет его к конкретному API в зависимости от варианта использования.

@app.route('/search/querystring', methods=['GET'])
def fetch_products_by_query_string():
    if request.method == 'GET':
        text = request.args.get('text')
        embeddings = model.encode(text, batch_size=128)
        productList = searchSimilarProducts(embeddings) 
        return jsonify(productList)

@app.route('/search/productid', methods=['GET'])
def fetch_embeddings():
    if request.method == 'GET':
        productid = request.args.get('text')
        embeddings = fetch_embeddings(productid)
        productList = searchSimilarProducts(embeddings) 
        return jsonify(productList)

def fetch_embeddings(productid):
    collection = Collection("ecommerce_productname")
    res = collection.query(
        expr = "pid in [\""+productid+"\"]",
        offset = 0,
        limit = 1, 
        output_fields = ["title_vector"],
     )
    #sorted_res = sorted(res, key=lambda k: k['title_vector'])
    print(res[0]['title_vector'])
    return res[0]['title_vector']

def searchSimilarProducts(encoded):
    collection = Collection("ecommerce_productname")
    search_params = {
        "metric_type": "L2", 
        "params": {"nprobe": 1024}, "offset": 0, "limit": 5
    }
    #encoded = model.encode(details)
    collection.load()
    results = collection.search(
     data=[encoded], 
     anns_field="title_vector", 
     param=search_params,
     limit=5, 
     expr=None,
     output_fields=['product_name'],
     consistency_level="Strong"
    )
    app.logger.error("Error log info")
    productList=[results[0][0].entity.get('product_name'),results[0][1].entity.get('product_name'),results[0][2].entity.get('product_name'),results[0][3].entity.get('product_name'),results[0][4].entity.get('product_name')]
    return productList

Подводя итоги…

В этом блоге мы попытались изложить наш подход к созданию приложения для электронной коммерции. Есть и другие способы и алгоритмы, и мы оставляем их нашим коллегам-читателям, чтобы они попробовали их опубликовать. Надеюсь, вы научитесь чему-нибудь из этого блога и создадите что-нибудь еще лучше. Заканчиваем с благодарностью за уделенное время и надеждой увидеть вас в ближайшее время!

«С каждым днем ​​становится немного легче… Но делать это нужно каждый день — это самая сложная часть. Но становится легче». ― Бегущий павиан

На простом английском языке

Спасибо, что вы являетесь частью нашего сообщества! Прежде чем уйти: