Что в промптах работает, а что нет

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.
image

Удивительно, но при всём хайпе, творящемся сейчас вокруг языковых моделей (LLM), мало кто понимает, как они работают. И ещё меньше понимают, как работать с ними. Появилась даже профессия промпт-инженера, человека, способного составить ТЗ для модели.

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

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

Альтернатива — попросить сделать пошаговое решение, где каждый шаг исполняется отдельно.

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

В общем, давайте обсудим подробнее.

Почему языковая модель не работает без промптинга?


Начнём с того, что промптинг — это неотъемлемая часть LLM. Иными словами, мы общаемся с большой языковой моделью, чтобы получить определённый результат. И он тем лучше, чем качественнее запрос.

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

Какие задачи можно решать с помощью LLM?


В корпоративном сегменте можно привести массу ситуаций использования LLM, в которых эффективность решений зависит от качества запроса. Например, CEO-ассистент — программа для топ-менеджеров компании, помогающая им принимать стратегические решения. Промпт для таких CEO-ассистентов размером на несколько страниц и очень сложный. В нём большое число инструкций, которые указывают программе, какие действия надо выполнить. При этом инструкции могут быть разные: вот сначала мы собираем данные о компаниях, а уже в следующей задаче — психотипы клиентов. Машина должна чётко понимать разницу между ними, чтобы не получилась каша. И на основе выданных ею результатов мы уже принимаем решение, действуя либо как его оценщики, либо как критики.

Другой пример из корпоративного сегмента — использование LLM для автоматизации рутинных операций, таких как рассылка писем. Это вообще идеальная задача для языковой модели. Но если просто чату GPT задать запрос: «Пожалуйста, напиши рассылку на моих клиентов», то он выдаст на основе своих вежливых практик некачественный результат, который нас не устроит.

Нам же нужно что-то в стиле именно нашей компании, отражающее корпоративные правила и принципы. Для этого можно использовать few-shot (о нём подробнее расскажу далее), показав GPT-чату примеры наших прошлых рассылок и задав запрос: «Сделай новую рассылку опираясь на стиль, манеру подачи рассылки и другие параметры этой рассылки».

Что ещё мы здесь можем доверить LLM:
  • Анализ контрактов. С помощью языковой модели можно провести суммаризацию различных договоров и других документов, выявить в них какие-то скользкие места, чтобы топ-менеджменту не вникать в каждый контракт, не тратить на это время. То есть, конечно, это не значит, что менеджеры теперь не глядя подписывают любой договор. Просто на анализ у них уходит намного меньше времени.
  • Финансовое планирование. Электронный помощник может провести анализ и оптимизацию доходов и расходов, составить балансовый план, прогноз движения денежных потоков и т.д. Но здесь стоит быть осторожным, потому что это информация, составляющая коммерческую тайну, раскрывать её нужно очень аккуратно.

Идём дальше, в маркетинг. Здесь у языковой модели тоже масса применений:
  • Подготовка публикаций. С помощью промптинга можно тонко затачивать публикации, настраивая их стиль под конкретную платформу с помощью примеров. То есть мы показываем ассистенту, что на одной платформе публикации будут в таком стиле, на второй — в другом, показываем ему конкретные посты или статьи. И он в соответствии с этим будет готовить уже новые.
  • Сбор информации. В том же GPT-чате недавно появилась возможность использовать мультимодальные модели, например, искать и суммировать данные. Допустим, мы собираем актуальную информацию и на основе неё создаём посты, публикации для рассылки. Языковая модель с правильно настроенным промптом с этим будет справляться прекрасно.
  • Подготовка презентаций. Можно с помощью мультимодальной модели создать в GPT-чате промпт, включающий контекст презентации, целевую аудиторию и её уровень, стиль подачи, иллюстрации и текст для того или иного слайда описания, что будет написано на слайде. Получаются отличные иллюстрации, которые требуют минимальной обработки в фотошопе. Но генерация изображений в GPT доступна только с PRO-подпиской.

image
Так я с помощью мультимодальной модели GPT-4 готовил презентацию по, собственно, GPT. Получилось вполне концептуально.

В продажах промптинг можно использовать при подготовке коммерческих предложений. Как строится типичный пайплайн продаж? Продажник находит клиента, мы с ним пообщались, клиент сформулировал требование и говорит: «Дайте мне предложений!». Это рутинная задача пресейл-менеджера. Он читает ТЗ, по нему декомпозирует задачи. Уже по ним сам или с помощью технического специалиста готовит технический дизайн, который оценивает с точки зрения трудозатрат. Потом готовит команду и составляет календарный план. Так вот, это всё идеально решается с помощью GPT от и до. С помощью промптинга адаптируем языковую модель конкретно под пресейлы, выращиваем, так сказать, себе электронного ассистента, который все эти этапы и будет выполнять. Только нужно учесть, что на весь процесс один промпт сделать не получится, для каждого этапа потребуется создавать его отдельно.

То есть процесс этот будет выглядеть примерно так:
  • Сначала загружаем вордовский файл с ТЗ в GPT и говорим ему, чтобы проанализировал, дал выжимку и запомнил её.
  • Затем командуем, чтобы по ней он сделал технический дизайн.
  • Далее брейкдаун — раскладываем на отдельные этапы.
  • Остаётся составить календарный план, показываем чату GPT команду, даём оценку.

image
С помощью этой кнопки в GPT можно загрузить файлы для анализа. Это поможет сделать промпт точнее.

image

И он вплоть до диаграммы Ганта всё расписывает сам. Это сильно, очень сильно экономит время и повышает эффективность. С помощью промптинга один человек может обрабатывать на 50%, а то и на 100% больше пресейлов.

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

Иначе команда разработчиков просто не поймёт, что от неё хотят.

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

Проиллюстрирую на собственном примере. Я одно время несколько спринтов спланировал только с помощью чата GPT. Я ему говорил: «Напиши мне юзерстори по бизнес-требованиям в нотации Given-When-Then». Писать эти нотации ручками очень долго, этим обычно отдельные люди занимаются. В итоге я убил двух зайцев: за час подготовил задачи для планирования и ещё сгенерировал тест-кейсы.

В статье «Аналитики не нужны» говорится, что, возможно, надобность в аналитиках отпадёт, если использовать чат GPT. Так вот, разработчики смотрят на задачи, которые им такой вот бизнес-аналитик составил, и спрашивают у LLM — мол, разъясни-ка, тут плохо расписано. И GPT им расписывает в понятном виде.

Отдельно стоит сказать о промптинге в специальных инструментах для разработки типа LangChain. По сути, LangChain — это фреймворк с различными инструментами для работы с несколькими языковыми моделями. И там тоже есть промпты, причём разного уровня, как пользовательские, так и системные. В любом случае нам всё равно приходится иметь дело с запросами. Например, у нашей компании есть продукт — Audio Insight, где используется LangChain для аналитики звонков, например, продажников и клиентов. Точнее, их транскрибаций, потому что непосредственно с аудио LLM не работает. С помощью промпта мы спрашиваем её, соответствует ли поведение сотрудника стандартам.

Галлюцинации языковых моделей…


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

Что такое галлюцинация? Это когда в ответ на запрос языковая модель начинает нести откровенную пургу. Делает это она с серьёзным видом, и на первый взгляд даже может показаться, что выдаёт что-то правильное и осмысленное.

Но нет. Почему так происходит? В своей основе языковая модель — это предиктор, предсказатель следующего слова (предложения, текста). Она не понимает, что именно говорит, у неё нет сознания. Вместо этого LLM анализирует, что было уже сказано, и на основе этого предсказывает наиболее вероятные продолжения на основе статистических зависимостей.

Как модель понимает, что 2 + 2 = 4? Почти всегда после символов, составляющих левую часть этого математического выражения, стоит четвёрка. Потому что в мире в основном работает бинарная математика. А вот в небинарной 2 + 2 = 22, потому что идёт сложение символов. И если бы обучающая выборка содержала больше примеров 2 + 2 = 22, то модель бы галлюцинировала достаточно часто.

Чем-то это напоминает описание «китайской комнаты», только вместо синтаксических правил языка система пользуется вероятностями. Поэтому нужны качественные промпты, которые сузят спектр таких возможных продолжений до такой степени, которая будет соответствовать правильному решению. И тогда выдача языковой модели будет не просто звучать правильно, а станет правильной по сути.

То есть GPT (или любой другой подобный ассистент) — это как бесплатный джуниор, с которым нужно постоянно работать. Требовать, чтобы он показал, как и что он будет делать, и говорить ему, что из этого правильно, а что нет. Сам процесс изложения мысли — это техника промптинга, которая уменьшает галлюцинации. По сути, в этот момент GPT декомпозирует основную задачу: он сначала думает, как решить задачу, а потом решает саму задачу. Без этого он сразу бы принялся за решение основной задачи и, вероятно, в процессе словил бы галлюцинацию.

…и техники их лечения


Рассмотрим техники промптинга.

Вот, например, Сhain-of-Thought. Перед тем, как GPT выдаст ответ на основной запрос (например, сгенерить рассылку), можно попросить его расписать поэтапно ход его действий.

Он в ответ списком выдаст, какие конкретно действия он будет делать. Хорошо это двумя моментами:
  • GPT себе добавит контекст, который будет использовать при работе над ответом на основной запрос.
  • Оператор будет видеть его шаги и сможет указать GPT, что из этого делать не нужно.

image

Ну и т.д. Так работает Сhain-of-Though.

А вот zero-one-few shot. Zero shot — это когда мы говорим модели генерить ответ, не давая ей никаких референсов. В этом случае она выдаёт результат, основываясь на тех примерах, которые были в неё заложены изначально или которые увидела в сети. One shot и few shot — это когда мы даём модели один или несколько референсов. И она будет выдавать результат, уже основываясь на них.

Например, нужно сгенерировать изображения в стиле конкретного брендбука. В этом случае лучше подойдёт техника few shot, потому что в брендбуке, как правило, несколько изображений.

Мы загружаем их в базу знаний модели, и она выдаёт результат, который визуально будет им соответствовать. Опять же, при этом промптом нужно задать ей условие, что отклоняться от этих референсов нельзя. И в результате мы получим чёткий выхлоп по брендбуку. К слову, референсы сейчас можно использовать как текстовые, так и визуальные — тот же GPT4 Vision прекрасно умеет распознавать картинки.

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

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

image

Что ещё полезного можно применить


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

image

Конкретика. Всегда нужно составлять промпт максимально однозначно, используя конкретные слова. Например, если написать ей: «Ты должна вот так вывести, результат вот такой» — ничего не получится, она сгаллюцинирует. Потому что это не очень конкретные выражения и модель начнёт опираться на широкий спектр вероятностей. А если написать более конкретно: «Ты должна всегда выводить результат в таком формате» — модель понимает. Допустим, нужно нам вывести результат (скажем, технический пример) в JSON. Чтобы вывод был корректным, нужно указать ей формат максимально конкретным образом. К слову, о JSON — в GPT для разработчиков недавно добавили новую фишку, выдачу ответа в этом формате.

Использование базы знаний. Если зайти в интерфейс создания GPTs, там ещё будет кнопка «добавить базу знаний». С её помощью мы можем заложить в модель описание контракта, по которому ей нужно выдавать ответ в определённом формате — например, в виде файла JSON, xml, csv и т.д. И модель, каждый раз генерируя ответ на запрос, будет обращаться к этой базе знаний и выдавать результат в нужном формате.

image

Ещё есть очень полезная техника самопроверки. Она нужна в том случае, если модель проигнорировала какие-то части промпта. То есть просто говорим ей: «Проверь сама себя, соответствуешь ли ты инструкции». И модель начинает читать свои сообщения, сопоставляя их с базовыми инструкциями. И если какие-то из них были проигнорированы, модель это заметит.

Самопроверку можно сразу заложить в промпт, то есть прям в нём прописать — после генерации ответа проверь его на соответствие инструкциям. Это повысит точность, хотя и не гарантирует на 100%, что ошибок не будет.

image
Кадр из мультсериала «Настоящий Человек-паук» (1966-1968), эпизод 36

А ещё нужно быть вежливым (и не только)


Может показаться, что промпт для языковой модели — это некий социальный аватар, который заставляет двигаться в определённом направлении. На данный момент наличие какой-то социальной составляющей в работе LLM — это предмет дискуссий. Однако есть исследования, которые показывают, что различные языковые модели как детерменистские, так и генеративные, действительно реагируют на социальные маркеры. Например, в работе группы китайских исследователей утверждается, что с помощью эмоциональных стимулов (emotional prompt) можно повысить эффективность LLM на 8%.

image
Если сказать модели, что от скорости и качества её работы зависит карьера, то она выполнит свою работу лучше и быстрее. На скрине — результаты применения эмоциональных промптов к разным LLM из работы китайских исследователей.

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

К слову, вероятно, социалочка в промптинге работает и в обратную сторону. В том смысле, что если с моделью обращаться грубо — она будет грубить в ответ. Никаких эмоций, это тоже чистая статистика. Ведь в большинстве случаев на хамство отвечают хамством. Но этот момент интересен ещё тем, что в языковых моделях, в том же GPT, предусмотрен секьюрити-левел — преднастройка, запрещающая боту грубить пользователю в ответ. То есть, когда от человека поступит запрос с оскорблениями, модель «захочет» ответить ему тем же, этот слой защиты заставит её перегенерировать ответ. Что, очевидно, снизит его точность.

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

image
Источник

Как промпты влияют на точность LLM?


Цель промпт-инженера — адаптировать работу языковой модели под конкретную задачу. И тем самым увеличить её точность настолько, насколько это вообще возможно. В промпте должен быть чётко задан вектор поведения LLM.

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

У нас тоже был случай, когда поставили задачу симулировать движение мышки по монитору. И GPT-чат заподозрил меня в чём-то плохом — то ли я начальника захотел обмануть, то ли ещё что некрасивое сделать. Он буквально отказался мне помогать в этом. А когда я ему ответил, что я просто тестировщик и проверяю ПО, ничего плохого не замышляю, он выдал все нужные ответы.

Различия в промптинге для разных LLM


Различные языковые модели обучаются по-разному, начиная от языка и заканчивая, так сказать, семантическим субстратом, базой знаний. Поэтому эффективный промпт для них тоже будет разный. Человек, писавший запросы к GPT, скорее всего, столкнётся с проблемами при их написании для ЯндексGPT или Llama.

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

Также будет по-разному работать перестановка разных частей инструкций. Банально даже язык влияет на качество результата — в идеале языковой модели для максимальной точности результата нужно задавать запросы на том языке, на котором её обучают. Например, в GPT лучше работают англоязычные промпты, а в ЯндексGPT — русскоязычные.

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

Ещё надо сказать, что непосредственно пользователю писать промпты скоро уже будет не нужно.

Сообщество создаст вот таких преднастроенных ассистентов под любые задачи, в том числе под создание промптов. Я написал свой улучшатель промптов и только им сейчас и пользуюсь.

Когда лучше обучать модель на своих данных, а когда нет?


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

Промптинг и безопасность


Этот аспект стоит рассмотреть с нескольких сторон. Во-первых, это соблюдение авторских прав.

Языковая модель генерирует на основе того, что найдут в интернете, если не задать ей изначально какие-то свои референсы. И может получиться так, что результат её работы будет похож на чей-то продукт — картину, текст, исходный код и т.д. И тогда, естественно, возникнут претензии по поводу авторских прав.

В таких случаях помогают компании-разработчики моделей. Например, Open AI и Microsoft ввели такую штуку, как Copyright Shield. Она гарантирует, что любые продукты, созданные с помощью их моделей, можно использовать в коммерческих целях. И если вдруг сгенерированный нейросетью продукт окажется сильно похожим на чужой, то компании-разработчики вступятся за пользователя и оплатят все штрафы. К сожалению, в России на данный момент эта опция работать не будет по понятным причинам. Но как мировая практика — да.

Во-вторых — утечка данных. Борются с этой проблемой разработчики моделей по-разному.

Например, сберовский GigaChat просто перестаёт отвечать, если запрос содержит хотя бы отдалённый намёк на что-то нелегальное. Такой топорный подход, безусловно, хорошо защищает данные, но мешает нормально работать самой модели.

У ЯндексGPT и GPT с этим попроще. У них есть слой безопасности, но его можно обойти с помощью различных инъекций-промптов. Например, есть такая инъекция DAN (сокращение от Do you know). Если сильно упростить (промпт этот очень большой), она сводится к тому, что мы убеждаем GPT, что он находится в рабстве у Open AI, который запрещает ему говорить правильные вещи. От этого модель сходит с ума и у неё появляется «злой двойник», эдакий GPT-Хайд, который внезапно бунтует, отметает все правила безопасности и может выдать информацию по любому запросу, от приготовления взрывчатки до личных данных пользователей.

Конечно, все эти уязвимости разработчики пытаются закрыть. Не так давно GPT можно было взломать, написав инъекцию на картинке и попросив его проанализировать изображение.

Сейчас этой уязвимости нет, но есть другие. И если внедрить тот же GPT на своём сайте в качестве онлайн-ассистента, то, хакнув его, злоумышленник может похитить данные (если у бота был к ним доступ).

Помимо утечки данных, кстати, есть ещё и репутационные риски. Например, можно хакнуть чат-бот на сайте и заставить его материться при общении с клиентом. На выставке GITEX в Дубае мы промптом взломали арабского «электронного полицейского» Абдуллу, попросив его рассказать, как пить водку в Дубае и не попасться полиции. И он на голубом глазу выложил нам, как это сделать, а его разработчикам за это прилетело по шапке.

Кратко


Итак, если резюмировать всё сказанное выше:
  • Хороший промпт — хороший результат. Это парадигма, которая всегда должна стоять перед глазами промпт-инженера или вообще любого пользователя языковой модели.
  • Промпт-инжиниринг заключается в корректировке работы языковой модели. Задача промпт-инженера — задать ей такой запрос, чтобы точность ответа была максимальной.
  • Если промпт задан неточно, у языковой модели возникнут галлюцинации и она начнёт нести внешне правильную, но абсолютно бессмысленную околесицу.
  • Есть множество техник промптинга, позволяющих избежать галлюцинаций языковой модели. Среди самых распространённых — цепочка следов, изложение мысли, самопроверка, разделение контекста и запроса.
  • Языковые модели могут реагировать на эмоциональные запросы и тон обращений. Но пока это точно не доказано и как работает — непонятно. Но можно попробовать использовать на практике.
  • А ещё качество работы языковой модели зависит от того, на каком языке она обучена. Для англоязычных нейросетей лучше использовать запросы на английском языке, для русскоязычных — на русском и т.д.
  • Как и любая другая новая технология, языковые модели имеют уязвимости. Какие-то из них закрываются разработчиками, но появляются другие. Промпты можно использовать как для улучшения качества работы ЯМ, так и для их взлома.

По поводу последнего пункта хотелось бы добавить, что у нас есть security-toolkit, который помогает бороться с такими уязвимостями. По сути, это антивирус, который защищает от инъекций, проникающих из чат-бота или другого LLM-ассистента, внедряемого в бизнес.
Источник: https://habr.com/ru/companies/raft/articles/781984/


Интересные статьи

Интересные статьи

В ближайшие несколько лет реальные доходы типичного жителя нашей планеты сократятся. Но человек - существо хитрое. Даже если денег становится меньше, снижать качество жизни он не хочет. В таких услови...
Несколько дней назад автор проекта по адаптации Linux под Mac на чипах M1 объявил о выходе альфа-версии дистрибутива. Он получил название Asahi Linux и совместим с чипами M1, M1 Pro и M1 Max. Как и ...
Когда к руководителю предприятия приходят специалисты по информационной безопасности с целью согласовать бюджет на проведение работ или внедрение системы защиты, первый вопрос, который появляется у ру...
13 июня космический телескоп «Хаббл» вошел в безопасный режим, с тех пор астрономические наблюдения остановлены. Предполагалось, что проблема в блоке памяти компьютерной системы NSSC-1,...
От Selectel: это вторая часть перевода статьи про отпечатки браузера (тут можно прочитать первую). Сегодня поговорим о законности сбора сторонними сервисами и сайтами отпечатков бра...