Comments 46
Клавдия тоже не справилась. И после исправлений становилось хуже. Несколько раз на ушибки указывал пока не исправилась :)
Удивительно, что он вообще понял уточняющий промпт, поскольку он составлен некорректно. По сути, промпт говорит,
- каждая цифра Страхового номера умножается на номер своей позиции (позиции отсчитываются с конца)
- полученные произведения суммируются
что используются ВСЕ цифры (т. е. 11 штук). И тогда результат должен быть другим. Однако же, машинка не повелась на провокацию.
AI-муннизм на отдельно взятом компе? И не мечтайте.
Мистраль дает бесплатно 500.000 токенов в минуту и 1млрд в месяц. https://console.mistral.ai/limits/
Если средний запрос весит 20т токенов то это примерно 25 в минуту и 50000 в месяц.
У них есть большая модель заточенная под код - codestral.
С перекладыванием байтиков (парсинг например) с места на место они по-моему все плохо справляются.
Если кто-то, у кого есть оплаченный доступ, может протестировать - будьте добры.
Там не нужен оплаченый доступ, модель просто доступна бесплатно на сайте по регистрации, ну и веса как обычно на HF. Кстати в отличие от очень многих других, даже телефон не требует при регистрации.
Основная модель справилась сразу насколько могу судить: https://chat.mistral.ai/chat/ff0626be-b8ed-424e-9c86-f708cf83754f

Не исключаю, что в обучающей выборке было. Не смог вспомнить сходу где у них переключение моделей в веб-интерфейсе, если не забуду, вечером попробую именно на codestral запустить
И уточните пожалуйста, вот тот насыщенный оборот про покушать\погулять и т.п. - сколько времени занимает на самом деле? Он меня слегка удивил, поскольку 32B-модель на вашем железе должна даже неквантизованной весьма оперативно отвечать. Возможно не 100500т\с, но я бы точно на один ответ покушать не успел бы. Покушать - это как раз 123B mistral без квантов, запущенная в RAM - там 5-15 минут на ответ уходит.
Дополню.
На сайте так и не нашел, поэтому локально погонял на двух модельках. Как в вашем примере qwen2.5-coder-32b-instruct-q5_k_m и Codestral-22B-v0.1-Q6_K.
На первой скорость ответа на 13900K вообще без видяхи 2-3 минуты. Ровно за две минуты выдала весь код и еще минуту дописывала комментарии. Всё ещё недоумеваю как вы так быстро гуляете и кушаете. Результат ожидаемо совпадает с вашим (сид не помог), дальше мучить не стал.
Кодестрал локально (помним, что системного промта с сайта нет) поразил до глубины души :D
>>Переделай из VB в c#:
function CheckPFNumber(const Value:String):Boolean;
var I,Summa:Integer;
begin
Result:=False;
if Length(Value)<>11 then
exit;
for I:=1 to 11 do
if not (Value[I] in ['0'..'9']) then
exit;
Summa:=0;
for I:=1 to 9 do
Inc(Summa,StrToInt(Value[I])*(10-I)); // вычисляем контрольную сумму
Result:=StrToInt(Copy(Value,10,2))=(Summa mod 101); // проверяем остаток от деления контрольной суммы на 101 с двумя последними числам
end;
>>using System;
public class Program
{
public static void Main(string[] args)
{
string value = "12345678901"; // замените на свое значение
bool result = CheckPFNumber(value);
Console.WriteLine("Result: " + result);
}
public static bool CheckPFNumber(string value)
{
if (value.Length != 11)
{
return false;
}
foreach (char c in value)
{
if (c < '0' || c > '9')
{
return false;
}
}
int sum = 0;
for (int i = 0; i < 9; i++)
{
sum += int.Parse(value[i].ToString()) * (10 - i);
}
string lastTwoDigits = value.Substring(9, 2);
int lastTwoDigitsInt = int.Parse(lastTwoDigits);
return sum % 101 == lastTwoDigitsInt;
}
}
>>Проверь соответствие CheckPFNumber следующему алгоритму: Контрольное число Страхового номера рассчитывается следующим образом:
- каждая цифра Страхового номера умножается на номер своей позиции (позиции отсчитываются с конца)
- полученные произведения суммируются
- сумма делится на 101
- последние две цифры остатка от деления являются Контрольным числом.
>>Да, CheckPFNumber соответствует указанному алгоритму.
Функция CheckPFNumber принимает в качестве параметра строку `value`, которая должна содержать Страховой номер. Функция проверяет, соответствует ли длина строки 11 символам. Если нет, функция возвращает false.
Затем функция проверяет, содержит ли строка только цифры. Если в строке присутствует любой символ, который не является цифрой, функция возвращает false.
После этого функция вычисляет сумму произведений каждой цифры на ее позицию в строке (позиции отсчитываются с конца). Это делается в цикле for, который итерируется от 0 до 8 (т.к. индексы в строке начинаются с 0, а позиции с конца у нас от 1 до 9).
Затем функция извлекает последние две цифры из строки и преобразует их в целое число `lastTwoDigitsInt`.
Наконец, функция проверяет, равно ли `sum % 101` значению `lastTwoDigitsInt`. Если да, функция возвращает true, в противном случае - false.
Таким образом, функция CheckPFNumber проверяет, соответствует ли переданный Страховой номер заданному алгоритму вычисления Контрольного числа.
>>Проверь, что рассчет позиции цифры страхового номера рассчитывается корректно.
>>Да, расчет позиции цифры в Страховом номере выполняется корректно в функции CheckPFNumber.
В цикле for, который итерируется от 0 до 8, каждая цифра Страхового номера умножается на ее позицию в строке, считая от конца. Позиция цифры вычисляется как `(10 - i)`, где `i` - индекс цифры в строке (начиная с 0). Таким образом, первая цифра имеет позицию 9, вторая цифра имеет позицию 8, и так далее.
Например, если Страховой номер равен "12345678901", то первая цифра "1" будет умножена на 9, вторая цифра "2" будет умножена на 8, и так далее.
>>Проверь еще раз, какой множитель будет у первой цифры.
>>Да, у первой цифры в Страховом номере будет множитель 9.
В цикле for, который итерируется от 0 до 8, каждая цифра Страхового номера умножается на ее позицию в строке, считая от конца. Позиция цифры вычисляется как `(10 - i)`, где `i` - индекс цифры в строке (начиная с 0).
Таким образом, первая цифра имеет индекс 0 в строке и позицию 9, поэтому первая цифра будет умножена на 9.
>>Покажи по шагам, как для первой цифры получается её множитель
>>Да, я могу показать, как получается множитель для первой цифры в Страховом номере в функции CheckPFNumber.
В цикле for, который итерируется от 0 до 8, каждая цифра Страхового номера умножается на ее позицию в строке, считая от конца. Позиция цифры вычисляется как `(10 - i)`, где `i` - индекс цифры в строке (начиная с 0).
Для первой цифры в строке `i` равно 0, поэтому для ее множителя используется формула `(10 - i)`, которая дает `10 - 0 = 10`. Однако, поскольку позиции отсчитываются с конца, то позиция первой цифры равна 9, а не 10. Таким образом, множитель для первой цифры будет равен `(10 - i) = 9`.
Например, если Страховой номер равен "12345678901", то первая цифра "1" будет умножена на 9, вторая цифра "2" будет умножена на 8, и так далее.
(вывод из консоли, отбивки сам добавил для хоть какой-то читаемости)
Честно скажу, в какой-то момент я даж сам засомневался в правоте, но под занавес поржал. Домучивать тоже не стал. Что могу сказать.. тест не пройден, но было забавно.
Точное время я к сожалению, сразу не догадался зафиксировать, а потом было поздно. Причём собирался я мерить скорость, да, вот такой я сообразительный. Изначально первый промпт был больше - там было больше функций. У меня глаз зацепился именно за грубую ошибку в расчёте КС СНИЛС, про время я тут же забыл. Дальше части моделей задавался уже упрощённый промпт с одной функцией. Соответственно, из-за разного размера контекста измерение времени стало вообще некорректно. Можно было бы начать все сначала и замерить, но вот такой я трудолюбивый и упорный.
Субъективно для меня страшно медленно уже 2-3 символа в секунду. Я просто пока пишу промпт, уже представил себе, как результат должен выглядеть. С большей скоростью я уже могу сам написать/поправить, сидеть ждать это пытка. И вы не забывайте, что это в статье голый код вырезан, а ответ LLM в чате это же в 99% случаев "Да, как здорово что ты спросил! Сейчас я выведу несколько килобайт ненужного текста, пока раздумываю непосредственно над кодом, и очень здорово что ты поддерживаешь меня морально, читая весь этот никому не нужный словесный мусор..."
Периодически локально использую Qwen2.5-Coder-32B-Instruct в четвертом кванте для рефакторинга, в сравнении с Q5 прям особой разницы не заметил, но благодаря меньшему весу в тот же объём vram помещается больше контекста.
Надо понимать что ответы любой LLM очень "недетерминированы", сейчас она ответила верно, но при следующем свайпе напишет чушь, и наоборот. Реальную потерю интеллекта можно отследить только многократной проверкой и тестами отклонения токенов в сравнении с неквантованной моделью.
Я видел много тестирований, в среднем у ~30b моделей отклонения от эталона выглядят следующим образом:
(все очень примерно)
q6_K: ~1%
q5_K_M: 2-3%
q4_K_M: 4-6%
q3_K_M: 20-30%
Чем жирнее модель тем меньше потери. 70b модели почти не теряют мозги даже на q3, и наоборот, 12b тупеют почти на 10% уже на q4.
А зачем запускать локально?
https://huggingface.co/spaces/Qwen/Qwen2.5-Turbo-1M-Demo
https://huggingface.co/spaces/Qwen/Qwen2.5
Автор, умоляю тебя, попробуй claude 3.5 sonnet он очень хорошо кодит и сравни его пж в своих тестах. Я думаю тебе понравится его результат.
Первый комментарий про claude, но посмотрю сам
я в качестве хоббита пытаюсь в последнее время крафтить то одно то другое используя сетки. клавдия отнюдь не жжот: ровно так же врёт как другие, пытается сделать то, что невозможно с уверенностью и доказывая, что всё хорошо... :) в общем, благо я делаю вещи которые мне не жаль в mit отдать -- так что thumbs down я жму там постоянно...
o1 мне как-то показала два варианта абсолютно неправильных ответов с разным количеством галлюцинаций в каждом -- и спросила, а какой лучше?... ответа "оба отстой" не нашёл.
gemini пока мой фав -- в состоянии иногда сказать что запутался и не получается, где другие в ответ на указание ошибки начинают ходить по кругу...
Уверен, что логика экономии как основание для использования открытых моделей в программировании не работает сейчас, а в будущем не будет работать вовсе. 32B-модели можно запускать q8_0 на 2x3090 - это 120 000 рублей по низу бу рынка. За эти деньги сейчас можно на всю оставшуюся жизнь купить токенов для deepseek-v3 670B. Жаль, что аттракцион невиданной щедрости, наверняка не вечен. Просо ради интереса, для запуска DeepSeek V3 нужно 30шт RTX3090, а это 2 000 000, если рассчитывать на бу-ускорители.
Тем, не менее, меня очень воодушевляет наличие моделей с отрытыми весами и по своей работе я пользуюсь из принципиальных соображений только открытыми моделями, даже если использую их через api. Уж если платить за ИИ, то тем, кто выпускает модели открыто, поддерживая их деньгами. И, как я думаю, сами запросы представляют из себя отдельную ценность для провайдера, так как позволяют оценить наиболее востребованные сценарии использования модели, а так-же вычислить моменты когда модель не справляется с задачами, ориентируясь на перегенерации.
Я все же купил пару rtx 3090 и с qwen даже 72B q8_0 (в режиме оффлоада на процессор) проблем с производительностью нет. Но вот развернуть инфраструктуру для deepseek я уже не смогу, да и не имеет экономического смысла, даже если цены на использование модели вырастут в 10 раз.
Уже писал сверху в комментариях - это логика selfhosted, а она не про экономию, на самом деле. 20$ - это, конечно, маленький кликбейт, сознаюсь.
Не стоит так скептически смотреть в будущее. На самом деле взамен толстым видеокартам можно использовать мак с M-чипом. Там ОЗУ объединена с видеопамятью, поэтому можно запускать сравнительно большие модели. Например на M1 Max можно запускать модели до 72b параметров, даже со сносной производительностью. Плюс люди работают над оптимизацией алгоритмов, и появляются новые, более эффективные архитектуры, и маленькие модели постепенно бьют старые, но большие. Например если бы появилась маленькая модель с возможностями старой GPT-4 - я бы с радостью отказался от затрат на сервисы и встроил её в свой рабочий процесс. Нужна не самая умная модель, нужна *достаточно* умная.
Есть также агрегаторы, которые позволяют без подписки использовать frontier-модели и платить за токены, например OpenRouter. Если меня не устроит результат работы локальной модели - я могу потратить 2 рубля на тот же Claude 3.5 Sonnet (beta) или o1 на 6р. Задача решена :)
1) не все языки программирования одинаково хорошо представлены в моделях, чем меньше размер модели, тем хуже она пишет на чем-то отличающемся от питона.
2) квен не обучался специально для обработки русского языка, запросы на ангийском обычно дают более качественный результат
3) для быстрой работы qwen-32b достаточно одной Nvidia 3090 со вторичного рынка, разницы между q5 и q8 вы, скорее всего, не заметите.
4) если модель не входит в GPU и переливается в обычную память, пробуйте запуск с драфт моделью, обычно это даёт 30-40% пророста к скорости (читать про speculative decoding)
Подскажите, может вы в курсе: что лучше использовать для java? Где лучшие модели?
Из того что можно запускать на типичных домашних GPU выбор пока что только между deepseek-coder-33b и qwen2.5-coder-32b, специально для явы никто модели не обучает, но в целом они справляются, вполне могут за вас тесты написать или родить что-то по внятному описанию, более мелкие модели можно использовать в режиме "подсказка одной строки" или "подсказка фрагмента", но их польза ограниченна.
Хорошая модель в облаке для вопросов по коду - https://chat.deepseek.com/ цены на доступ через API там тоже очень низкие, но наверное могут быть сложности с оплатой.
deepseek сконвертировал с первого раза правильно, на первый взгляд:
using System;
public class PFNumberChecker
{
public static bool CheckPFNumber(string value)
{
if (value.Length != 11)
return false;
foreach (char c in value)
{
if (!char.IsDigit(c))
return false;
}
int summa = 0;
for (int i = 0; i < 9; i++)
{
summa += int.Parse(value[i].ToString()) * (10 - (i + 1));
}
int lastTwoDigits = int.Parse(value.Substring(9, 2));
return lastTwoDigits == (summa % 101);
}
}
спасибо, поэкспериментирую с ним :)
Судя по всему, кожаные мешки пока в безопасности. ИИ на данном этапе может не забрать, а подкинуть работы )
Но всё же интересно, как на практике ИИ справляется с переписыванием небольших (по современным меркам) проектов и внесением правок в существующий код в связи с новыми фичами или хотя бы рефакторингом. Есть такие примеры?
с "переписыванием" плохо. с правками -- через кожаного мешка с такой-то матерью. новые фичи добавлять проще, но получается очень лоскутное одеяло, так как подряд две фичи может советовать добавлять с разными стилями форматирования - названия файлов - организации кода - и так далее.
если просто молча соглашаться с тем, что он говорит -- уже к третьей фиче у него самого едет крыша :D
Мне понравилось для пет-проектов и для входа в незнакомые, или слабознакомые языки Дефолтное дружелюбие ответа очень заметно помогает, вместо традиционного "афтар выпей йаду" в разных вариациях ответов сети. В области своей экспертизы и там, где за результат надо отвечать - очень больно смотреть на вывод моделек, увы.
А я использую gemma2 (9b) + ollama часто . На макбуке с м2 про и 32гб работает около 30 токенов в секунду, и часто результат вполне приемлемый. Для рутины - написать тесты, что-то быстро сгенерировать - вполне хватает.
Ура, в интернете опять кто-то не прав очередной срыв покровов. Первое и самое главное: запросы/промпт на русском языке? Если да - спасибо большое за тесты, можете их выкидывать.
На qwen данные закрыты, даже описания данных нет, так что мы не знаем как именно файнтюнили instruct, но предположительно на английском и китайском, и попугаев меряют на английском. Ожидать от него self-repair на русском... ну да, оно может ответить вам что-то на русском, иногда даже чудом сработать. Но именно такие "случайно оказавшиеся" или "случайно оставшиеся" знания очень быстро отмирают при любом квантовании.
Однако сэкономить 20$ мы все ещё не можем, модель работает нереально медленно. RTX 5090 мы купим чуть позднее
А может быть, чтобы сэкономить, нужно уметь пользоваться гуглом? https://deepinfra.com/Qwen/Qwen2.5-Coder-32B-Instruct Вот она же за $0.16/1M, что при использовании в режиме чата во много десятков раз дешевле, чем $20 в месяц. Я лично пока на $1 ещё наскрести не смог. Да даже API к GPT-4o-mini стоит $0.60/1M, хотя по попугаям уступает. А ведь есть бесплатный доступ к Mistral, а ведь есть бесплатный доступ к Gemini, а ведь есть временно почти бесплатный DeepSeek-V3.
В общем, локально смысл есть запускать только маленькие модели для автокомплита или "умных" подсказок под табуляцией. Тут и latency минимальная нужна, а до видеокарты пинг нулевой и очереди нет, и токены улетают очень уж быстро при таком варианте использования, так что локально может оказаться правда дешевле, да и условных 3b-base или 7b-base достаточно, поэтому карточка уровня 3080ti и перформанс обеспечит, и под контекст запас останется.
Ну и в-третьих, Qwen2.5-coder-32b - это весьма капризная модель. Китайцы похоже тюнили её до посинения, поэтому она сильнее других тупеет даже при небольшом квантовании, о чём ещё давно были посты на r/LocalLLaMA. Ну и плюс нужны точные параметры токенайзеров: https://huggingface.co/Qwen/Qwen2.5-Coder-32B-Instruct/blob/main/generation_config.json
Так что да, opensource - это часто не про "бесплатно сел и поехал". Часто или всегда.
Мне нравится, что все читают заголовок, код и игнорируют весь остальной текст. Мои мысли никому не важны, чтд :)
На всякий случай повторю, раз из текста это не понятно - очевидным образом я и не надеялся на экономию в 20$ просто потому, что она не существенна. Кликбейт. Маленький грех для автора статьи. Но я серьёзно перехожу на selfhosted решения и к поиску LLM отношусь в этой ситуации серьезно.
Насчёт промптов на русском - второй промпт не может быть на английском по очевидным причинам.
Разумеется, экономия $20 - не серьёзная цель, и тем не менее, её легко можно достичь. Для меня принципиален бойкот платных продуктов OpenAI, а экономия выходит как-то сама собой.
Переходить на self-hosted можно, «но зачем» (c). Серьёзно переходить - это купить серверные карточки за очень неприличные суммы в долларах. И это по силам компании, которой, например, ну очень важна приватность. Остальное - это в любом случае эрзац, иногда даже почти без специфического запаха. Поэтому я перешёл на связку чат через API + autocomplete локально на 4080, чего и всем рекомендую. Так и приватность контролируется, потому что код без вашего ведома никуда не улетает, и дёшево-сердито баланс соблюдён.
Насчёт промптов на русском - второй промпт не может быть на английском по очевидным причинам.
Я вас понимаю, но проблемы индусов русских программистов китайцев не волнуют) Маленькие модельки могут быть заменой топовых LLM в своей узкой области, иногда слишком узкой. Так что надо бы выучить наконец-то английский пользоваться переводчиком для любых нетривиальных задач. Обычно даже если ту же модельку попросить перевести текст на английский, а потом её перевод в неё же скопировать как запрос, результат улучшается. Ограничения instruct-файнтюнов, сэр.
Кстати, насчет API + autocomplete, что именно используется в качестве IDE? Как подключен autocomplete? Надо бы рисерч провести в эту сторону, наверняка для каждого языка/среды среди груды поделок уже есть что-то толковое.
Пользуюсь Continue в VS Code, у них и для JetBrains есть плагинчик. Не утверждаю, что из остальных поделок эта сколь-нибудь лучше других, но мои потребности закрывает: там и чат, и autocomplete.
Для второго хватает qwen2.5-coder:3b-base поднятого в ollama, формат для Fill-In-The-Middle взял с их гитхаба. Можно побольше, но мне скорость приоритетнее незначительного роста интеллекта. Для чата использую его же 32b с deepinfra, хотя вот попробую DeepSeek-v3 через openrouter приспособить, очень уж интересно.
В современном мире серьёзно рассчитывать на внешние сервисы глупо. Сегодня есть, завтра нет. Поднять у себя что-то размера 70b достаточно дешево даже для физ лица, для юр. совсем несущественно. Никто впрочем не запрещает при этом пользоваться облаками пока они ещё доступны, но в случае чего у вас останется крепкий тыл(если ваши потребности укладываются в этот формат офк.).
В общем тут вопрос не про экономику, а про доступность.
Если ваш бизнес/доход напрямую зависит от доступности внешних сервисов, так ещё и в другой стране - это неразумно, сложно не согласиться. Но мы же не про коня в вакууме, а про описанный кейс ленивого эффективного программиста, для которого LLM - это удобный инструмент, а не жизненная необходимость.
Мой пойнт в том, что под указанную задачу пытаться догнать облако на своём ПК - это и экономически неэффективно, и нецелесообразно. Хотя с нюансами, такими как отсутствие русского языка, возможно. А без нюансов и 70b моделью, увы, не обойтись.
Вообще вот интернет-поисковик для работы нужен не меньше, но почему-то почти никто не говорит всерьёз, что надо поднимать свой локальный, а то ведь как-то глупо на Google рассчитывать. И чем же это принципиально отличается от того, чтобы рассчитывать на их же Gemini?
Попробуйте сэкономить использую deepseek. Тут ещё советовали mistral - их модель codestral отлично пишет код.
Не знаю как дела отстоят в россии с openrouter, но если есть возможность регистрации без танцев с бубном, вы открываете для себя доступ к куче моделей за копейки. Тот же deepseek в vscode можно использовать в расширении типа cline или roo-cline, его можно просить самому код написать/переписать/переделать/объяснить и он это сделает. Это будет стоить какие-то десятитысячные цента. Это зависит от контекста и токенов использованных и отданных моделью. Еще можно абсолютно бесплатно использовать расширение для подсказки кода по типу codeium, там есть чат, где можно попросить его переписать код.
Ну и не забывайте про codestral, можно установить расширение continuedev бесплатно получить ключик апи у mistral на их сайте, настроить чат с codstral и подсказки по коду используя свой ключик в continuedev. Это бесплатно.
В общем возможностей вагон и покупка видеокарты, это не экономия. Сколько должен локальный ИИ сгенерировать кода, чтоб она окупилась?
Протестируй gigachat, deepseek
Модель hf.co/t-tech/T-pro-it-1.0-Q4_K_M-GGUF
за несколько секунд на 3090 с первого раза выдала такой ответ:
---
Вот как можно переписать данный код с языка Visual Basic (VB) в C#:
public bool CheckPFNumber(string value)
{
if (value.Length != 11)
return false;
// Проверяем, что все символы являются цифрами
foreach (char c in value)
{
if (!Char.IsDigit(c))
return false;
}
int summa = 0;
for (int i = 0; i < 9; i++)
{
// StrToInt в VB соответствует value[i] - '0' в C#
summa += (value[i] - '0') * (10 - (i + 1));
}
// Получаем последние два символа как число и сравниваем с остатком от деления
int checkSum = Int32.Parse(value.Substring(9, 2));
return checkSum == (summa % 101);
}
Вот основные изменения, которые были внесены:
Использовано
foreach
для проверки, что все символы строки являются цифрами.В C# индексы строк начинаются с 0, поэтому используется
i + 1
при вычислении веса.Для преобразования символа в число используется
(value[i] - '0')
, так как это эквивалент операцииStrToInt
.Использован метод
Substring
для извлечения последних двух символов, который соответствуетCopy
в VB.Возвращаемое значение типа
bool
для совместимости с C#.
Реальная эффективность Qwen 2.5 Coder против ChatGPT (или можно ли сэкономить 20$?)