Search
Write a publication
Pull to refresh
5
0
Send message

"LLM — это производные от продуктов человеческого мышления; они не могут превзойти эту основу, как бы ни старались специалисты в OpenAI, Google или Anthropic, помешивая свои цифровые зелья в котлах." Звучит безапелляционно, однако, все же, вызывает сомнения. Было бы неплохо привести хоть какую-то аргументацию в пользу этого сильного утверждения.

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

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

Сильное утверждение, но настоящим провидцам можно и не такое. Однако в данном случае ваши телепатические возможности вас несколько подвели. Я бы сказал, что подвели буквально по всем пунктам.

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

А если давать не большие объемы, а адекватные?.. Помня о крайне ограниченном размере возможного ответа, какой смысл давать большие объемы для этой задачи?.. Если отправлять небольшими порциями, используя API, да еще и организовав проверку ответов с коррекцией в случае необходимости?.. А скрипт для решения вашей задачи нужен, а иначе как вы будете использовать API? Но этот скрипт будет несравенно проще, нежели те, что вы используете для решения этой задачи. Ну и уточню, что ответы ChatGPT и Sonnet 3.5 я привел в качестве демонстрации возможности LLM решить эту задачу. Для большого объема входных данных надо будет использовать API, я подумал, что это достаточно очевидно, но, судя по комментариям, я ошибался в этом.

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

Кажется, что в наше время такого рода задачки уже можно решать гораздо менее скромными усилиями, с лУчшим результатом и за гораздо мЕньшее время. Посудите сами. Любопытства ради, не заморачиваясь сколь-нибудь всерьез, я взял ваш пример из начала статьи, на быструю руку накидал промпт, и попросил LLM решить вашу задачку. Промпт выглядит так: "Я дам тебе список адресов, среди которых встречаются одинаковые, на записанные по-разному. Найди адреса, которые являются одними и теми же, пусть и записанными по-разному, и составь из них новый список, в котором будут присутствовать только уникальные адреса. Запиши адреса в этот список единообразно по следующему шаблону: {Населенный пункт}, {Улица}, {Дом/квартира и т.п.} <адреса>"д. Малое Шилово, ул. Березовая, д. 7"; "п. Ласьва, ул. Весенняя, д. 5"; "Луговой пер 5, Краснокамск г"; "д. Новая Ивановка, ул. Солнечная, 18"; "Весенняя 5Ласьва"; "д.Новая Ивановка, ул.Солнечная, 18"; "Березовая 7М Шилово"; "г. Краснокамск, пер. Луговой, 5"</адреса> Мой список адресов слегка отличается от вашего, я решил, что не стоит облегчать задачу ИИ, и разбил пары похожих адресов. Ответ ChatGPT-4: "

Для составления списка уникальных адресов необходимо:

  1. Привести все адреса к единому шаблону.

  2. Удалить дубликаты, учитывая их разные написания.

Общий шаблон: {Населенный пункт}, {Улица}, {Дом/квартира}.
Результат обработки:

  1. д. Малое Шилово, ул. Березовая, д. 7

  2. п. Ласьва, ул. Весенняя, д. 5

  3. г. Краснокамск, пер. Луговой, д. 5

  4. д. Новая Ивановка, ул. Солнечная, д. 18

Если требуется пояснение, как именно это было сделано, дайте знать!"

Этот же промпт я отправил в Claude Sonnet 3.5 и получил такой ответ: "

  1. д. Малое Шилово, ул. Березовая, д. 7

    • Исходные варианты:

      • "д. Малое Шилово, ул. Березовая, д. 7"

      • "Березовая 7_М Шилово"

  2. п. Ласьва, ул. Весенняя, д. 5

    • Исходные варианты:

      • "п. Ласьва, ул. Весенняя, д. 5"

      • "Весенняя 5_Ласьва"

  3. г. Краснокамск, пер. Луговой, д. 5

    • Исходные варианты:

      • "Луговой пер 5, Краснокамск г"

      • "г. Краснокамск, пер. Луговой, 5"

  4. д. Новая Ивановка, ул. Солнечная, д. 18

    • Исходные варианты:

      • "д. Новая Ивановка, ул. Солнечная, 18"

      • "д.Новая Ивановка, ул.Солнечная, 18"

"

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

  1. д. Малое Шилово, ул. Березовая, д. 7

  2. п. Ласьва, ул. Весенняя, д. 5

  3. г. Краснокамск, пер. Луговой, д. 5

  4. д. Новая Ивановка, ул. Солнечная, д. 18

"

На самом деле, если потратить чуть больше времени, то можно добиться от LLM ответов в любом желаемом формате. А если еще навостриться использовать API, то можно решать и не такие задачки.

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

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

Можно написать следующую статью, которая может вызвать более живой отклик у аудитории: "Как собеседовали бы при приеме на работу в пекарню, если бы к работникам пекарен подходили как к работникам it". Кажется, что типичное описание вакансии могло бы выглядеть как-то примерно так: "В нашу молодую, активно развивающуюся пекарню требуется тестомес. Знание механики, химии, микробиологии, санитарии, основ медицины обязательно. Хорошее знание сопромата будет плюсом. Требуется отличная физическая подготовка и развитые коммуникативные навыки. Обязателен опыт в замесе теста из муки разных сортов от ведущих производителей..." Ну и т.д. и т.п., чтобы никто не вздумал думать, что может месить тесто в нашей пекарне запросто так.

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

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

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

Я прямо растерялся. Но попробую ответить. Я думаю, что при решении подобного рода задач не стоит гнаться за микрооптимизацией, которая то-ли случится, то-ли нет (у нас нет никаких дополнительных сведений о данных). К тому же, о такого рода оптимизации в формулировке задачи нет ни единого намека. При решении такого рода задач стремятся получить приемлемую сложность "О-большое", и при этом было бы очень желательно, чтобы реализация выглядела "лаконично" и понятно. Было бы здорово, если бы реализация допускала легкую модификацию при небольшом изменении входных данных. Например, у нас данные были бы не за 2 дня, а за 17. И "лояльным" пользователем следовало бы считать того, кто посещал не все дни, а хотя бы 8 из 17, и посмотрел за это время хотя бы 25 уникальных статей. Думаю, что предложенное мной решение в целом удовлетворяет требованиям, которые я перечислил выше. Ну и стоит сделать поправку на то, что я приступил к решению задачи, стараясь решить ее как можно быстрее и проще, имея при этом приемлемое значение "О-большое", так, как я бы делал это на собеседовании. Должен заметить, что я сначала я даже не стал читать комментариев автора, мне хватило условия задачи, оно показалось мне вполне понятным и достаточно определенным для того, чтобы можно было приступить к решению. А для любой микрооптимизации нужны веские основания и глубокое погружение в проблему, вряд ли стоит углубляться в это дело на собеседовании по собственной инициативе. Можно легко самого себя закопать, если начать придумывать себе проблемы на пустом месте. Но я не настаиваю, если вы способны предусмотреть всевозможные нюансы, убедительно объяснить необходимость их учета, и мастерски разрешить их прямо во время собеседования, то конечно, вы будете иметь преимущество.

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

Спойлер
# O(n) - time complexity
# O(n) - space complexity

day1 = [
    {"t": 10, "page": 1, "user": 1},
    {"t": 11, "page": 2, "user": 3},
    {"t": 12, "page": 1, "user": 4},
    {"t": 13, "page": 1, "user": 5},
    {"t": 14, "page": 2, "user": 6},
    {"t": 15, "page": 2, "user": 7},
]

day2 = [
    {"t": 10, "page": 1, "user": 3},
    {"t": 11, "page": 2, "user": 7},
    {"t": 12, "page": 1, "user": 8},
    {"t": 13, "page": 1, "user": 1},
    {"t": 14, "page": 2, "user": 3},
    {"t": 15, "page": 2, "user": 2},
]

users = {}
for d, day in enumerate([day1, day2]):
    for record in day:
        user = record["user"]
        page = record["page"]
        if user in users:
            users[user]["days"].add(d)
            users[user]["pages"].add(page)
        else:
            users[user] = {"days": set([d]), "pages": set([page])}

for user in users:
    if len(users[user]["days"]) == 2 and (len(users[user]["pages"]) >= 2):
        print(f'userId={user}', users[user])

Не так давно видел предложение о многоуровневом собеседовании, на котором обещались задачки уровня hard, и это далеко не Amazon, Google и даже Microsoft.

1

Information

Rating
8,011-th
Registered
Activity

Specialization

Fullstack Developer