В эпоху быстрого развития AI и LLM я все чаще вижу, что многие люди думают AI заменят всех программистов и они будут не нужны. Такую мысль высказывал даже CEO Nvidia - Jensen Huang.

Но несмотря на впечатляющие достижения ИИ в области генерации кода, существует фундаментальное ограничение, которое не позволяет им полностью заменить человека в программировании — неспособность к настоящему рассуждению (reasoning).

Иллюзия интеллекта

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

Source: Andrej Karpathy, Intro to LLM
Source: Andrej Karpathy, Intro to LLM

Тест на способность к рассуждению - Strawberry

Очень простой пример: Сколько букв r в слове strawberry? Любой человек скажет что их 3, но LLM отвечает - 2. Секрет, почему ChatGPT неверно счиатает количество букв R кроется в токенизации. Токены можно представлять как строительный блоки, которые модель использует для понимания и генерации текста. Наличие токенов позволяет быстро и эффективно обрабатывать текст, но при этом не подразумевает у модели наличия способностей к рассуждению.

В токенайзере GPT-4 можно подробно увидеть почему это происходит

С точки зрения AI, "strawberry" - это не последовательность отдельных букв, это также не серия строк [str, aw, berry], а скорее последовательность токен IDs [496, 675, 15717]. LLM несмотря на их кажущуюся магию, следует воспринимать как систему статистического моделирования, выполняющую задачу предсказания следующего токена на основе тренировочных данных. Именно поэтому она и не может посчитать количество r в слове strawberry/

Тест на способность к рассуждению - Алгоритмическая задача

Возьмем простую и достаточно старую задачу для подготовки к алгоритмической сессии почти в любую IT компанию - Invert Binary Tree. Эту задачу легко решить стажер в почти любой компании, и в ее классическом виде ее также решат все LLM.

  • Добавим всего несколько нюансов, чтобы сделать задачу новой, которой не было в обучающей выборке LLM.

    • Нужно инвертировать ключи (перестановка с обращением битов)

    • Решение должно быть чистой рекурсивной функцией без зависимостей

    • Функция должна иметь тип Bit -> Tree -> Tree

Задачу с дополнением этих нюансов решит любой программист, умеющий кодить. При этом ни одна LLM решить ее не может, даже последние версии chatGPT, Claude или Gemini. Решение очень простое и включает всего 7 строчек, но требует способности к рассуждению.

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

Ссылка на источник задачи: https://gist.github.com/VictorTaelin/45440a737e47b872d7505c6cda27b6aa

Почему это важно?

  1. Неспособность к оригинальному мышлению: LLM могут комбинировать существующие решения, но не способны создавать действительно новые.

  2. Ограничения в исследованиях: Эта неспособность решать новые задачи означает, что LLM не смогут вносить оригинальный вклад в научные исследования.

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

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

Стоит отметить, что LLM в любом случае дают сильный рост продуктивности текущих программистов:

  • Они значительно повысят продуктивность программистов.

  • Вероятно, автоматизируют 99% существующих задач.

  • Окажут влияние, сравнимое с появлением компьютеров и интернета.

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

Заключение

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

Среди рекомендуемых материалов для изучения могу выделить

  1. Канал Андрея Карпатого

  2. Курсы Стэнфордского университета по AI и машинному обучению

  3. Курсы Школы Высшей Математики

  4. Курсы на факультете компьютерных наук Высшей школы экономики (ФКН ВШЭ)

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

P.S. Как early adopter AI - я занимался машинным обучением и NLP задолго до появления ChatGPT. Моя вера в потенциал этих технологий остается непоколебимой. Цель этой статьи - объективно осветить текущие ограничения LLM, признавая при этом их значительный прогресс и потенциал для дальнейшего развития. Это не критика технологии, а скорее анализ ее нынешнего состояния, направленный на стимулирование дискуссии о путях ее совершенствования.

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


  1. mclander
    14.10.2024 08:09

    С - самоуспокоение?


    1. FurySeer
      14.10.2024 08:09

      Реалистичный взгляд


      1. zyaleniyeg
        14.10.2024 08:09

        Нифига, мы берём текущее состояние и на основании него о чем то рассуждаем, да, сейчас не заменят, но глупо не видеть прогресс, задача с r, вообще детский лепет, достаточно добавить в выборку все слова в виде "слово" = с л о в о, и ллм быстро научится считать буквы


        1. dv0ich
          14.10.2024 08:09

          но глупо не видеть прогресс

          Весь прогресс пока идёт в канве "быть полезным помощником для человека". В плоскости полной замены человека никакого прогресса нет и пока не предвидится. Нейронки остаются безвольными бездумными китайскими комнатами.


          1. zyaleniyeg
            14.10.2024 08:09

            Ну а как подмастерье становится мастером по вашему, также, сначала помогает, а потом становится мастером, Вы видимо не используете llm полотно, иначе прогресс между версиями сложно не замечать


            1. dv0ich
              14.10.2024 08:09

              Подмастерье это человек. Ни один инструмент пока ещё не стал мастером.

              Вы видимо не используете llm полотно

              Использую каждый день и вижу, что это тупой статистический генератор.


            1. Georrg
              14.10.2024 08:09

              Использую и GPT и Copilot. Нет сомнений, что заменит)) Лично я уже заменил го разработчика и фронтера в своем стартапе. Т.е. двое мидлов остались без работы с текущей нейронной. 5 лет максимум и 90% из нас будет учиться работать по-новой


              1. DTPlayer
                14.10.2024 08:09

                Посмотрим потом как вы будете такие проекты поддерживать)

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


              1. AveWycc
                14.10.2024 08:09

                Если стартап это то, про что вы писали статьи (Meme Battle), то конечно видно, что разработчика фронтового у вас нет видимо, да и благо приложение не сильно сложное.


          1. Kanut
            14.10.2024 08:09

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

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


            1. dv0ich
              14.10.2024 08:09

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

              (хотя это так, розовая мечта; скорее всего, вооружившись нейронками, бизнес станет ещё быстрее продуцировать мегатонны дерьмища, лол)


              1. Kanut
                14.10.2024 08:09

                Не вижу в этом проблемы

                Ну это и не обязательно будет проблемой.

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

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


                1. dv0ich
                  14.10.2024 08:09

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


                  1. Kanut
                    14.10.2024 08:09

                    Переобучиться далеко не всегда просто. И переобучаться и начинать с нуля это тоже проблема.

                    А если мы получим массовую безработицу, то и это не особо поможет.


                1. Pubert
                  14.10.2024 08:09

                  Сильно и резко спрос на айтишников не упадёт) чтобы перестроить все технологические процессы, потребуются годы, или даже десятилетия. Даже если бы сейчас уже была готова нейронка, которая способна выдать план разработки огромного сервиса, подобного гугл поиску, с возможностью интеграции с другими готовыми сервисами, как внутренними, так и внешними, проанализировать все зависимости, а также определить, какие команды нейронок ей нужны (включая нейронок-программистов, нейронок-дизайнеров, нейронок-тестировщиков и т.д.) и наладить всю коммуникацию, потребуется ОЧЕНЬ много времени для их настройки, отладки, сравнения с моделями-конкурентами. А ещё необходимо сформировать команду, которая будет ставить нейронкам (или главной нейронке) задачи, мониторить процесс разработки и проверять результаты тестирования и сам продукт

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


        1. jsirex
          14.10.2024 08:09

          llm не научится считать буквы (точнее конректно эта архитектура моделей). Может, потом изобретут что-то новое. ЛЛМ лишь угадывает следующий токен (даже не слово). Просто вероятность, что там будет дальше. На человеческом примере:
          -> ты ей говоришь "300"!
          -> а она тебе ответит "спартанцев", но, что более вероятно, расскажет про трактариста

          угадывание слов, а не подсчёт.
          сколько будет 7*8.21? а 15 будет, не считаю угадываю. неправильно, зато отвечаю.


    1. rk-helper Автор
      14.10.2024 08:09

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


      1. TerraV
        14.10.2024 08:09

        Что такое "вещи, требующие много думать"?


      1. Sabbone
        14.10.2024 08:09

        Имхо, нейросети, в будущем, не будут кодить вообще - они будут генерировать видеоряд ну или просто изображение. Условно вместо тестового ввода у тебя на экране сгенерированная ai форма, например повторяющая Word из майкрософт оффис. Но её не кодили, а задали множеством промтов.

        Мини пример - Сделай приложение где будет окно с текстовый вводом, а ещё кнопки увеличить-уменьшить шрифт, и пусть все это можно сохранить в формате doc-ai. редактор текста есть, а кода нет


        1. wataru
          14.10.2024 08:09

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

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


          1. Sabbone
            14.10.2024 08:09

            Текст документа будет хранится как обычный текст, почему нет.

            А насчёт производительности, почему бы ей не прогрессировать, как прогрессировала производительность видеокарт. И будет сетка крутится локально на 256гб памяти например через 10 лет, подгружая что нибудь нужное из сети.

            Конечно как и везде будут технические сложности, но называть это бредом не вижу оснований


            1. Kanut
              14.10.2024 08:09

              Текст документа будет хранится как обычный текст, почему нет.

              А потом вам нужно будет сделать социальную сеть. И где и как будут хранится общие данные?


              1. Sabbone
                14.10.2024 08:09

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

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


                1. Kanut
                  14.10.2024 08:09

                  Где на сервере? В текстовом файле? А сервер откуда возьмётся? Вам его ИИ тоже каждый раз будет генерировать заново?


                  1. Sabbone
                    14.10.2024 08:09

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

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

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

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


                    1. Kanut
                      14.10.2024 08:09

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

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

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

                      Есть очень много вещей, которые в принципе возможны, но при этом абсолютно не логичны/рациональны.


                      1. Sabbone
                        14.10.2024 08:09

                        Вы утверждает что ии как операционка будет не рационально прожорлив и поэтому не получит распространения.

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

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


                      1. Kanut
                        14.10.2024 08:09

                        Сейчас виндоус и другие программы очень прожорливы, но все равно их массово используют

                        Но при этом никому не приходит в голову писать операционку на JS. И никогда такого делать не будут. Как бы не развивались компьютеры.

                        И точно так же ИИ может быть частью операционки, но никогда не заменит её целиком.

                        Второе возражение что он может сгаллюцинировать..

                        Быть не детерменированным это не только галлюцинировать.


          1. Revolt-or-die
            14.10.2024 08:09

            А есть сомнения, что прогресс вычислительной мощности видеокарт будет хуже чем за последние 20 лет?


            1. wataru
              14.10.2024 08:09

              Нет сомнения. Только этот рост в основном за счет роста потребления и цены. И будет эта форма при работе потреблять как промышленный кондиционер.

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


          1. E1iasX
            14.10.2024 08:09

            Технологический прогресс тоже не стоит на месте. Видеокарты становятся все мощнее и доступнее. В 90х и представить себе не могли, что в карманах обычных людей будут "суперкомпьютеры". Что уж говорить за 80е, когда были ПК чуть ли не как сегодня одноразовые, электронные тесты беременности? И там, и здесь по 4 МГц кремния, например, только памяти поменьше.

            Да и кажется ещё недавно PS3 использовали в Пентагоне... В 2010 году ВВС США (US Air Force) использовали кластер из 1760 PlayStation 3 в своих исследовательских центрах для проведения сложных вычислений, связанных с анализом данных, обработкой изображений и моделированием.

            PS3 привлекала внимание благодаря своему мощному процессору Cell, который был достаточно производительным для параллельных вычислений, необходимых в научных и военных целях. Консоли были дешевле, чем специализированные суперкомпьютеры, при этом обеспечивая хорошую производительность для определённых типов вычислительных задач. Этот "суперкомпьютер" на основе PS3 назывался Condor Cluster и использовался для обработки изображений с воздуха и спутников. Однако в 2013 году Sony отключила возможность установки альтернативных операционных систем на PS3, что сделало такие кластеры менее привлекательными для подобных проектов.

            Так что все возможно. Сегодня дорого — завтра бесплатно.


            1. wataru
              14.10.2024 08:09

              > Технологический прогресс тоже не стоит на месте. Видеокарты становятся все мощнее и доступнее.

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


      1. Elegar
        14.10.2024 08:09

        o1-preview
        Несите следующую статью о том как ИИ чего-то не умеет


    1. d-sh
      14.10.2024 08:09

      Этот текст написан чатомгпт. Зачем он это делает?


  1. Octabun
    14.10.2024 08:09

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


    1. Zenitchik
      14.10.2024 08:09

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


    1. rk-helper Автор
      14.10.2024 08:09

      Да, в этом и смысл статьи - может быть писать код и не надо будет. Но иметь reasoning и уметь решать новые проблемы все еще кто-то должен. К сожалению, LLM может это делать только в пределах трэйн сета, а ее трэйн сет это только доступный в интернете текст.


      1. Zenitchik
        14.10.2024 08:09

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

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


        1. rk-helper Автор
          14.10.2024 08:09

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


  1. TerraV
    14.10.2024 08:09

    Как же вы задолбали со своим Strawberry. Мне это напоминает анекдот про японскую бензопилу и лом. У вас блин окно на миллион токенов, вы используете от силы 1000 на вход и потом обвиняете что LLM косячит.

    Скрытый текст

    Да, это действительно связано с тем, как я обрабатываю текст, включая токенизацию. Токенизация — это процесс разбиения текста на отдельные компоненты (токены), такие как слова или символы, которые я затем анализирую.

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

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

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

    Надеюсь, это объяснение помогает лучше понять, как я обрабатываю текст!

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

    Я скажу больше, у меня сейчас ChatGPT 4o пишет код на уровне мидла, o1 preview на уровне сеньора. Просто нужно помнить что узкое место как правило между клавиатурой и сиденьем.


    1. rk-helper Автор
      14.10.2024 08:09

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


      1. d00m911
        14.10.2024 08:09

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


        1. Zenitchik
          14.10.2024 08:09

          В каком смысле "в виде спирали"? У вас оперативка что ли в виде спирали?


    1. talraaash
      14.10.2024 08:09

      Я скажу больше, у меня сейчас ChatGPT 4o пишет код на уровне мидла

      Я уже постил тут задачу для стажера... добьетесь от LLM её решения? У меня ушло больше трех часов и кучи итераций промтов. В итоге получился почти работающий код. https://habr.com/ru/news/847802/comments/#comment_27370784


      1. TerraV
        14.10.2024 08:09

        В такой постановке не удивительно что вы получаете шлак на выходе. У вас не постановка задачи а какой-то бессвязный поток мыслей. Ответтье мне на следующие вопросы и я дам вам промпт:

        • Что такое header

        • Что такое content

        • Что такое hashtag


        1. talraaash
          14.10.2024 08:09

          Если вы не уловили, то по ссылке - не промт для LLM, а текст для человека. Для LLM писались другие промты, в том числе с примерами того что должно быть в output. А по тексту, вы как человек не смогли вычленить ответы на заданные вопросы?

          • Что такое header

          один с headers[список, контекст вполне читаем], т.е. каждый элемент начиная с # до \n,

          • Что такое content

           второй с headers + content т.е. все что до следующего #

          Тут отчасти согласен, можно было точнее выразится, что conten - все что следует за header, до следующего валидного header т.е. патерна "# Любой символ".

          • Что такое hashtag

          при этом хештеги #tags должны попадать в контент


          1. TerraV
            14.10.2024 08:09

            Как отличить хедер от хэштега, стоящего первым в строке? Будет ли корректно сказать что синтаксис похож на markdown?

            P.S. ща с обеда вернусь и скину промпт


            1. talraaash
              14.10.2024 08:09

              Как отличить хедер от хэштега, стоящего первым в строке?

              Вы серьезно? Различий в "# Header" и "#tags" не видите(если что, правильный паттерн для каждого элемента дополнительно уточнялся в промте для LLM) Там по ссылке даже есть пример петли, в которую попадала LLM и переубедить её, что она не права уже не получалось, приходилось сбрасывать контекст:

              A valid header must have at least one hashtag followed by whitespace and then one or more word characters. "# Hello" does not meet this requirement.


              1. TerraV
                14.10.2024 08:09

                Промпт

                Привет дружище, как насчет написать небольшую программку на javascript? Условия немного мутные, так что надо будет покрошить на человекочитаемые и человекомисправляемые методы чтоб если чё можно было допилить напильником. Вот входные условия: На входе строка, которая на самом деле не строка а множество строк с разделителем. Разделитель \n, но это не точно. Каждая индивидуальная строка может быть либо header (начинается с одного или нескольких #, после чего следует минимум один пробел и дальше какая-то шляпа) либо content - любая строка не попадающая под критерии header. Нужно написать такую функцию, которая на выходе даст два списка. Первый список должен содержать только header'ы, второй должен содержать конкатенации header + весь content ему принадлежащий. Конкатенация должна быть через тот же разедлитель что и оригинальная строка. Когда будешь писать код, постарайся учесть что может поменяться во входном условии и изолировать эти изменения в самостоятельных функциях

                ChatGPT 4o

                Привет! Вот вариант программы на JavaScript, которая отвечает твоим условиям, с учетом гибкости для возможных изменений:

                function parseInput(input, separator = '\n') {
                    // Функция для разделения строки на массив подстрок
                    function splitString(str, sep) {
                        return str.split(sep);
                    }
                
                    // Функция для проверки, является ли строка заголовком
                    function isHeader(line) {
                        return /^#+\s/.test(line);  // Проверка на наличие одного или нескольких # и хотя бы одного пробела
                    }
                
                    // Основная функция для получения двух списков
                    function processInput(input, sep) {
                        const lines = splitString(input, sep);
                        const headers = [];
                        const contentBlocks = [];
                        
                        let currentHeader = null;
                        let currentContent = [];
                
                        lines.forEach(line => {
                            if (isHeader(line)) {
                                // Если был предыдущий заголовок, сохраняем его с контентом
                                if (currentHeader) {
                                    contentBlocks.push(currentHeader + sep + currentContent.join(sep));
                                }
                                // Начинаем новый блок
                                headers.push(line);
                                currentHeader = line;
                                currentContent = [];
                            } else {
                                // Если строка не заголовок, добавляем её к текущему контенту
                                currentContent.push(line);
                            }
                        });
                
                        // Добавляем последний блок контента, если он есть
                        if (currentHeader) {
                            contentBlocks.push(currentHeader + sep + currentContent.join(sep));
                        }
                
                        return { headers, contentBlocks };
                    }
                
                    // Вызов основной функции
                    return processInput(input, separator);
                }
                
                // Пример использования
                const inputString = `
                # Header 1
                Some content under header 1
                Another line of content
                ## Subheader 1.1
                Content for subheader 1.1
                # Header 2
                Content under header 2
                More content under header 2
                `;
                
                const result = parseInput(inputString.trim());
                console.log("Headers:", result.headers);
                console.log("Content blocks:", result.contentBlocks);
                

                Пояснение:

                1. splitString: Функция, которая разделяет входную строку по заданному разделителю (по умолчанию — \n). Это позволяет легко изменить способ разделения строк, если изменится разделитель.

                2. isHeader: Проверяет, является ли строка заголовком. Использует регулярное выражение, которое ищет строки, начинающиеся с одного или нескольких символов #, за которыми следует хотя бы один пробел. Эту проверку можно изменить, если изменятся условия распознавания заголовков.

                3. processInput: Основная функция, которая проходит по каждой строке, разделенной на массив. Сохраняет заголовки в один список, а блоки "заголовок + контент" в другой.

                4. Результат: На выходе функция возвращает два массива — список заголовков и список конкатенированных блоков "заголовок + контент".

                Пример вывода:

                Headers: [ '# Header 1', '## Subheader 1.1', '# Header 2' ]
                Content blocks: [
                  '# Header 1\nSome content under header 1\nAnother line of content',
                  '## Subheader 1.1\nContent for subheader 1.1',
                  '# Header 2\nContent under header 2\nMore content under header 2'
                ]
                

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

                o1 preview

                Привет! Вот вариант программы на JavaScript, которая отвечает твоим условиям, с учетом гибкости для возможных изменений:

                function parseInput(input, separator = '\n') {
                    // Функция для разделения строки на массив подстрок
                    function splitString(str, sep) {
                        return str.split(sep);
                    }
                
                    // Функция для проверки, является ли строка заголовком
                    function isHeader(line) {
                        return /^#+\s/.test(line);  // Проверка на наличие одного или нескольких # и хотя бы одного пробела
                    }
                
                    // Основная функция для получения двух списков
                    function processInput(input, sep) {
                        const lines = splitString(input, sep);
                        const headers = [];
                        const contentBlocks = [];
                        
                        let currentHeader = null;
                        let currentContent = [];
                
                        lines.forEach(line => {
                            if (isHeader(line)) {
                                // Если был предыдущий заголовок, сохраняем его с контентом
                                if (currentHeader) {
                                    contentBlocks.push(currentHeader + sep + currentContent.join(sep));
                                }
                                // Начинаем новый блок
                                headers.push(line);
                                currentHeader = line;
                                currentContent = [];
                            } else {
                                // Если строка не заголовок, добавляем её к текущему контенту
                                currentContent.push(line);
                            }
                        });
                
                        // Добавляем последний блок контента, если он есть
                        if (currentHeader) {
                            contentBlocks.push(currentHeader + sep + currentContent.join(sep));
                        }
                
                        return { headers, contentBlocks };
                    }
                
                    // Вызов основной функции
                    return processInput(input, separator);
                }
                
                // Пример использования
                const inputString = `
                # Header 1
                Some content under header 1
                Another line of content
                ## Subheader 1.1
                Content for subheader 1.1
                # Header 2
                Content under header 2
                More content under header 2
                `;
                
                const result = parseInput(inputString.trim());
                console.log("Headers:", result.headers);
                console.log("Content blocks:", result.contentBlocks);
                

                Пояснение:

                1. splitString: Функция, которая разделяет входную строку по заданному разделителю (по умолчанию — \n). Это позволяет легко изменить способ разделения строк, если изменится разделитель.

                2. isHeader: Проверяет, является ли строка заголовком. Использует регулярное выражение, которое ищет строки, начинающиеся с одного или нескольких символов #, за которыми следует хотя бы один пробел. Эту проверку можно изменить, если изменятся условия распознавания заголовков.

                3. processInput: Основная функция, которая проходит по каждой строке, разделенной на массив. Сохраняет заголовки в один список, а блоки "заголовок + контент" в другой.

                4. Результат: На выходе функция возвращает два массива — список заголовков и список конкатенированных блоков "заголовок + контент".

                Пример вывода:

                Headers: [ '# Header 1', '## Subheader 1.1', '# Header 2' ]
                Content blocks: [
                  '# Header 1\nSome content under header 1\nAnother line of content',
                  '## Subheader 1.1\nContent for subheader 1.1',
                  '# Header 2\nContent under header 2\nMore content under header 2'
                ]
                

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


                1. talraaash
                  14.10.2024 08:09

                  Почти... 4.0 написала слишком строгий regex для header "# Header! 1" >> "# Header 1", о1 тоже не все пограничные случаи отлавливает "#Header ## Subheader 1.1" в output даст не то что ожидается.

                  Не стоит тратить время, на допиливание, если что. Задачу я решил сам, разобравшись в незнакомом мне до этого js за ~час. А цель добиться решения от LLM была, в понимании сможет ли no code мимокрокодил решать прикладные задачи. На данный момент развития технологий ответ для себя я получил.


                  1. TerraV
                    14.10.2024 08:09

                    Примеры батенька, примеры. Выкладывайте тестовый кейс, прогоним и разберемся. Я уверен что код 100% рабочий и покрывает все граничные случаи которые вы явно упомянули. Если у вас в голове сидит кусок неописанной логики, я не экстрасенс чтоб угадывать.


                1. Zenitchik
                  14.10.2024 08:09

                  Мне кажется, я код бы написал быстрее, чем ваш "промпт"...


                  1. hochbar
                    14.10.2024 08:09

                    Тут несколько моментов.

                    1) Это сегодня ИИ такой "глуповатый", часто делает ошибки на уровне студентов. Но давайте посмотрим в перспективе: какой путь прошел ИИ за какие-то 5 лет и что он будет делать через 5 лет. Мне это напоминает ситуацию с игрой Го, лет *дцать назад компьютеру давали фору в 14 ходов и все равно он проигрывал игроку второго уровня. А потом случился АльфаГо и на этом финита ла комедиа.

                    2) Бабло побеждает. Всегда. Сегодня кодерами-индусами заменяют более образованных, но и более дорогих американцев, русских, немцев и т.д. И пофиг, что код медленнее в 3 раза, жрет больше оперативки и дохера ошибок. Так что вы то может и напишете код, но сколько вы стоите и сколько стоит человек пишущий промпт для ИИ?


                    1. Zenitchik
                      14.10.2024 08:09

                      Я не о том. Для более-менее складно мыслящего человека, писать код - ПРОЩЕ, чем писать ТАКОЙ промпт.


                      1. Hardcoin
                        14.10.2024 08:09

                        Крайне необоснованное утверждение. Вы собственные ощущения выдаете за универсальные правила, но не ясно, на каком количестве «складно мыслящих» вы проверяли.


        1. Sanchous98
          14.10.2024 08:09

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


        1. Revolt-or-die
          14.10.2024 08:09

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


    1. Sanchous98
      14.10.2024 08:09

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


  1. wataru
    14.10.2024 08:09

    Более того, LLM не справляются не только с задачами, которых в интернете нет, но и с достаточно редкими.

    Мой пример: надо с помощью WinAPI MediaFoundations проверить, что камера не работает, потому что она занята другим приложением. Все сетки, что я пробовал выдают разыне вариации из перемешанного DirectShow, выдуманных методов MediaFondations или просто интерпретируют любую ошибку, как "камера занята". В 75% случаев код даже не компилировался. Даже после подсказок использовать IMFActivityMonitor - ни одна сетка не справилась.

    А ответ в интернете даже есть, правда в считанных по пальцам местах. Документация Microsoft и пара примеров на гитхабе.

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


    1. hochbar
      14.10.2024 08:09

      Ну так никто не говорит, что 100% программистов исчезнут. Но процентов минимум 90 (мидлы и джуны) придется через несколько лет менять профессию. И добавлю, что 99% кода это вариации проезженных трамвайных путей.