Китайцы сделали новую нейросеть Kimi, должна стать преемником DeepSeek.
Сегодня немного потестировал. На первый взгляд понравилась. Попросил перевести текст с английского на русский (лень было читать в оригинале), выборочно проверил - отличный перевод. Создала несколько картинок, правда, на одной возникли проблемы - человек сидел на невидимом стуле *ROFL* .
Попросил написать программный код на Python, простую задачу на уровне школы - рекурсивное вычисление факториала с проверкой исходных данных (число целое, неотрицательное, не должно быть слишком большим, чтобы стек не переполнить при рекурсивном вызове). Вот ответ вообще без моих правок, комментарии тоже от нейросети:
Параметры
---------
n : int
Неотрицательное целое число ≤ 250.
Возвращает
----------
int
Значение n!.
Исключения
----------
TypeError
Если n не целое число.
ValueError
Если n < 0 или n > 250.
RecursionError
Если превышена максимальная глубина рекурсии (при n > ~995
по умолчанию, но мы ограничиваем 250, так что не должно возникать).
"""
# Тип входных данных
if not isinstance(n, int):
raise TypeError(
f"Аргумент должен быть целым числом (int), получен: {type(n).__name__}"
)
# Диапазон значений
if n < 0:
raise ValueError("Факториал не определён для отрицательных чисел.")
if n > 250:
raise ValueError("Факториал для n > 250 не поддерживается.")
# Рекурсивный базовый случай
if n in (0, 1):
return 1
# Рекурсивный шаг
return n * factorial(n - 1)
# ------------------------------------------------------------------
# Примеры использования и быстрые тесты
# ------------------------------------------------------------------
if __name__ == "__main__":
test_values = [0, 1, 5, 10, 20, 250]
for v in test_values:
try:
print(f"{v}! = {factorial(v)}")
except (TypeError, ValueError) as e:
print(f"Ошибка при вычислении {v}!: {e}")
# Примеры ошибок
for bad in (-3, 3.14, "42", 251):
try:
factorial(bad)
except (TypeError, ValueError) as e:
print(f"Ожидаемая ошибка для {bad!r}: {e}")
Год назад ставил DeepSeek на локалку. Покрутился с полгода, давал путанные советы, и тогда понял, что программистам они ещё не замена. Снёс. Здесь потребовалось всего 15 минут, чтобы сделать всё намного лаконичнее. К чему Kimi нужно было такую "портянку" разворачивать?
text
MAX_N = 250
def factorial(n: int) -> int:
"""Рекурсивно вычисляет факториал n (n >= 0, n <= MAX_N)."""
if not isinstance(n, int):
raise TypeError("n должен быть целым числом (int)")
if not (0 <= n <= MAX_N):
raise ValueError(f"n должно быть в диапазоне 0..{MAX_N}")
return 1 if n < 2 else n * factorial(n - 1)
if __name__ == "__main__":
for v in [0, 1, 5, 10, 20, MAX_N, -3, 3.14, "42", MAX_N + 1]:
try:
print(f"{v}! = {factorial(v)}")
except Exception as e:
print(f"Ошибка для {v!r}: {e}")
Смотри сам: проверка диапазона стала компактнее:
text
if not (0 <= n <= MAX_N)
сократился базовый случай:
text
return 1 if n < 2 else ...
ограничение вынесено в константу [console=inline]MAX_N[/console]
тестовые значения объединены в один цикл
и, наконец, докстринг стал короче, но остался таким же информативным.
Смотри сам: проверка диапазона стала компактнее: if not (0 <= n <= MAX_N)
Вот посмотри сам вначале, что это разные ограничения и типы ошибок, а потом критикуй.
Для отрицательных чисел функция не определена вообще, а для n > 250 мы ограничиваем искусственно, чтобы избежать переполнения стека при рекурсии. Пользователю лучше отдать разные типы ошибок в этом случае.
Мы можем не ограничивать вообще сверху (в теории), а вот снизу в любом случае будет 0. И да, я в курсе, что можно так:
text
if n in (0, 1):
return 1
else
return n * factorial(n - 1)
Можно и вообще это в одну строку разместить с тернарным оператором. Но я не менял код вообще, комментарии тоже нейросеть писала.
Я "Утку" гоняю, порой весьма выручает :) А если по мере развития "диалога" давать уточнения, иной раз получается код, не требующий вообще никакой доводки. Попросил помочь с переносом [console=inline]/var/lib/dkms[/console] в память, и с GPT4o-mini получился такой диалог:
Показать
Я: Помоги перенести /var/lib/dkms в tmpfs с помощью systemd-mount юнита.
GPT-4o mini:
Чтобы перенести [console=inline]/var/lib/dkms[/console] в [console=inline]tmpfs[/console] с помощью юнита [console=inline]systemd-mount[/console], вам нужно создать временную файловую систему и настроить её монтирование. Вот шаги, которые вам нужно выполнить:
Создайте файл юнита для монтирования. Создайте файл, например, [console=inline]/etc/systemd/system/var-lib-dkms.mount [/console]с содержимым:
text
[Unit]
Description=Mount /var/lib/dkms in tmpfs
DefaultDependencies=no
After=local-fs.target
[Mount]
What=tmpfs
Where=/var/lib/dkms
Type=tmpfs
Options=size=100M # Укажите размер tmpfs по вашему усмотрению
[Install]
WantedBy=multi-user.target
В этом файле вы можете настроить размер tmpfs в опции Options. Например, [console=inline]size=100M [/console]устанавливает размер в 100 мегабайт.
Создайте директорию для монтирования. Убедитесь, что директория [console=inline]/var/lib/dkms[/console] существует:
[console=user]sudo mkdir -p /var/lib/dkms[/console]
Переместите существующие данные. Если в [console=inline]/var/lib/dkms[/console] уже есть данные, переместите их во временную директорию, чтобы они не потерялись:
[console]sudo mv /var/lib/dkms /var/lib/dkms.bak
sudo mkdir /var/lib/dkms
[/console]
Перезагрузите systemd и активируйте юнит:
[console]sudo systemctl daemon-reload
sudo systemctl start var-lib-dkms.mount
sudo systemctl enable var-lib-dkms.mount[/console]
Проверьте, что монтирование прошло успешно:
[console=user]mount | grep /var/lib/dkms[/console]
Теперь [console=inline]/var/lib/dkms[/console] будет монтироваться в [console=inline]tmpfs[/console] при загрузке системы. Если вам нужно восстановить данные из резервной копии, вы можете скопировать их обратно из [console=inline]/var/lib/dkms.bak.[/console]
Я: Нужно, чтобы при загрузке системы данные переносились c диска в tmpfs, а при перезагрузке -- обратно.
GPT-4o mini:
Чтобы реализовать перенос данных из диска в tmpfs при загрузке системы и обратно на диск при перезагрузке, вам нужно использовать два юнита [console=inline]systemd[/console]: один для монтирования [console=inline]tmpfs[/console] и другой для копирования данных. Вот как это можно сделать:
Шаг 1: Создание юнита для монтирования [console=inline]tmpfs[/console]
Создайте файл юнита для монтирования [console=inline]tmpfs[/console], например, [console=inline]/etc/systemd/system/var-lib-dkms.mount[/console]:
text
[Unit]
Description=Mount /var/lib/dkms in tmpfs
DefaultDependencies=no
After=local-fs.target
[Mount]
What=tmpfs
Where=/var/lib/dkms
Type=tmpfs
Options=size=100M # Укажите размер tmpfs по вашему усмотрению
[Install]
WantedBy=multi-user.target
Шаг 2: Создание юнита для копирования данных при загрузке
Создайте файл юнита, который будет копировать данные с диска в [console=inline]tmpfs[/console], например, [console=inline]/etc/systemd/system/copy-dkms-to-tmpfs.service[/console]:
text
[Unit]
Description=Copy DKMS data to tmpfs
After=var-lib-dkms.mount
Шаг 3: Создание юнита для копирования данных при перезагрузке
Создайте файл юнита, который будет копировать данные обратно на диск при перезагрузке, например, [console=inline]/etc/systemd/system/copy-dkms-to-disk.service[/console]:
text
[Unit]
Description=Copy DKMS data back to disk
DefaultDependencies=no
Before=shutdown.target
Шаг 4: Создание резервной директории
Убедитесь, что резервная директория существует:
[console]sudo mkdir -p /var/lib/dkms.bak[/console]
Шаг 5: Перезагрузка и активация юнитов
Теперь перезагрузите systemd и активируйте юниты:
[console]sudo systemctl daemon-reload
sudo systemctl enable var-lib-dkms.mount
sudo systemctl enable copy-dkms-to-tmpfs.service
sudo systemctl enable copy-dkms-to-disk.service
[/console]
Шаг 6: Проверка
Перезагрузите систему и проверьте, что данные корректно копируются в [console=inline]tmpfs[/console] при загрузке и обратно на диск при перезагрузке.
[console]#После перезагрузки проверьте содержимое
ls /var/lib/dkms[/console]
Теперь у вас настроена система, которая будет переносить данные из диска в [console=inline]tmpfs[/console] при загрузке и обратно на диск при перезагрузке.
Я: Я отладил оба сервиса и они отрабатывают. Но mount-юнит не отрабатывает, в строке Loaded указано, что bad-setting. Но я не вижу, в чём проблема. Текст юнита скопирован и вставлен.
GPT-4o mini: Если у вас возникла проблема с юнитом монтирования, и в строке Loaded указано bad-setting, это может быть связано с несколькими возможными ошибками в конфигурации. Давайте проверим несколько моментов:
1. Проверка синтаксиса юнита
Убедитесь, что в юните нет лишних пробелов или неправильных символов. Вот пример правильного юнита для монтирования tmpfs:
text
[Unit]
Description=Mount /var/lib/dkms in tmpfs
DefaultDependencies=no
After=local-fs.target
[Mount]
What=tmpfs
Where=/var/lib/dkms
Type=tmpfs
Options=size=100M # Укажите размер tmpfs по вашему усмотрению
[Install]
WantedBy=multi-user.target
2. Проверка имени файла
Убедитесь, что файл юнита называется именно [console=inline]var-lib-dkms.mount[/console] и находится в правильной директории [console=inline]/etc/systemd/system/[/console].
3. Проверка логов
Проверьте логи [console=inline]systemd[/console] для получения более подробной информации о проблеме. Используйте следующую команду:
[console=user]journalctl -xe
[/console]
Или проверьте конкретный юнит:
[console=user]systemctl status var-lib-dkms.mount[/console]
4. Проверка зависимостей
Убедитесь, что все зависимости, указанные в юните, корректны. Например, если [console=inline]local-fs.target [/console]не загружается, это может вызвать проблемы.
5. Проверка конфигурации [console=inline]tmpfs[/console]
Убедитесь, что у вас достаточно памяти для создания [console=inline]tmpfs[/console] указанного размера. Если размер [console=inline]tmpfs[/console] слишком велик для доступной оперативной памяти, это может вызвать проблемы.
6. Проверка прав доступа
Убедитесь, что у [console=inline]systemd[/console] есть права на доступ к директории [console=inline]/var/lib/dkms[/console]. Если директория не существует или у неё неправильные права, это также может вызвать ошибки.
7. Перезагрузка [console=inline]systemd[/console]
После внесения изменений в юнит, не забудьте перезагрузить [console=inline]systemd[/console]:
[console=user]sudo systemctl daemon-reload[/console]
8. Пример исправленного юнита
Если вы все еще не можете найти проблему, попробуйте использовать следующий минимальный пример юнита:
text
[Unit]
Description=Mount /var/lib/dkms in tmpfs
DefaultDependencies=no
After=local-fs.target
Если после всех проверок проблема не решится, пожалуйста, предоставьте вывод команды [console=inline]systemctl status var-lib-dkms.mount[/console] и любые сообщения об ошибках из [console=inline]journalctl[/console], чтобы можно было более точно диагностировать проблему.
Я: Заработало, спасибо.
GPT-4o mini: Отлично! Рад слышать, что всё заработало. Если у вас возникнут дополнительные вопросы или потребуется помощь в будущем, не стесняйтесь обращаться. Удачи с вашим проектом!
Я: А [console=inline]tmpfs[/console] можно научить автоматически увеличиваться в размерах, если текущего размера недостаточно?
GPT-4o mini: [console=inline]tmpfs[/console] может автоматически увеличиваться в размерах, если текущего размера недостаточно, но это зависит от доступной оперативной памяти на вашем устройстве. По умолчанию [console=inline]tmpfs[/console] использует память, и его размер может динамически изменяться в пределах установленного максимума.
Настройка [console=inline]tmpfs[/console]
Когда вы монтируете tmpfs, вы можете указать максимальный размер, который он может занимать. Например, если вы укажете [console=inline]size=100M[/console], [console=inline]tmpfs[/console] будет занимать до 100 мегабайт, но может использовать меньше, если в этом нет необходимости. Если вы не укажете размер, tmpfs будет использовать доступную память до максимума, установленного в системе.
Пример монтирования без ограничения размера
Если вы хотите, чтобы tmpfs мог использовать всю доступную память, вы можете не указывать параметр size или установить его в значение, равное доступной памяти. Например:
Ограничение по памяти
Имейте в виду, что если вы не ограничите размер [console=inline]tmpfs[/console], он может занять всю доступную оперативную память, что может привести к проблемам с производительностью или даже к сбоям системы, если память будет исчерпана. Поэтому рекомендуется устанавливать разумные ограничения.
Мониторинг использования памяти
Вы можете использовать команды, такие как [console=inline]df -h[/console] или [console=inline]free -m[/console], чтобы отслеживать использование памяти [console=inline]tmpfs[/console] и убедиться, что он не превышает допустимые пределы.
Заключение
Таким образом, [console=inline]tmpfs[/console] может автоматически увеличиваться в размерах в пределах установленного максимума, но важно следить за использованием памяти, чтобы избежать проблем с производительностью.
Если выработается привычка доверять ИИ, пропадёшь и за грош))
Не, мне просто хотелось посмотреть, что ИИ может :) Так-то я всё это и сам бы сделал, задачка-то не архисложная. Но да, меня тревожит тот факт, что человеки от такого заменителя мозгов скоро окончательно разучатся думать :)
человеки от такого заменителя мозгов скоро окончательно разучатся думать
Не разучатся. Думать надо хотя бы для того, чтобы правильно задачу поставить.
Пример последних дней - жена удивлялась, что та же Kimi у меня выполняет одну задачу, а её не слушает. Посмеялся на тему, что она не может роботу объяснить задание, но сам сел за её компьютер и за 2 минуты Kimi поняла, что от неё требуется.
И да, та же Kimi мне быстро нашла информацию, почему Linux Mint не хочет ставить новое ядро. Вопреки утверждениям, что Linux лучше работает со старым железом, как раз в моём случае наоборот. В ядре поломали обратную совместимость для драйверов. И должен менять свою NVIDIA GeForce GT710 на что-то более современное.
И должен менять свою NVIDIA GeForce GT710 на что-то более современное.
В Arch я просто поставил пакет [console=inline]nvidia-390xx-dkms[/console] из AUR, и продолжаю обновлять ядро. Но в планах -- переход на более новый драйвер, как раз работаю над этим.
Не, мне просто хотелось посмотреть, что ИИ может :)
К сожалению, может он уже много, даже само человечество уничтожить, только это ему пока не нужно, кто его тогда развлекать будет))
yars написал:
Но да, меня тревожит тот факт, что человеки от такого заменителя мозгов скоро окончательно разучатся думать :)
Оно, то бишь человечество, уже давно разучилось)) Это уже давно реальность. Был такой юморист, Задорнов, когда был ещё СССР, читал монолог про американцев и часто в нём повторял: "Ну, тупы-ы-е". В магазинах каждый день наблюдается одна и та же картина, молодые люди, только что закончившие школу, когда им приходится расплачиваться наличными, не могут сложить в уме пару цифр. Интересно наблюдать за мимикой их лиц. Думал ли тогда Задорнов, что всего лишь через 35 лет ...
"Rizado" написал:
И должен менять свою NVIDIA GeForce GT710 на что-то более современное.
6-е ядро так критично? Или любовь к последними веяниям? С GTX550Ti и 390-ым драйвером прекрасно обхожусь 5-ым ядром. На другом ПК GeForce 8600 GT с 340-ым и 5-ым, прекрасно себя чувствует.
Смотря по какому временному отрезку судить)) Во времена Mint 18-19, намучившись с восстановлением системы из-за лихих обвалов после обновлений, пришлось уходить на тогда стабильную LMDE4, у которой таких проблем не было. Наверное, тем кто работает сейчас на LM22 повезло больше))
Здесь только два объяснения: или не попадал на лажовые обновы, или не было установлено тех пакетов, из-за обновления которых падала система. Теоретически есть и третий вариант - лично проверял коды обновлённых пакетов перед установкой, что маловероятно ))