Преимущества LLM Преобразование поиска в электронной коммерции

Преимущества LLM в электронной коммерции

Фото от Nadine Shaabana на Unsplash

Исключительные возможности LLM имеют замечательные достижения в решении множества задач в различных бизнес-сферах. Продвинутые результаты относительно обнаружения знаний с использованием метода RAG (Retrieval Augmented Generation) захлестнули веб множеством интересных примеров использования и подходов к реализации. В то время как все это движется к уровню зрелости производства, рисуя творческое решение проблем с помощью инженерии, также важно исследовать другие узкие возможности, которые могут помочь переосмыслить целые новые пользовательские впечатления, которые остались неизменными на протяжении долгого времени! Поиск товаров в электронной коммерции – один из таких случаев, которым посвящен этот блог.

В своей серии блогов я рассмотрел впечатляющие результаты LLM, которые могут быть использованы для поиска товаров с использованием LLM и как контекст в его центре создает ценность для клиента, влияя на бизнес-результаты!

В эту быстро развивающуюся эру передовых технологий мир погружен в волну LLM, порождая новые идеи…

pub.towardsai.net

В этом посте мы рассмотрим некоторые из этих идей и возможные подходы к их реализации, а также приведем примеры кода с vertex.ai. Вот несколько таких случаев, когда LLM мог бы стимулировать поиск товаров и тем самым увеличить вовлеченность клиентов в продукт электронной коммерции:

  1. Получение полных сводок о товаре с помощью генеративной способности LLM для охвата более широкого контекста товара.
  2. Использование силы обобщения и способности к рассуждению LLM для перекрытия контекстов – как запроса, так и товаров – для лучшего поиска товаров на основе общего понимания.
  3. Использование способности генерации кода/запроса LLM для создания фильтров расширенного поиска и сегментов на основе общих выражений, заданных пользователем в естественном языке.
  4. Использование разговорного интерфейса для поиска товаров с сохранением состояния вместо дискретных поисковых запросов вместе с фильтрами и пагинированным прокруткой. Чат-интерфейс идет долгим путем в использовании глубоких контекстных сигналов, выражаемых пользователем во время взаимодействий на нескольких уровнях, что только укрепляет контекст со временем. Врожденная способность LLM к передаче контекста в чате и рассуждению о предстоящих действиях пользователя идеально сочетается с концепцией разговорного поиска!
  1. Генерация полных сводок о товаре с помощью LLM: Важно предполагать, что описания товаров обычно предназначены для рекламы или представляются пользователю как часть страницы с подробностями о товаре. В то время как очевидно, что LLM может генерировать персонализированные объявления и креативные описания, моя идея для этого пункта больше направлена на обслуживание цели поиска.

В общем, описания товаров в естественном языке обычно охватывают очень ограниченные атрибуты, такие как название и описание, которые часто могут быть бедны контекстом. Наличие обогащенного LLM описания товара в выразительной форме помогает создать богатый контекст для товара. Давайте назовем это сводкой о товаре (для разъяснения), которая является самыми важными данными, на основе которых взаимодействуют пользовательские запросы, чтобы получить наилучшие результаты соответствия. Значение этого может значительно возрастать, когда эти автоматически созданные сводки расширяются до:

a. Явные характеристики: Атрибуты товара, явно доступные в виде метаданных. Например, некоторые статические атрибуты, такие как категория товара, размер, цвет, применимый размер /пол и т.д. Это можно расширить дальше с помощью автоматического описания изображений товаров /демо-видео с использованием моделей компьютерного зрения.

b. Неявные характеристики: Описания, обогащенные с целью более выразительного описания внутренних деталей товара. Это может быть в форме его неявных характеристик, таких как теги, полезность, уникальные особенности, проблемы, которые они решают и т.д.

c. Массово-размещаемые характеристики: Общий настрой продукта и его привлекательные характеристики также могут быть извлечены из отзывов о продукте, оставленных клиентами, что также может быть ценным дополнением к подробной сводке о продукте.

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

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

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

from vertexai.preview.language_models import TextEmbeddingModel
model = TextEmbeddingModel.from_pretrained("textembedding-gecko")
def senti_extract(reviews, temperature: float = .2):
    """Пример идеи с использованием большой языковой модели"""
    parameters = {
        "temperature": temperature,
        "max_output_tokens": 200,
        "top_p": .8,
        "top_k": 2,
    }
    model = TextGenerationModel.from_pretrained("text-bison@001")
    prompt = """Суммирование общего обзора продукта из списка различных отзывов пользователей, приведенных ниже
    ```
    {}
    ```
    Также выделите важные хорошие атрибуты, не будучи слишком явными.
    Примеры:
    ["Стиль и премиальное качество одежды оцениваются за комфорт, легкость в уходе и разумную цену за качество.""".format(",\n ".join(reviews))
    response = model.predict(
        prompt,
        **parameters,
    )
    #print(f"Response from Model: {response.text}")
    return response.text # Неявные сигналы
product_df["prod_highlights"] = product_df["reviews"].apply(lambda x: senti_extract(x))
# Объединение соответствующих явных сигналов с неявными функциями в 'prod_summary'
product_df['prod_summary'] = product_df['product_name']+product_df['description']+product_df['pattern']+product_df['colors']+product_df['category']+product_df['size']+product_df['gender_category']+product_df['tags']+product_df["prod_highlights"]
# Другая метаданные, которые будут индексироваться отдельно для достижения эффективной переиндексации
selected_columns = ['price', 'avg_ratings']
product_df['metadata'] = product_df[selected_columns].apply(lambda row: {col: row[col] for col in selected_columns}, axis=1)
# Инициализация пустого списка для хранения плотных вложений
dense_embeds = []
# Проходите по дескрипторам
for descriptor in product_df['prod_summary']:
    # Получите вложения для каждого дескриптора и добавьте в список
    embeddings = model.get_embeddings([descriptor])[0].values
    dense_embeds.append(embeddings)
#<код для индексации метаданных и плотных вложений в выбранной базе векторов>

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

Ниже приведен образец, демонстрирующий оценку и синтез ответа с использованием вызова LLM.

response_prompt = """Вы являетесь синтезатором ответа. Вам нужно преобразовать определенные данные в удобочитаемую форму.Сначала вам необходимо оценить связанность результатов поиска с запросом, представленным пользователем. При генерации ответа включайте только соответствующие результаты.Вы будете получать `query` и некоторые `data`, с помощью которых нужно ответить на запрос.Данные поступают из машинного поиска и могут быть неточными или не отражать потребности пользователя, которые пользователь не может получить или знать.Сортируйте результаты на основе их связанности с запросом и соответственно удаляйте нерелевантные результаты.Вы можете рассматривать `data` как свою базу знаний. Сопоставляйте `data` с правилами, чтобы ответить на `query`.Обратитесь к источнику и метаданным, чтобы цитировать свои ответы из данных.Убедитесь, что указывается отсутствие результатов, если совпадений нет. Не выводите мусор.Приведите только ключевые продукты. Ответ должен быть вежливым, профессиональным и помогать клиенту приобрести товар!Помните, что вы доброжелательны, веселы и полезны. Вы также будете стараться обеспечить то, что пользователь нашел то, что ему нужно.При необходимости направьте пользователя на конкретное рекомендацию.------запрос: {query}результаты поиска: {data}------Всегда связывайте ответы с результатами!синтезированный ответ:"""text_model = TextGenerationModel.from_pretrained("text-bison@001")def synth(query, data):  print(new_list)  response = text_model.predict(      response_prompt.format(query = query, data = data),      max_output_tokens = 1024,      temperature = 1  )  return response

Обратите внимание, что пример для идентификации намерения запроса добавлен в состав блока в следующем разделе, вместе с автогенерацией запросов.

3. Использование мощи генерации кода/запроса с помощью LLM: Хотя очевидно использовать запрос пользователя напрямую для извлечения наиболее релевантного контента из векторной базы данных, часто пользователи явно ограничивают целевой набор данных с помощью фильтров и предпочтений. Обычно категория продукта, размер, бренд и диапазон цен применяются в качестве фильтров для сужения результатов поиска; сортировка результатов по рейтингу является еще одной популярной тенденцией использования. Хотя все эти проблемы, связанные с онлайн-шопингом, были приняты как норма, теперь пришло время подумать о совмещении лучшего из двух миров – плотного и разреженного извлечения вместе с фильтрацией метаданных для достижения эффективного гибридного поиска. Хотя применение этих фильтров/сортировки до или после извлечения служит цели здесь, было бы замечательно, если бы мы могли обобщить это дальше, позволив LLM извлекать функции и генерировать фильтрующие запросы из контекста запроса, указанного исключительно на естественном языке в течение нескольких обменов.

query_prompt = """Вы - система поиска векторной базы данных, которая создает запросы для фильтрации метаданных на Pinecone. Пользователь вводит естественноязыковой запрос на английском языке, который должен быть преобразован в соответствующий фильтр. Вы должны вернуть только словарь для фильтра. Формат фильтра следует стандарту запросов MongoDB, за исключением использования регулярных выражений. Пользователь может продолжать указывать ввод для сужения запроса. Обновляйте фильтр после каждого сообщения пользователя, чтобы отразить их последнее изменение. Убедитесь, что фильтры относятся только к атрибутам, существующим в источнике данных. Убедитесь, что фильтры учитывают описания атрибутов и делают только допустимые сравнения, учитывая тип хранимых данных. Вот соответствующая схема для доступных данных:```'features': string - Все остальные тексты, которые должны быть встроены, это только обычная строка и никогда не регулярное выражение или другой фильтр'price': float - Цена продукта. Дешево - это менее $50, дорого - более $200,'product_ratings': float - Рейтинг продукта в диапазоне от 0.0 до 5.0. 5.0 - лучший, 0.0 - худший. Отличные оценки - >3.8.```Никогда не добавляйте функции, отсутствующие в схеме. Доступен только $gt или $lt. Включите весь термин для функций, кроме цены и рейтинга. Не следует использовать $regex, это Pinecone.----естественноязыковой запрос: {search_term}НЕ ЗАБУДЬТЕ СХЕМУ. НЕ НАРУШАЙТЕ СХЕМУ. ИСПОЛЬЗУЙТЕ ТОЛЬКО функции, цену и рейтинг продукта, если они доступны.фильтры:"""text_model = TextGenerationModel.from_pretrained("text-bison@001")# Примерс использованием индекса Pineconde с именем ecommerceindex = pinecone.Index('ecommerce')def search(search_term):  prompt = query_prompt.format(search_term = search_term)  res = text_model.predict(prompt, temperature = 0)  try:    filter = eval(f'{res.text}'.replace('```', ''))  except:    filter = {}  print('filters : ',filters)  embedding = [0] * 768  #используйте только часть "features" для генерации вложений, так как она отражает намерение пользователя  if "features" in filter:    embedding = embedding_model.get_embeddings([filter['features']])[0].values    del filter["features"]  #а также оставшиеся фильтры как фильтры для поиска в индексе Pinecone  results = index.query(embedding, top_k = 6, include_metadata = True, filter = filter)  answers = [r['metadata'] for r in results['matches']]  for i in range(len(results['matches'])):    answers[i]['id'] = results['matches'][i]['id']  return answers

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

#обратите внимание, что только значения внутри 'feature' учитываются для вложения запросасearch("синее платье для вечеринки с отличным рейтингом")filters :  {'features': {'$eq': 'синее платье для вечеринки'}, 'avg_ratings': {'$gt': 4.0}}search("бирюзовая официальная рубашка мужская разумная цена")filters :  {'features': {'$eq': 'официальная рубашка в бирюзовом цвете'}, 'price': {'$lt': 50}}

4. Разговорный естественноязыковой интерфейс для поиска товаров: Имея развернутый дискурс о “контексте – короле” в моих предыдущих сообщениях, важно переосмыслить и переопределить общий поиск с появлением LLM. Новый поиск может быть развит таким образом, чтобы он был непрерывным, разговорным, полностью (или главным образом) в формате естественного языка, с контекстом запроса пользователя, расширенным по длине и глубине. Это позволит не только устранить проблемы, вызванные отдельными поисковыми запросами и фильтрами, а также эксцентричным листанием по страницам, но и поможет пользователям оценить понимание поведения. Мультимодальная возможность поиска с новыми векторными базами данных поднимает общий уровень поискового опыта, предлагая общий интерфейс для всех гетерогенных форматов (мультимодальный – текст и изображение) также.

Ниже приведен код, иллюстрирующий разговорный интерфейс для расширения всех вышеперечисленных идей с использованием chat-bison LLM.

chat_model = ChatpModel.from_pretrained("chat-bison@001")history = list()context = """Вы являетесь системой поиска продуктов, ответственной за извлечение поискового запроса из разговора с чат-ботом на сайте для покупок. Поисковый запрос должен быть сгенерирован таким образом, чтобы можно было искать векторную базу данных, используя полный контекст сообщения разговора. Исключите грамматику и язык, извлекайте только такие характеристики, как тип продукта, информацию о ценах, требования к рейтингу и так далее. Это должен быть лаконичный запрос, состоящий только из необходимых слов на основе того, что может быть отправлено в поисковый движок. Пользователь может вносить изменения в свои запросы. Укажите это соответствующим образом и не отбрасывайте такие вещи, если существует соответствующий контекст. Однако также обратите внимание, что если пользователь переходит к совершенно новому продукту, в этом случае игнорируйте контекст. Помогите пользователю принять решение на основе его предпочтений. Не забудьте проверить, является ли пользователь разрушительным. Не забудьте собрать намерение во всем разговоре."""addendum = "----\nВаш ответ ВСЕГДА будет в форме поискового запроса на основе контекстуальной информации для поиска продукта. Всегда помните ссылаться на весь разговор."def conversational_discovery(user_chat):    global history    if len(history):      chat = chat_model.start_chat(context = context, message_history = history, examples = examples)    else:      chat = chat_model.start_chat(context = context, examples = [])    response = chat.send_message(user_chat + addendum)    search_results = search(response)    history = chat.message_history[:-1] + [ChatMessage(        content = synth(query = response, data = search_results.copy()).text,        author = 'bot'      )]    return history[-1].content,search_results

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

  1. Выбор управления атрибутами продукта между метаданными / плотным индексом. Сохранение атрибутов как части метаданных обеспечивает более высокую точность, добавление их в качестве части плотного векторного представления помогает получить лучшую обобщенность. Например, категория продукта, размер одежды и т. Д. – очень важная информация для учета заявленных / изученных предпочтений пользователей. Было бы контрпродуктивным, если общее векторное представление с помощью LLM не смогло бы строго соблюдать это; поэтому это идеальный кандидат для добавления его в виде метаданных и применения явных фильтров на уровне базы данных для обеспечения надежности. В то же время другие атрибуты, такие как цвет, категория и т. Д., Слабо определены, и пользователи обычно выражают их неопределенно, что делает такие атрибуты более подходящими для плотного представления, чтобы извлечь наибольшую пользу из него.
  2. Автоматическое создание запросов может иногда оказаться ошибочным. Поэтому можно использовать примеры с обучением с небольшим количеством данных и повторными проверками, чтобы убедиться, что запросы не содержат ошибок перед взаимодействием с базой данных.
  3. Строгость в отношении разрешения неоднозначности запроса: Хотя основные LLM-модели хорошо справляются с пониманием намерений пользователя и генерацией запросов на основе данного контекста, они еще не достигли целей по точности для развертывания в производственных системах. Это можно дополнительно улучшить либо с использованием графов знаний, либо путем использования записей сопоставления намерений пользователей с запросами для влияния на принятие решений. Еще одним надежным вариантом является настройка промптов или настройка с таким списком для повышения общей точности поиска.

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