Об этом в начале декабря прошлого года нам сообщила компания DeepMind.

При первом рассмотрении достижение очень впечатляет. Особенно если посмотреть на примеры задач, с которым справился искусственный интеллект. Также поражает, что в сравнении с людьми, решавшими те же задачи, он вошел в top 54%.

При втором рассмотрении достижение по-прежнему впечатляет, но уже без вау-эффекта. Почему?

Есть нюансы.

Исходя из своего опыта соревновательного программирования, могу сказать следующее:

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

  2. соревновательное программирование, по большей части, построено на шаблонах решений, которых ограниченное количество. Особенно это относится, опять же, к простым задачам, для решения которых достаточно применить один простой шаблон. Видимо, модель научилась распознавать этот шаблон по условию задачи (как я уже сказал в предыдущем пункте, один и тот же шаблон "упаковывается" во множество разных оберток). По крайне мере, это было бы ожидаемо. Если решение шаблонное, то и разные формулировки задачи тоже должны, в итоге, следовать общему шаблону. Люди к соревновательным задачам - да и вообще к любым - чаще всего подходят так же: пытаются узнать в незнакомой формулировке уже знакомую задачу. Наиболее сложные задачи могут требовать креативных новых подходов либо комбинирования нескольких довольно сложных шаблонов. Но это топ-уровень. Туда искусственный интеллект (пока?) не пришёл

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

  4. по-хорошему, в "реальном мире" (то есть для задач, которые возникли в боевых условиях и не были заранее подготовлены для соревновательных целей) решить задачу - это не просто написать программу, но ещё и показать, что она действительно решает задачу. В частности, задача, которая приводится в блоге DeepMind в качестве примера, имеет тривиальное решение, но! Обоснование этого решения требует одного нетривиального логического хода. Необходимо показать корректность жадного алгоритма, а именно, что если на концах обеих строк оказалась одна и та же буква, то эту букву можно "зачесть" и перейти к мэтчингу следующей буквы. Я допускаю, что некоторые люди, получившие за эту задачу полный балл, не смогли бы обосновать свое решение. Опираясь на "чуйку" и на оценку сложности задачи в сравнении с другими задачами из того же раунда, и поигравшись с примерами, они могли бы, не придя к полному обоснованию, заключить, что решение будет, скорее всего, корректным. Такое поведение вполне допустимо в условиях соревнований. Во-первых, из-за уже перечисленных соображений. Во-вторых, лучше попробовать хоть какой-то вариант, чем не попробовать никакой. Во-третьих, для сложных задач опытные игроки могут только наметить обоснование у себя в голове, понимая, что при желании, его можно довести до конца. Ведь они знают, что задача обязательно имеет решение, реализуемое в обозначенные условиями соревнований сроки, поэтому каких-то серьезных "подстав" можно не ожидать. В "реальном мире" всё иначе. Часто про сложность задачи ничего не известно либо уже заранее известно, что эффективного решения для неё не существует. В боевых условиях очень важно уметь доказывать корректность алгоритма. А с этим у искусственного интеллекта пока что вообще никак. Он может что-то сгенерировать, что проходит какие-то тесты. А вот поди докажи корректность решения...

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

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


  1. bak
    05.01.2023 19:11
    +2

    Топ 50% это A, B и возможно иногда C из Div2 раунда, то есть вообще ни о чем. Это первые задачи "на разогрев" или для совсем новичков, следующие задачи на порядок сложнее.

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


    1. TechThink Автор
      05.01.2023 19:31
      +3

      А можете привести 1-2 примера ваших удачных запросов к GPT? Интересно посмотреть, в чем именно модель оказалась полезной, а также как именно люди формулируют свои запросы к ней


      1. bak
        05.01.2023 19:51
        +10

        Пример

        Запрос

        I have a following html code:

            <div class="code_block" onmousedown="onCodeBlockClicked(this, '${block_id}')">
                <div class="code_block_right move_handler"></div>
                <div class="code_block_left move_handler"></div>
                <div class="code_block_content">
                    <div class="code_block_header move_handler">
                        Header
                    </div>
                    <div id="${block_id}" class="code_block_container">
                    </div>
                    <div class="code_block_footer move_handler">azaza</div>
                </div>
            </div>
        

        I need to add ability to rename a header by doubleclick on the header. Please write the html / javascript code to do it, no explanation.

        Ответ

        HTML:

        <div class="code_block_header move_handler" ondblclick="renameHeader(this)">
          Header
        </div>
        

        JavaScript:

        function renameHeader(headerElement) {
          // Get the current header text
          var headerText = headerElement.textContent;
        
          // Create an input element for the user to enter the new header text
          var inputElement = document.createElement("input");
          inputElement.value = headerText;
        
          // Replace the header element with the input element
          headerElement.parentNode.replaceChild(inputElement, headerElement);
        
          // Focus the input element
          inputElement.focus();
        
          // When the user finishes editing the header text and presses Enter,
          // update the header element with the new text
          inputElement.addEventListener("keyup", function(event) {
            if (event.key === "Enter") {
              // Update the header element with the new text
              var newHeaderText = inputElement.value;
              var newHeaderElement = document.createElement("div");
              newHeaderElement.classList.add("code_block_header", "move_handler");
              newHeaderElement.textContent = newHeaderText;
              inputElement.parentNode.replaceChild(newHeaderElement, inputElement);
            }
          });
        }
        

        Запрос
        I need to update header not only by Enter press, but when a user click mouse at any other place

        Ответ

        function renameHeader(headerElement) {
          // Get the current header text
          var headerText = headerElement.textContent;
        
          // Create an input element for the user to enter the new header text
          var inputElement = document.createElement("input");
          inputElement.value = headerText;
        
          // Replace the header element with the input element
          headerElement.parentNode.replaceChild(inputElement, headerElement);
        
          // Focus the input element
          inputElement.focus();
        
          // When the user finishes editing the header text and clicks elsewhere on the page,
          // or presses the Enter key, update the header element with the new text
          inputElement.addEventListener("blur", updateHeader);
          inputElement.addEventListener("keyup", function(event) {
            if (event.key === "Enter") {
              updateHeader();
            }
          });
        
          function updateHeader() {
            // Update the header element with the new text
            var newHeaderText = inputElement.value;
            var newHeaderElement = document.createElement("div");
            newHeaderElement.classList.add("code_block_header", "move_handler");
            newHeaderElement.textContent = newHeaderText;
            inputElement.parentNode.replaceChild(newHeaderElement, inputElement);
          }
        }
        
        Hidden text


        1. TechThink Автор
          06.01.2023 11:14
          +4

          Ого! Фудаментально :) Спасибо за примеры!


    1. themen2
      05.01.2023 22:02

      У него вроде ограничение на 150 запросов в день, если не ошибаюсь.


      1. bak
        05.01.2023 22:49
        +2

        В большинство дней хватает, но я взял платную - стоит копейки (меньше доллара за пару недель потратил), и главное - модерация не режет контент и можно спокойно общаться на всякие интересные темы.
        Вот тут платная апиха, https://beta.openai.com/playground - text-davinci-003, разница с chatgpt как раз в сейф-функциях и еще по мелочи, в качестве ответов одинаково.


    1. KvanTTT
      06.01.2023 17:50
      +1

      Аналогичные ощущения от GitHub Copilot — он, оказывается, даже учитывает то, что писал я чуть ранее.