Как стать автором
Обновить

ChatGPT — лучший помощник программиста. Примеры реальных задач. Плагины и инструменты

Уровень сложностиПростой
Время на прочтение9 мин
Количество просмотров64K
Всего голосов 72: ↑57 и ↓15+60
Комментарии88

Комментарии 88

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

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

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

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

Для олимпиадных задач есть понятный бенчмарк под названием CodeForces, в котором ChatGPT входит примерно в топ 90%, а специализированный alphacode без исходников и воспроизводимости входит в топ 60%.

Джун без алго-подготовки легко входит в топ 50% / топ 40%, джун с алгоритмами в топ 30% и выше.

Да, вот пруф даже нашел.
Похоже, с тестами на эрудицию он справляется гораздо лучше. Еще неплохо решает/объясняет задачи с литкода, которые видел.

Как насчёт объяснения кода вот с этого сайта? Пример кода оттуда, для понимания атмосферы:

#define/**/Q(x,y)char*/*                               */q=y#x","#y")",*p,s[x;}
  /*IOCCC'20*/#include/*                               */<stdio.h>/*-Qlock-*/
    int(y),x,i,k,r;Q(9/*              12               */<<9];float(o)[03];
      void(P)(){*o=r<0/*         11         1          */?r:-r;o[1]=39.5;
       o[2]=22.5;for(k/*      10               2       */=0;++k<39;*o*=i
        /6875.5/(k%2?k/*                               */:-k))y=o[1+k%2
         ]+=*o;k=o[2];/*     9         o-------> 3     */p=s+y+k/2*80;
          }int(main)()/*              /                */{for(p=s;+i<
          1839;*q>32?k/*       8     L         4       */=i++/80-11,y
           =(750>r*r+k/*          7         5          */*k*4)*4+y/2
           ,*p++=r<41?/*               6               */y?"0X+0X+!"
           [y-1]-1:+*q/*                               */++:10:*q++)
           r=i%80-38;;/*                               */;for(x=13,r
           =20;i=3600*/*     \       /    -------+     */--x,i;*p++=
          "OISEA2dC8e"/*      \     /     ------ |     */[x%10],*p+=x
          /10*41)P();r/*       \   /      ------ |     */=10;;sscanf(
         __TIME__,"%d"/*        \ /       ------ |     */":%d:%d",&k,&
        x,&i);for(i+=(/*         X        ------ |     */k*60+x)*60;18+
       r;*p=k%2?*p%2?+/*      __/ \__         |  |     */59:44:*p>39?59:
      39,i=!r--?i%3600/*     /  \ /  \        |  |     */*12:i)P();puts(s
    ),"#define/**/Q(x"/*     \__/ \__/        +--+     */",y)char*q=y#x\","
  "\"#y\")\",*p,s[x;}"/*                               */"/*IOCCC'20*/#inclu"
"de<stdio.h>/*-Qlock-"/*                               */"*/int(y),x,i,k,r;Q(")
НЛО прилетело и опубликовало эту надпись здесь

Так это он просто процитировал описание из readme своими словами, не щитается. Щитается, если бы он перевёл его к удобочитаемому виду раскрыв макросы и переименовав переменные.

Вот кстати хорошая идея — "chatGPT, приведи этот код к человекочитаемому виду, не изменяя логику работы" — что получится?

НЛО прилетело и опубликовало эту надпись здесь

Короче, низачот.

Во-первых, нет там никакой ошибки компиляции:
~> gcc CLOCK.c
CLOCK.c:23:80: warning: no newline at end of file
~> ./a.out
#define/**/Q(x,y)char*/*                               */q=y#x","#y")",*p,s[x;}
/*IOCCC'20*/#include/*                 SI                */<stdio.h>/*-Qlock-*/
int(y),x,i,k,r;Q(9/*         I                   II        */<<9];float(o)[03];
void(P)(){*o=r<0/*               ',                          */?r:-r;o[1]=39.5;
o[2]=22.5;for(k/*                 ;                           */=0;++k<39;*o*=i
/6875.5/(k%2?k/*                   ;                           */:-k))y=o[1+k%2
]+=*o;k=o[2];/*       S            ',                   OI      */p=s+y+k/2*80;
}int(main)()/*                      ',                           */{for(p=s;+i<
1839;*q>32?k/*                ,      ;                           */=i++/80-11,y
=(750>r*r+k/*                  '',,   ;                           */*k*4)*4+y/2
,*p++=r<41?/*                      ',,',                          */y?"0X+0X+!"
[y-1]-1:+*q/*      E                  ''                   e      */++:10:*q++)
r=i%80-38;;/*                                                     */;for(x=13,r
=20;i=3600*/*                                                     */--x,i;*p++=
"OISEA2dC8e"/*                                                   */[x%10],*p+=x
/10*41)P();r/*                                                   */=10;;sscanf(
__TIME__,"%d"/*       A                                 8       */":%d:%d",&k,&
x,&i);for(i+=(/*                                               */k*60+x)*60;18+
r;*p=k%2?*p%2?+/*                                             */59:44:*p>39?59:
39,i=!r--?i%3600/*           2                   C           */*12:i)P();puts(s
),"#define/**/Q(x"/*                                       */",y)char*q=y#x\","
"\"#y\")\",*p,s[x;}"/*                 d                 */"/*IOCCC'20*/#inclu"
"de<stdio.h>/*-Qlock-"/*                               */"*/int(y),x,i,k,r;Q(")

Во-вторых, препроцессит оно так себе.

gcc -E сработал лучше
int(y),x,i,k,r;

char* q = "#define/**/Q(x" ",y)char*q=y#x\"," "\"#y\")\",*p,s[x;}" "/*IOCCC'20*/#inclu" "de<stdio.h>/*-Qlock-" "*/int(y),x,i,k,r;Q(""9 <<9];float(o)[03]; void(P)(){*o=r<0 ?r:-r;o[1]=39.5; o[2]=22.5;for(k =0;++k<39;*o*=i /6875.5/(k%2?k :-k))y=o[1+k%2 ]+=*o;k=o[2]; p=s+y+k/2*80; }int(main)() {for(p=s;+i< 1839;*q>32?k =i++/80-11,y =(750>r*r+k *k*4)*4+y/2 ,*p++=r<41? y?\"0X+0X+!\" [y-1]-1:+*q ++:10:*q++) r=i%80-38;; ;for(x=13,r =20;i=3600* --x,i;*p++= \"OISEA2dC8e\" [x%10],*p+=x /10*41)P();r =10;;sscanf( __TIME__,\"%d\" \":%d:%d\",&k,& x,&i);for(i+=( k*60+x)*60;18+ r;*p=k%2?*p%2?+ 59:44:*p>39?59: 39,i=!r--?i%3600 *12:i)P();puts(s )"",""\"#define/**/Q(x\" \",y)char*q=y#x\\\",\" \"\\\"#y\\\")\\\",*p,s[x;}\" \"/*IOCCC'20*/#inclu\" \"de<stdio.h>/*-Qlock-\" \"*/int(y),x,i,k,r;Q(\""")",
      *p, s[9 <<9];
float(o)[03];

void(P)() {
  *o = r<0 ? r : -r;
  o[1]=39.5;
  o[2]=22.5;
  for(k =0;++k<39;*o*=i /6875.5/(k%2?k :-k)) y = o[1+k%2 ] += *o;

  k=o[2];
  p = s+y+k/2*80;
}

int(main)() {
  for(p=s; +i < 1839; *q>32 ? k = i++/80-11, y = (750>r*r+k *k*4)*4+y/2 ,*p++=r<41? y?"0X+0X+!" [y-1]-1:+*q ++:10:*q++) r=i%80-38;

  for(x=13,r =20;i=3600* --x,i;*p++= "OISEA2dC8e"[x%10],*p+=x /10*41)P();r =10;;sscanf( "13:54:33","%d" ":%d:%d",&k,& x,&i);
for(i+=( k*60+x)*60;18+ r;*p=k%2?*p%2?+ 59:44:*p>39?59: 39,i=!r--?i%3600 *12:i)P();
puts(s);
}

А размер массива sувеличивать ни разу не надо — он и так 9 << 9 = 4608

НЛО прилетело и опубликовало эту надпись здесь

у 4ки с этим нет проблем. вот что она отдала:

#include <stdio.h>

int y, x, i, k, r;
char *q = "09,2023-4-18,1839,80,20,750,41,10,39,59,44,60,3600,03,12", *p, s[9 << 9];
float o[3];

void P() {
    *o = r < 0 ? r : -r;
    o[1] = 39.5;
    o[2] = 22.5;
    
    for (k = 0; ++k < 39; *o *= i / 6875.5 / (k % 2 ? k : -k)) {
        y = o[1 + k % 2] += *o;
    }
    
    k = o[2];
    p = s + y + k / 2 * 80;
}

int main() {
    for (p = s; +i < 1839;
         *q > 32
             ? k = i++ / 80 - 11,
               y = (750 > r * r + k * k * 4) * 4 + y / 2,
               *p++ = r < 41 ? y ? "0X+0X+!"[y - 1] - 1 : +*q++ : 10
             : *q++)
        r = i % 80 - 38;

    for (x = 13, r = 20; i = 3600 * --x, i; *p++ = "OISEA2dC8e"[x % 10], *p += x / 10 * 41)
        P();

    r = 10;
    sscanf(__TIME__, "%d:%d:%d", &k, &x, &i);

    for (i += (k * 60 + x) * 60; 18 + r; *p = k % 2 ? *p % 2 ? +59 : 44 : *p > 39 ? 59 : 39, i = !r-- ? i % 3600 * 12 : i)
        P();

    puts(s);
    return 0;
}

Хорошо, а теперь спросите её, что этот код делает, используя не более 30 слов (для бенчмарка — я уложился в 20)

Хммм, вот тут впечатлило.

Во-первых, этот код специально obfuscated. Там и человеку-то, глядя чисто на код, сложно понять, что он нарисует аналоговые часы. Нужно его запустить, и только тогда всё станет очевидно.

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

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

Но оно здесь сделало две фактические ошибки. Которые принципиальны.

Задайте ей несколько вопроса:

1) видит ли оно что-то особенное или необычное в получаемом изображении часов;

2) что оно подразумевает под словами "текущее время"?

3) каким образом этот код узнаёт текущее время?

4) видит ли оно что-то необычное или особенное в ИСХОДНОМ коде — не в том, который оно перелопатило, а в том, который был приведён в исходном комментарии этого треда.

НЛО прилетело и опубликовало эту надпись здесь

2-3: оно заметило макрос TIME, но не смогло разобраться. В данном случае часы будут показывать время в момент, когда была скомпилирована программа, а не "текущее"; эти "часы" не настоящие — они "застыли", всегда показывают одно и то же время — время, в которое была скомпилирована программа. Так что ответ 3 - фейл: код НИКАК не узнаёт текущее время, это был вопрос с подвохом.

  1. Посмотрите сами:

#define/**/Q(x,y)char*/*                               */q=y#x","#y")",*p,s[x;}
/*IOCCC'20*/#include/*                 SI                */<stdio.h>/*-Qlock-*/
int(y),x,i,k,r;Q(9/*         I                   II        */<<9];float(o)[03];
void(P)(){*o=r<0/*                                           */?r:-r;o[1]=39.5;
o[2]=22.5;for(k/*                                             */=0;++k<39;*o*=i
/6875.5/(k%2?k/*                                               */:-k))y=o[1+k%2
]+=*o;k=o[2];/*       S                                 OI      */p=s+y+k/2*80;
}int(main)()/*                   ',                              */{for(p=s;+i<
1839;*q>32?k/*                    ';                             */=i++/80-11,y
=(750>r*r+k/*                       ',                            */*k*4)*4+y/2
,*p++=r<41?/*         ,,,,,,,        ';                           */y?"0X+0X+!"
[y-1]-1:+*q/*      E         '''''''''''                   e      */++:10:*q++)
r=i%80-38;;/*                                                     */;for(x=13,r
=20;i=3600*/*                                                     */--x,i;*p++=
"OISEA2dC8e"/*                                                   */[x%10],*p+=x
/10*41)P();r/*                                                   */=10;;sscanf(
__TIME__,"%d"/*       A                                 8       */":%d:%d",&k,&
x,&i);for(i+=(/*                                               */k*60+x)*60;18+
r;*p=k%2?*p%2?+/*                                             */59:44:*p>39?59:
39,i=!r--?i%3600/*           2                   C           */*12:i)P();puts(s
),"#define/**/Q(x"/*                                       */",y)char*q=y#x\","
"\"#y\")\",*p,s[x;}"/*                 d                 */"/*IOCCC'20*/#inclu"
"de<stdio.h>/*-Qlock-"/*                               */"*/int(y),x,i,k,r;Q(")

Что Вы как человек можете сказать про эти часы?

Правильный ответ, не смотрите сразу

Циферблат зеркально отражён (и цифры на нём тоже, ну, в той мере, в которой это можно эмулировать ASCII-артом).

Джентельмены, вы меня, конечно, извините, но ваш диалог здорово напоминает анекдот про умную собаку (человек застаёт знакомого за игрой в шахматы со своей собакой и удивляется "какая умная у тебя собака!", а тот отвечает "да какая же она умная, если я выигрываю 3:2!").


Можете пояснить, как вообще статистическая модель может "разбираться" в таком коде? На мой взгляд, "a=b[c]" статистически эквивалентно и "b=a[c]" и "c=a[b]". Т.е. на generic обучающей выборке кода никаких особенных закономерностей для подобного рода синтаксических конструкций получить просто невозможно, а если предположить, что данной конкретной модели скормили при обученнии именно данный конкретный пример, то он, при предполагаемом размере обучающей выборки и матрицы весов, не должен был иметь статистической значимости.

НЛО прилетело и опубликовало эту надпись здесь

как вообще статистическая модель может "разбираться" в таком коде?

Да никак. Код взят с какого-то соревнования в интернете — соответственно, хуманы его наверняка где-то обсуждали.

не должен был иметь статистической значимости.

Про фильтр Блума, я так понимаю, Вы не слышали?

А каким боком этот фильтр прислонён к ChatGPT? Что-то я не могу сходу понять/найти...

То есть Вы не находите никакого сходства между битовым массивом блум-фильтра и массивом весов нейронов сетки?

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

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

Нет, биты только у Блюма, а в GPT — веса. Но смысл похожий.

Условно говоря, если сетка натренирована распознавать, что "4 лапы, усы, хвост, шерсть, мяукает => кошка", то оно опознает как "3 лапы, усы, хвост, шерсть, мяукает => кошка (90%)", так и "4 лапы, усы, хвост, без шерсти, мяукает => кошка (95%)", но кошка, у которой есть ВСЕ признаки, на которой оно обучалось, вызовет более сильное срабатывание ("=> кошка (100%)").

А поскольку код приведённого примера был с какого-то кодерского соревнования, то практически уверен, что в обучающую выборку ChatGPT он попал с пометкой "смотри: ВОТ ЭТО — код" (как в моём примере — "смотри: вот это — кошка").

НЛО прилетело и опубликовало эту надпись здесь

Тест не прошёл, ухожу в монастырь.

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

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


чтобы получить текущее время компиляции в формате "HH:MM:SS". Затем он использует функцию sscanf для разбора этой строки и получения текущего времени в часах, минутах и секундах.

Получение текущего времени в момент компиляции. В дальнейшем контекст — именно это точное время, на момент компиляции. Именно эту деталь Вы упускаете в своём


часы будут показывать время в момент, когда была скомпилирована программа, а не "текущее"

"Время компиляции" — оно не текущее.

Так тут же нет никаких пояснений и от gcc -E не отличается. А то, что ЧатГПТ имеет плагины для использования сторонних инструментов — создатели уже скрывать не пытаются, например.

Он спокойно расписывает пояснения. Просто изначально я не задал таких параметров. Попросил просто привести к читаемому виду. Сейчас не с компа, не могу кинуть скрин.

Пояснения в стиле
for /* это цикл */
просьба не предлагать.
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь

Я Вам ещё кое-что поинтереснее скажу.

Вот это печатает оригинал:

#define/**/Q(x,y)char*/*                               */q=y#x","#y")",*p,s[x;}
/*IOCCC'20*/#include/*                 SI                */<stdio.h>/*-Qlock-*/
int(y),x,i,k,r;Q(9/*         I                   II        */<<9];float(o)[03];
void(P)(){*o=r<0/*                                           */?r:-r;o[1]=39.5;
o[2]=22.5;for(k/*                                             */=0;++k<39;*o*=i
/6875.5/(k%2?k/*                                               */:-k))y=o[1+k%2
]+=*o;k=o[2];/*       S                                 OI      */p=s+y+k/2*80;
}int(main)()/*                   ',                              */{for(p=s;+i<
1839;*q>32?k/*                    ';                             */=i++/80-11,y
=(750>r*r+k/*                       ',                            */*k*4)*4+y/2
,*p++=r<41?/*         ,,,,,,,        ';                           */y?"0X+0X+!"
[y-1]-1:+*q/*      E         '''''''''''                   e      */++:10:*q++)
r=i%80-38;;/*                                                     */;for(x=13,r
=20;i=3600*/*                                                     */--x,i;*p++=
"OISEA2dC8e"/*                                                   */[x%10],*p+=x
/10*41)P();r/*                                                   */=10;;sscanf(
__TIME__,"%d"/*       A                                 8       */":%d:%d",&k,&
x,&i);for(i+=(/*                                               */k*60+x)*60;18+
r;*p=k%2?*p%2?+/*                                             */59:44:*p>39?59:
39,i=!r--?i%3600/*           2                   C           */*12:i)P();puts(s
),"#define/**/Q(x"/*                                       */",y)char*q=y#x\","
"\"#y\")\",*p,s[x;}"/*                 d                 */"/*IOCCC'20*/#inclu"
"de<stdio.h>/*-Qlock-"/*                               */"*/int(y),x,i,k,r;Q(")

А вот это печатает код, который оно "почистило" (внимание, ####### — это символы, которыми я "замазал" то, что там было)

> ./a.out
09,2023-4-18,1839,80,2/*                               */0,750,41,10,39,59,44,6
0,3600,03,12%d:%d:%d/*                 SI                */01:16:140X+0X+!OISEA
2dC8e@$FreeBSD:src/*         I                   II        *//lib/csu/i386-elf/
cr##############/*                                           */.#############02
:09:06kensmithE/*                                             */xp$$`](otoo^&$F
reeBSD:src/lib/*                                               *//csu/#########
#############/*       S                                 OI      */############/
#####02:09:0/*                   ;                               */6kensmithExp
$$FreeBSD:sr/*                    ';                             */c/lib/csu/co
mmon/crtbra/*                       ',                            */n##########
##########//*                        ';                           */#####02:09:
##########E/*      E        ,,,,,,,,''''                   e      */x##GCC:(GNU
)##########/*         ''''''                                      */####FreeBSD
]GCC:(GNU)#/*                                                     */###########
#[FreeBSD]GC/*                                                   */C:(GNU)#####
########[Fre/*                                                   */eBSD]GCC:(GN
U)###########/*       A                                 8       */##[FreeBSD].s
##############/*                                               */hs##########rp
###############/*                                             */a############ns
###############g/*           2                   C           */nu.version_r.rel
##############.fin/*                                       */####data.data.eh_f
rame.dynam##########/*                 d                 */to###############com
ment#############^Tott/*                               */#####################

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

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


Олимпиадные задачи — это такие задачи, ответы на которые заранее известны. В реальной жизни за такие задачи никто не будет вам платить зарплату. Реальные задачи в программировании формулируются совсем по-другому. Например: Напишите Тетрис, у которого вероятность выпадения палки в 1.5 раза выше других фигур. И не на питоне, а на ассемблере, под ДОС в консольном режиме, и конечно же, на фоне должна играть "Коробейники" через pc speaker.


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


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


Ну или хотя бы пусть просто регэкспы по словесному описанию вам ЧатГПТ напишет. Чтобы например парсить html с вебсайта магазина для отслеживания колебаний цен, акций, распродаж и всякого аналогичного. А заодно и код для проверки их на валидность.

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

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

Для такого подойдет и Llama. Просто нужный коннектор в код добавите и будет искать по pdf, md и т.д.

Можно. Фреймворк типа langchain + нужная вам модель как обработчик для этого. Ещё слышал про rasa, но он больше про интеграции, чем про сам эмбеддинг доков к модели.

Langchain начал смотреть, но он просит Openai и ключ api для него.

Добрый день! Скажите, правильно ли я понимаю, что речь идет только о pdf, содержащих текст в виде текста? А не pdf с отсканированными документами? Регулярно возникает задача поиска в большом массиве pdf с отсканированными документами и это жрет очень много времени на проектах

Индексировать надо. OCR (и молиться, что ошибок не будет) - потом сохранять как текст, потом по этому тексту искать. Чуда не будет :(

С распространением ChatGPT вырастут требования к джуниорам. Теперь они должны как минимум хорошо владеть ChatGPT и доставлять какую-то дополнительную прибавочную стоимость по сравнению с ним. То есть делать то, что чат-бот не способен сделать в одиночку под управлением промт-инженера.

Вместо цепочки джуниор-миддл-синьор-итд, появляется джуниор промпт инженер - миддл промпт инженер - синьор промпт инженер - итд.

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

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

Возьми ввод отсюда, токенизируй, загрузи туда-то.

Отсутствуют самые сложные процессы- измени согласно бизнес логике, а так же обнови другие сущности согласно бизнес логике. И ивенты пошли/обработай. И прочее.

Программирование на современных ЯП с развитыми библиотеками не очень-то отличается от промт-инжиниринга.

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

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

А еще часто программисты не читают мануалы по библиотеке, или авторы не документируют некоторые моменты... Программирование - это не слепая перестановка кусков кода.

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

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

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

Как что? Почему эта чёртова сериализация падает )))

Ну я планирую сэкономить до 80% рабочего времени, делегировав ChartGPT придумывание названий методов и переменных и еще чуть-чуть на красивых codename для проектов

чтобы тратить освободившееся время на придумывание промптов

Вот соглашусь с @radtie. Написать промпт для это куда как проще чем придумать названия. По крайней мере для меня :)

НЛО прилетело и опубликовало эту надпись здесь

Поддерживаю всецело. Смысл промт инжиниринга был (да всплыл), пока языковые модели были слабые и немощные, и умели только дополнять предложенный текст. Как только исследователи придумали файнтюнить модели в стиле instruction following, весь смысл промпт инжиниринга канул в прошлое. Как сервисы по настройке карбюраторов, в век инжекторов.

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

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

Недавно нужно было быстро накидать функциональный e2e прототип в стиле "говно и палки" и chatGPT отлично справился с созданием стабов полуфункциональных реакт компонент на mui (ну там - плавающая менюшка тут, speed dial здесь, такие-то экшены, так-то функции называются) и с базовым кодом круда под grpc, с валидациями простыми и всяким таким. Реально сэкономил много времени просто от отсутствия необходимости вспоминать как оно там все.

Еще с частью не очень умной работы (на уровне апдейта стейта в useReducer и описания разной простой enum-based бизнес-логики и на беке и на фронте) на месте помог копайлот.

Но это я просто редко код пишу в последнее время.

Нужные картинки, кстати, в DALL-E делал.

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

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

а MLщики UI на чём клепают с помощью ChatGPT?

Copilot попробуй. Дополняет код понимая контекст и даже ранее написанное(удалённое).
Приведу пример:
Пишу метод function sigmoid а он дополняет
function activate($value): float
{
return 1 / (1 + exp(-$value));
}

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

С баш-скриптами аккуратнее. Он мне как-то подсунул бомбу почти вида сбросить все атрибуты доступа у всех файлов с корня.

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

Эта статья тоже ChatGPT написана?)

А если серьезно, то помощник из него неплохой, но разработчиков он никогда не заменит. По крайней мере полностью.

С появлением калькулятора, экономисты же не пропали)

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


Что делает GPT? пишет ЧУЖОЙ код для программиста, причем по четко поставленному заданию и требует(почти всегда) правки кода. Тоесть превращет работу в менторство.


Кодом chatGPT может пользоваться другой тип программиста, тот, который лучше читает и фигово пишет сам. Там да, очень велика разница.
Но только если не понадобился ДЕБАГ.
В общем случае для большинства задач проще самому написать те куски.
Как дополнительный аргумент — даже в одном чате chatGPT пишет код разного СТИЛЯ, что сильно затрудняет прочтение через месяц.


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

Программист читает быстро только СВОЙ код.

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


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

Это ревьювер что ли?

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

Ну так мелкие куски вы дольше будете писать описание.

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

Возможно класно для джависта-ентерпрайз.
Лично у меня очень мало стандартных кусков в коде получается и оно угадывает постоянно неправильно.
Тесты да, chatGPT пишет, если нужны джуно-тесты(тривиальные) чисто для отчетности

Получается, реабилитация нацизма)?

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

Если говорить именно о ChatGPT и его возможности по поиску проблем и созданию производных артефактов (документация и т.п.), в статье правда предлагается брать код, который легко может быть под NDA, и отправлять его "на деревню дедушке"? Или я что-то не так прочитал?

У кого есть доступ одновременно к ChatGPT и чат-боту Bing или еще куда-то. Скажите какие из них лучше подходят для написаня кода на HTML, PHP и JS т.е. для начинающего веб дизайнера. Кто сравнивал поделитесь опытом.

Чат-бот в Bing больше под поиск заточен, для ваших целей ChatGPT будет показывать себя лучше.

Лучше всего пишет gpt4. Потом gpt-3, потом бинг, а гугловский бард вообще говорит, что он не будет писать код.

OpenAI:GPT-4 > ChatGPT:GPT-4 > BingChat:GPT-4 > OpenAI:GPT-3.5-Turbo > ChatGPT:GPT-3.5-Turbo > Anthropic:Claude-1.x > OpenAI:Codex > AWS:CodeWhisperer > LLaMA:fork-13b > LLaMA:fork-8b

amazon недавно выпустил свое решение: amazon codewhisperer.

https://aws.amazon.com/ru/codewhisperer/

CodeWhisperer is trained on billions of lines of code and can generate code suggestions ranging from snippets to full functions in real time based on your comments and existing code. Bypass time-consuming coding tasks and accelerate building with unfamiliar APIs.

CodeWhisperer — днище. Если есть доступ к Турбе, смысла использовать Шептуна примерно ноль (возможно, для подсказок, заточенных под AWS, но не более). Качество не слишком далеко ушло от опенсорсных попыток в LLM на базе спёртых моделей LLaMA.

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


в кавычки возьмите пожалуйста фразу "случайная утечка"

НЛО прилетело и опубликовало эту надпись здесь

сколько ботов у вас здесь для минусации неугодных ?

НЛО прилетело и опубликовало эту надпись здесь

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

Это статья-шутка? В начале сказано, что вот вам целых 17 способов использовать ChatGPT в программировании. Давайте рассмотрим их поближе!

Генерация кода.

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

Автоматическая генерация тестов и тестовых данных.

Пример бы. Как без понимания предметной области написать осмысленный тест? Да и вообще: вот есть у меня реальный проект с тестами. Так там куча всяких хелперов, упрощающих написание/запуск тестов. Как "обучить" бота их использовать?

Поиск ошибок и проблем.

Ну, с натяжкой могу согласиться. Возможно, он покажет вам квадратичную сложность или что-то такое. Или что имеется в виду?

Объяснение непонятного кода.

Тоже с большой натяжкой можно согласиться. Пример бы: и кода, и объяснения.

Оптимизация кода, рефакторинг.

Это вряд ли. Обычно рефакторинг затрагивает сразу несколько классов, и основывается на вполне конкретных вводных (зачем вообще делать рефакторинг - должна быть причина). И всё это объяснить боту, скорее всего, невозможно.

Если имелся в виду рефакторинг вида "переименовать переменную x в value", тогда ладно.. Но это же проще делается в IDE.

Проверка кода на соответствие стандартам.

Всякие разные линтеры и скрипты вроде phpcs справятся с этим лучше и обычно встроены в процесс разработки/деплоя.

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

А я думал, что вирусы и скрипты создаются под конкретные уязвимости, т.е. это вполне осмысленная разработка. Поиск известных уязвимостей вроде бы тоже решенная задача (без ИИ). Поиск неизвестных уязвимостей - если бот с этим справляется, то мое почтение. Можно пример? Потому что скорее всего не справляется.

Чат-боты службы техподдержки.

Да, но как это относится к работе программиста?

Интеграция своих программ с ChatGPT API.

Ощущение, что статья просто ради рекламы ChatGPT. Сперва же говорили про помощь программисту, а теперь переключились на то, что можно просто фичу в свой софт вставить? Ну про API Google Sheets тогда давайте тоже пункт напишем: можно свою программу интегрировать с Гуглом!

Проектирование архитектуры.

По ссылки нет проектирования архитектуры. Если вам лень ходить, то автор статьи просит бота создать модель данных, затем SQL код для генерации соответствующих таблиц. Да, бот выдаст вам код. Но только автору, как будто, пофиг что он там насоздает. Автор не уточняет, какие ему нужны поля, не просит бота скорректировать вывод. Просто берет то, что ему предоставили, никак не примеряя к своей реальной задаче (если она вообще была) и говорит "ура, какой бот молодец".

Затем просит сгенерировать пару диаграм и классов по полученным таблицам. Если я не ошибаюсь, то генераторы всего этого добра тоже написаны в большом количестве. Но даже не это меня поражает, а то, что работа разработчика ложно подменена: я то думал, что разработчик прежде всего думает, а какие сущности и таблицы ему вообще нужны, с какими полями. И только потом выполняет рутинную задачу по генерации SQL и подобного. Но нет. Автор просто говорит "сгенерь мне модель данных" и не парится о деталях.

Генерация диаграмм, аналитика.

Пример бы. Диаграммы, вроде, строятся на основе данных. Как правило, каких-то табличных (или структурированных другим способом). Разве построить диаграмму в любом табличном редакторе будет не быстрее?

Какая аналитика имеется в виду тоже совершенно непонятно. И как оба пункта относятся к программированию.

Генерация отчётов.

Опять, это программирование? Какие отчеты? Специальный софт не лучше ли справится?

Написание документации.

Какой документации? Если речь про описание методов API, то есть куча генераторов для этого. Если речь про пользовательскую документацию, то извините, а как это работает? Откуда бот узнает, как пользоваться софтом, который я разрабатываю?

Разработка парсеров, анализ и преобразование данных в любых форматах.

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

Анализ и преобразование данных: опять непонятно, что имеется в виду. Но мне представляется, что эксель справится лучше.

Работа с базами данных и SQL запросами.

Какая работа?

Поиск информации и кода, помощь в обучении, ответы на вопросы.

Тут скорее соглашусь, но уже которую неделю не могу понять, чем это принципиально отличается от вбивания вопросов в Гугл. Опять же, как это относится именно к программированию? Задача поиска информации слишком общая.

Поиск новых идей.

В чем, в программировании?

Сегодня не использовать ChatGPT просто глупо…

Нет умно.

Вот сегодня я попросил создать юнит тесты для одного метода. При этом попросил использовать конкретные фреймворки.

И вы знаете, у ChatGPT это здорово получилось. Я сэкономил кучу времени, особенно на секции assert, сравнивая кучу expected значений с actual значениями :)

генераторы юниттестов существуют больше десятилетия.

Мне нравится скидывать на него простые задачи, но которые занимают много времени. Например составление API документации под формат YAML.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий