В данной статье рассказываем о нашем новом демо-примере, который мы реализовали для демонстрации потенциала технологии Real AI по работе со смыслом текста.

Это – капча, требующая понимания смысла текста. Чтобы успешно решить капчу необходимо понять полученную фразу и из представленных изображений выбрать указанные во фразе объекты. Наиболее интересной деталью этого сценария является то, что правильный ответ заранее нигде не хранится и Real AI выполняет проверку капчи используя все те же данные, что есть у пользователя.

Далее подробнее о создании демо и его особенностях.

Вступление

В прошлой нашей статье «Real AI семантический анализатор. Онлайн-демо – овощи, фрукты и их свойства» мы рассказали о демо семантического анализатора Real AI, который на базе свойство-ориентированного подхода решал задачу сопоставления объектов и их свойств в тексте. Данное демо мы постепенно развиваем и сейчас система способна разобрать вот такую интересную фразу «Пучки петрушки и упаковка кинзы в большом коричневом ящике под полкой с коробками с арбузами».

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

Разрабатываемый нами продукт по выявлению поручений из распорядительных документов в открытый доступ мы пока выложить не можем, а значит необходимо было сделать еще одно демо, решающее практическую задачу с использованием ядра Real AI.

О новом демо сценарии

Для начала мы определили ряд критериев, которым должен был соответствовать новый сценарий, - вот основные из них:

  • применимость для решения реальных задач;

  • сложность для повторения существующими методами;

  • желательно графическое визуальное представление;

  • легкость интеграции с существующим ядром Real AI. 

Под данные критерии, после мозгового штурма всей командой, подошли три претендента:  

  1. Инструмент нахождения ответов пользователей на вопросы в заранее распознанном тексте большого объема.

  2. Система, позволяющая сопоставлять документы на уровне смысла и выявлять противоречия.

  3. Капча, требующая понимания смысла обрабатываемой информации.

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

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

Главными плюсами данного сценария было то, что можно было использовать понятия предметной области, которые уже внесены в базу знаний Real AI. Кроме того доработка ядра Real AI требовалась только в части вывода результатов семантического анализа. Если для первого демо результатом была семантическая сеть, то для нового демо – перечень объектов и их свойств.

Концепт капчи виделся так:

Концепт капчи
Концепт капчи

Подготовка

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

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

Тогда вероятность угадывания 1 элемента будет равен (1/25)×(1!), двух элементов – (1/25)×(1/24)×(2!), трех -  (1/25)×(1/24)×(1/23)×(3!). Ниже приведен логарифмический график
процентов возможного угадывания последовательности элементов на матрице 5х5 при
количестве элементов от 1 до 24.

На оси Х приведено количество элементов, а на оси Y – вероятность случайного угадывания, в процентах.

Вероятность случайного подбора капчи
Вероятность случайного подбора капчи

На графике видно, что вероятность угадывания начинает возрастать, когда количество элементов становится больше 12, ведь вероятность угадать 1 элемент из 25 такая же, как и вероятность НЕ угадать 1 из 25.

Исходя из графика для демо мы остановились на диапазоне от 2 до 8 объектов, посчитав  шансы случайного угадывания менее 0,33% что вполне приемлемо для защиты от перебора.

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

Для более разнообразного построения фраз из текущей базы знаний выбрали две категории – овощи, фрукты, для каждой выбрали слова разного рода (для использования анафорических ссылок).

Объекты отрисовали в векторе и получились вот такие Морковь, Свекла, Банан и Яблоко.

Векторные изображения объектов
Векторные изображения объектов

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

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

Реализация

Реализованный интерфейс
Реализованный интерфейс

Итог реализации демо приведен выше на картинке.  Укрупненно, алгоритм работы капчи состоит из следующих шагов:

  1. На стороне сервера генерируется матрица элементов и фраза с описанием двух типов объектов.

  2. Направление фразы и матрицы объектов пользователю.

  3. Пользователь выбирает подходящие элементы и нажимает «Проверить». Передача массива выбранных объектов на сервер.

  4. Фраза передается Real AI Server для анализа.

  5. Возвращение результата смыслового анализа в виде выявленных объектов и их свойств.

  6. На стороне сервера сопоставляется количество выбранных пользователем объектов и тех, которые были извлечены из фразы Real AI.

  7. Возврат результата сопоставления пользователю.

Взаимодействие компонент
Взаимодействие компонент

Как мы писали в начале – наиболее интересной, на наш взгляд, в данном демо является возможность решить капчу силами самого Real AI. При нажатии «Решить с помощью Real AI» на сервер передается не только сама фраза, но и матрица элементов, в которой, после извлечения смыслового содержания из фразы, и выбираются нужные объекты.

Корректность того, как разбирается та или иная фраза, можно проверить нажав «Построить модель в Real AI». Для примера выше схема будет выглядеть следующим образом:

Семантическая модель фразы, построенная Real AI
Семантическая модель фразы, построенная Real AI

Заключение

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

Хочется обратить внимание, что данное демо не решает задачу распознавания изображений и данные о том, какой объект хранится в ячейке, заданы в открытом виде в теге <svg> в атрибуте elemdata, например для красного большого яблока elemdata= «A*l*R».

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

К особенностям данного демо можно отнести следующее:

  1. Ответ на капчу ни в каком виде заранее не сохраняется. Решение происходит непосредственно в момент получения фразы.

  2. Объяснимость результатов. Можно проверить корректность понимания фраз.

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

Попробовать в работе демо смысловой капчи можно по ссылке - https://real-ai.ru/demo_cap/

Комментарии (20)


  1. fire64
    14.06.2023 12:16
    +1

    Эх, чем дальше тем сложнее...

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

    Мне как конечному пользователю, куда приятнее и проще по светофорам кликать. Я уж молчу о том, что ваша капча не дружественна людям с проблемами зрения, например дальтоникам и просто тем, кто плохо видит.


  1. farafonoff
    14.06.2023 12:16
    +1

    Сдается мне, что решить вашу капчу будет еще проще чем обычную (вы сами ее и решаете). Естественный текст можно постараться разобрать при помощи chatgpt (хотя это и не просто)

    basing just on information "Three carrots and two small apples. The fruit is red. Vegetables are medium and green.", and knowing that apple is fruit and carrot is vegetable, please represent this information as json object, with keys "apple" and "carrot"

    ChatGPT

    Here's the given information represented as a JSON object:

    {
    "apple": {
    "quantity": 2,
    "size": "small",
    "color": "red"
    },
    "carrot": {
    "quantity": 3,
    "size": "medium",
    "color": "green"
    }
    }
    

    In this representation, each key ("apple" and "carrot") corresponds to an object that contains properties describing the quantity, size, and color of the respective fruit or vegetable.


    1. Eugenenen
      14.06.2023 12:16

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

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

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


      1. farafonoff
        14.06.2023 12:16

        я просто перевел фразу через deepl. Стоит учитывать, что у людей тоже есть такой баг (какого цвета корова - белая). Можете для примера привести фразу с которой у ChatGPT действительно есть проблемы?


        1. Eugenenen
          14.06.2023 12:16

          Ошибки были выявлены при попытке обработать, например, фразу "Банана 4. 2 свеклы. Фрукты зеленые крупные, овощи фиолетовые средние. Какого размера бананы?" - в ней 4 понималось как классификация размера или фразу "Две груши, одно яблоко, один банан. Оно зеленое. Он желтый. Какого цвета яблоко?" - цвет яблоку присваивался "красный".

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

          Кстати, касательно переводов - они тоже не идеальны и, например, фраза "Яблоко зеленое. Банан красный. Оно спелое" будет переведена и гуглом и deepl как "The apple is green. The banana is red. It's ripe.", что на английском является ошибочным, так как яблоко в англ. языке мужского рода, банан - женского. А свойство "спелый" присваивается какому-то отсутствующему слову среднего рода


          1. farafonoff
            14.06.2023 12:16

            считай что банан это фрукт, а свекла это овощ. Банана 4. 2 свеклы. Фрукты зеленые крупные, овощи фиолетовые средние. Какого размера бананы?

            ChatGPT

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

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

            Фраза "Яблоко зеленое. Банан красный. Оно спелое" безграмотная, местоимение относится к последнему существительному. Тем не менее - немного gpt-мудрости:

            Если рассматривать фразу "Яблоко зеленое. Банан красный. Оно спелое" с точки зрения грамматического рода, наиболее вероятно, что "Оно" относится к яблоку. Поскольку слово "яблоко" является среднего рода в русском языке, то при использовании местоимения "оно" подразумевается ссылка на средний род. Таким образом, можно предположить, что "Оно" в данном случае указывает на яблоко и утверждает, что яблоко спелое.


            1. Eugenenen
              14.06.2023 12:16

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

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

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


              1. farafonoff
                14.06.2023 12:16

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


                1. Eugenenen
                  14.06.2023 12:16

                  Да, демо капчи работает с конструкциями, которые содержат объекты, цвет, размер и количество. Однако само ядро системы - Real AI Семантический Анализатор куда как более гибкое. Например сейчас можно разобрать такие фразы - Мой пакет больших круглых вкусных коричневых спелых грецких орехов и 100 ее пакетов картошки или Корзины с овощами и фруктами на втором стеллаже под полкой с грушами "Конференция"

                  Демо Real AI Семантический Анализатор мы регулярно обновляем и в следующее обновление планируем внести действия, обозначенные глаголами.


                  1. Sanek22 Автор
                    14.06.2023 12:16

                    И не только глаголами - например, "лежание яблок на столе"????


  1. webhamster
    14.06.2023 12:16
    +1

    Я так и не понял, что пользователь должен делать в этой капче. Как ее проходить?

    PS: Я не ChatGPT.


  1. WNeZRoS
    14.06.2023 12:16
    +3

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

    Код для консоли браузера
    var colors = {
      'красн': 'R',
      'фиолет': 'P',
      'желт': 'Y',
      'зелен': 'G'
    };
    
    var sizes = {
      'средн': 'm',
      'крупн': 'l',
      'мален': 's'
    };
    
    var numbers = {
      'одна': 1,
      'один': 1,
      'одно': 1,
      'два': 2,
      'две': 2,
      'три': 3,
      'четыре': 4,
      'пять': 5,
      'шесть': 6
    };
    
    var targets = [
      { 'key': 'S', 'text': 'свек', 'kind': 'овощ', 'count': 0, 'size': '', 'color': '' },
      { 'key': 'A', 'text': 'ябло', 'kind': 'фрукт', 'count': 0, 'size': '', 'color': '' },
      { 'key': 'B', 'text': 'банан', 'kind': 'фрукт', 'count': 0, 'size': '', 'color': '' },
      { 'key': 'M', 'text': 'морк', 'kind': 'овощ', 'count': 0, 'size': '', 'color': '' }
    ];
    
    var captchaText = document.getElementById('TextMsg').innerText;
    var phrases = captchaText.split(/[\.,]/);
    
    var lastTargets = undefined;
    for (var phraseIndex in phrases) {
      var words = phrases[phraseIndex].toLowerCase().split(' ');
    
      var phraseTargets = words.find((word) => word == 'их' || word == 'он' || word == 'она' || word == 'они') !== undefined 
        ? lastTargets 
        : targets.filter((target) => {
          return words.find((word) => { return word.indexOf(target.text) == 0; }) !== undefined ||
               words.find((word) => { return word.indexOf(target.kind) == 0; }) !== undefined;
        });
      
      for(var wordIndex in words) {
        var word = words[wordIndex];
        var num = parseInt(word);
        if (!isNaN(num)) {
          phraseTargets.forEach((target) => target.count = num);
          continue;
        }
        
        num = numbers[word];
        if (num !== undefined) {
          phraseTargets.forEach((target) => target.count = num);
          continue;
        }
        
        for (var color in colors) {
          if (word.indexOf(color) == 0)
            phraseTargets.forEach((target) => target.color = colors[color]);
        }
        
        for (var size in sizes) {
          if (word.indexOf(size) == 0) {
            phraseTargets.forEach((target) => target.size = sizes[size]);
          }
        }
      }
      
      lastTargets = phraseTargets;
    }
    
    var targetElements = {};
    targets.filter((target) => target.count > 0).forEach((target) => {
      targetElements[target.key + '*' + target.size + '*' + target.color] = target.count;
    });
    
    var table = document.getElementById('mainCapDiv').children[1].children[0];
    var cells = table.getElementsByTagName('td');
    for (var i = 0; i < cells.length; i++) {
      var cell = cells[i];
      var elemdata = cell.children[0].getAttribute('elemdata');
      if (targetElements[elemdata] > 0) {
        cell.style = 'border-color: red';
        targetElements[elemdata] = targetElements[elemdata] - 1;
      } else {
        cell.style = 'border-color: white';
      }
    }
    


    1. Sanek22 Автор
      14.06.2023 12:16

      Здорово, что вы сразу код приводите, но непонятно, как ваш код местоименные ссылки обрабатывает и пропуски слов.


      1. WNeZRoS
        14.06.2023 12:16

        Местоименные ссылки, во всех случаях что я видел ,ссылаются на предыдущую фразу, она просто сохраняется. Про пропуски слов не понял.
        Этот код разгадал подряд примерно 15 каптч.


        1. Sanek22 Автор
          14.06.2023 12:16

          Фразы с подобными ссылками ("Красная свекла и желтый банан. Она большая.") как этот код разберет? Пропуски - это фразы типа "большие красные и маленькие зеленые груши" (по смыслу пропущены "груши" после "большие красные").

          Это просто демо, и как уже упоминалось в статье, можно усложнять схему присвоения свойств используя разные формы ссылок.


  1. webhamster
    14.06.2023 12:16
    +1

    Я два раза прочитал статью.

    Я посмотрел примеры капчи:

    Я не понял, что нужно ответить на вопросы "Зеленая клубника и банан. Клубник 6. Бананов 2. Они красные" и "Морковь 1. 4 яблока. Фрукты красные средние, овощ желтый маленький".

    Что в этой капче надо делать? Почему в статье об этом не написано?


    1. Eugenenen
      14.06.2023 12:16

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


  1. Hardcoin
    14.06.2023 12:16

    Весело, но бессмысленно. Прошли времена семантических анализаторов.

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


    1. Sanek22 Автор
      14.06.2023 12:16

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

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


    1. Sanek22 Автор
      14.06.2023 12:16

      А на счёт семантических анализаторов не соглашусь. На мой взгляд, перспективно не текущее состояние, когда есть ВХОД-LLM-ВЫХОД, а когда LLM используется в интерфейсной части, а внутри строится некая графовая модель.

      То есть: ВХОД-LLM-Модель-LLM-ВЫХОД