Часть 1 тут.
Но доверять LLM (даже с тестами) - чревато, особенно в такой сложной задаче, поэтому кроме собственного теста, я попросил Евгения Пешкова (автора библиотеки ConcurrencyToolkit и довольно экспертного чувака по многопоточке) поревьюить результат, за что ему большое спасибо. Вот его комментарии:
1. Сейчас пермит добывается заново на каждый обрабатываемый элемент, это убивает эффект от распараллеливания, если элементы обрабатываются быстро. Эффективнее захватывать пермит один раз при старте воркера, а при изменении лимита убивать воркеров с номерами >= NEW_LIMIT.
2. Используется обычный lock для MoveNext, а в оригинальном ForEachAsync — SemaphoreSlim(1) в качестве асинхронного лока, что предотвращает блокировку тредпула, если MoveNext медленный
Во всяком случае, критических проблем обнаружено не было - и это уже хорошо. А PR с исправленными замечаниями приветсвуется :)
Кстати, у Жени есть великоплепный Telegram-канал про .NET, а еще множество глубоких докладов, которые я тоже могу горячо рекомендовать - сейчас, с развитием нейронок, глубокие знания о том, как все устроено под капотом получают еще большую ценность.
Код библиотеки и тесты тут.
Итоги итогов
Тандем лучших публичных нейронок на сегодня (o1-pro + Sonnet 3.5) в написании потокобезопасного кода проявил себя довольно достойно. Конечно, чтобы делать такие выводы уверенно необходимо, как минимум, повторить удачный эксперимент несколько раз в подряд, ну и желательно на разных задачах, но у нас просто нет столько времени. В принципе, если говорить конкретно о модели o1-pro, то одна из основных ее фишек именно в стабильности результата (в отличие от o1, которая может отдавать правильный ответ через раз), поэтому с высокой долей вероятности результат будет повторяемым.
Что еще может o1-pro?
Много чего. В целом, все самые сложные задачи на reasoning (НЕ на знание библиотек) o1-pro должна решать сильно лучше остальных моделей. Кроме того, у нее довольно большой контекст в 200к токенов на вход (впрочем, как и у o1), поэтому ей спокойно можно докидывать, например, всю документацию к вашей любимой библитеке и почти наверняка эта модель будет наиболее внимательна к деталям.
Еще, я пытался решить с o1-pro довольно сложную задачу на графы, но в полной мере это сделать так и не удалось - после нескольких итераций (код, тесты, output тестов LLM, фикс и все по новой), она думала по ~10 минут и стабильно предлагала неверное решение. Там весьма хитрая и запутанная логика обработки циклов внутри графа и o1-pro в ней явно путается. Удивительно, но в итоге последний затык мне смогла разрешить только старая добрая Sonnet 3.5 - по моим наблюдением, у Sonnet вообще как-то все очень хорошо с графами.
А какие самые сложные задачи на программирование доводилось решать вам с помощью LLM?
—
Пробелов.NET
