VanPukMen Опубликовано 10 мая Опубликовано 10 мая Всем привет, и спасибо что жамкнули на этот ужасный кликбейтный заголовок! В топике будет много скринов. К сожалению, они размещены ссылками, потому что лежат на вандрайве, а он не дает прямых линков. Такажизь. О нейронных сетях не говорит только ленивый. Для упрощения части задач, будем разворачивать "ИИ"-агента. В кавычках, потому что математическую модель сложно назвать интеллектом, и никакой магии в этом нет. А вот агенты позволяют некую магию сотворить. Шутка. Они выступают прослойкой между LLM (большие языковые модели) и сервисами, будь то: чаты, www или просто ОС пользовтеля. Почти как мы с вами - между креслом и дисплеем Мы же рассмотрим т.н. агенты-кодирования (coding-agents). Здесь должно было быть нудное-философское вступление. Просто помните: это - хороший инструмент, но не замена ваших мозгов! Только вы отвечаете за свою жизнь, решения принятые **вами**. И да, если в ходе действий приведеных ниже что-то повредите, сломаете и тд и тп; это тоже только ваша вина Я использую линуксы, более чем уверен что, основная масса пользователей на форуме пользуется виндой, инструкция для этой ОС и будет. Видяха у меня от NVIDIA, для AMD в целом, процесс схожий должен быть. Сетап: - Linux, как хост система; - Windows 11, как виртуальна машина incus; - Ubuntu 24.04, как контейнер incus. План: - выбор и загрузка модели; - установка wsl (Windows Subsystem for Linux); - развертывание ubuntu в среде wsl; - подключение видеокарты в ubuntu; - сборка llama.cpp; - запуск llama.cpp server и установка pi (агент); - на сладенькое: установим opencode для использования с бесплатными облачными моделями; (если локально неинтересно или оборудование не позволяет, переходим сюда с п. "подключение видеокарты"); - битва нейронок. Понадобится: - Windows 10 (>=21H2), 11; - GPU >=8GB VRAM; - ~4-8GB RAM; - Порядка 12GB постоянной памяти. Можно запускать модели только на CPU и RAM, но скорость работы очень низкая. Что бы немного упростить себе работу по написанию данного текста, я схитрил Программные части с виндой и контейнер с линуксом у меня разделены. Это сделано чтобы не трахацца с пробросом видеокарты в виртуальную машину. (На нативной венде этих трудностей быть не должно, если верить доке) Понадеямся что все соответствует документации. О всех возникших проблемах, пишите - не стесняйтесь. Постараемся решить. С первого взгляда может показаться: зачем запускать локально все это *добро*, когда можно в облаке у дяди? Вопрос хороший и правильный, в общем-то и не за чем; За исключением: - ограниченный размер токенов (читай подписка) в облаке; - используемые модели могут быть (и будут) ограничены некими "моральными" ориентирами (да ладно брось, ничего же плохого делать не будем!); - оно все еще не работает без подключения к сети Интернет. Из этого вытекают плюсы: - хорошие, "жирные" модели; - работает на любом оборудовании, необходим только доступ в сеть Интернет. Меньше слов, больше дела. Так что, поехали! Условные обозначения: - % - вызов команды в windows-окружении cmd.exe; - # - вызов команды в linux-окружении от root; - $ - вызов команды в linux-окружении от пользователя; - <- -> - стрелочками на скринах отмечены команды и прочие места, требующие внимания; При вводе команд, эти символы в начале строки писать не нужно. Используются исключительно для сигнализирования читателя о среде ввода. Но для начала, заглянем в BIOS и включим там виртуализацию, если она почему-то не включена. Для Intel CPU ищем VT-d/VT-x, для AMD ищем AMD-V/SVM. Обычно эта опция находится в меню Advanced -> CPU / Chipset, в зависимости от биоса. А теперь выберем и скачаем модель. Весят они достаточно, как раз загрузится. Предлагаю Qwen3.5 без цензуры с 9-ю миллиардами параметров. Оно помещается (Q4) в 8ГБ + остается на контекстное окно. Окно контекста - это сколько "помнит" нейронка в одной сессии. Квантование - измеряется в битах/квант. Чем выше значение, тем выше точность модели. Параметры - в общем-то, это просто числовые значения, напрямую ничего не обозначающие, полученые в процессе тренировки модели. Чем больше, тем "умнее" модель. LLama.cpp использует формат моделей GGUF. При выборе иных моделей, учтите это. Благо, на хаггингфейсе есть удобные фильтры слева на странице: https://1drv.ms/i/c/00619a283ea027f9/IQDQbBbCcMFiQJmzXAtkd8jyAVs3j_V9L8E5_A3WfKAqlxc?e=4lvbbj https://huggingface.co/HauhauCS/Qwen3.5-9B-Uncensored-HauhauCS-Aggressive Пара слов об именовании моделей. Не знаю, есть ли какая-то конвенция, но - -N-B - где, -N- * 10^9 параметров; - A-N-B - mixture of experst(смесь/множество экспервто), где -N- - количество параметров каждого эксперта; - Ablitered - удалены слои, чаще всего отвечающие за "моральные ограничения"; - Uncensored/Aggressive/Heretic - тоже, что и предыдущее, только явно указывающее на это; Также модель (не) может поддерживать tools - запросы на вызов команд агенту. Если такой функции нет, возможно в системном промте явно указать это, но лучше сразу иметь модель с поддержкой tools. Моделей много, архитектур гораздо меньше. Какую использовать - решать вам. Пробуйте, испытывайте. Делитесь впечатлениями. Вернемся в винду. Запускаем консоль (cmd.exe): win+r -> cmd.exe (запустить от имени администратора) https://1drv.ms/i/c/00619a283ea027f9/IQDhwIu9OhPZRZc6mGVZASXwAYE0rQfUSp1zPvEUr57NR-M?e=Z61ETP Далее, внутри набираем: `% wsl --install` https://1drv.ms/i/c/00619a283ea027f9/IQCi_4LWaFlCSozVXllQXZAJAcW8cPQK1Z8kHW-T-UjuUG4?e=fcB63Z Ждем пока задеплоится и ребутаемся, раз просят: https://1drv.ms/i/c/00619a283ea027f9/IQD-hm7HwuQdQILPUhn7_rzZAbkJXEsvxAwjGI11UxzDeAs?e=bPV4Pn Не забываем прожимать <TAB> (дополнение ввода) для избавления от лишней писанины. Или просто кликаем для перезагрузки. Но дальше все равно придеться печатать. После, снова запрыгиваем в cmd.exe, можно уже от пользователя. Устанавливаем Ubuntu 24.04 `% wsl --install -d Ubuntu-24.04` https://1drv.ms/i/c/00619a283ea027f9/IQAdZRtD_sC7Tb_d0BQnw5LGAXa6spVs8Dv9VhNvjqyt55M?e=CwMoKs Ждем пока скачается, вводим **для новой системы** имя пользователя и пароль два раза. Пароль при вводе не будет отображаться. Это уровень защиты такой. После, окажемся в командной оболочке убунты. (на этом я оставляю виртуалку с виндой и перехожу в контейнер с убунтой, читатель же продолжает у себя в окружении в виртуалке с убунтой) Установим гит и утилиты для превращения кода в исполняемые фаилы: (все это выполняем от пользователя root - суперпользователя в unix-like системах. "#" слева от каретки ввода сигнализирует об этом. "$" для пользователя) Но сначала запрыгнем в рута: `$ sudo -s` Вводим пароль из предыдуещего пункта. `# apt-get update && apt-get install -y git git-lfs build-essential cmake wget libssl-dev` https://1drv.ms/i/c/00619a283ea027f9/IQAH-60A9F6CRYKHDSccXWvJAdw3b21CWmYORDNQsFALSwY?e=hlvb0M Теперь установим cuda. Как написано в доке: в win11, win10(>=21H2) проброс видяхи должен работать из коробки. (У вас должны быть установлены дрова NVIDIA с CUDA на хостовой системе, т.е. в виндах!) Что ж, поверим и проверим `# wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2404/x86_64/cuda-keyring_1.1-1_all.deb` `# dpkg -i cuda-keyring_1.1-1_all.deb` `# apt-get update && apt-get -y install cuda-toolkit-13-2` https://1drv.ms/i/c/00619a283ea027f9/IQBmjbNk2kfdSbv45NsewlAyAft-lWVIgCQnUNbV4Z0WdiM?e=lAWYfS `# nvidia-smi` Видим примерно такой выхлоп https://1drv.ms/i/c/00619a283ea027f9/IQDAB_cOlHtuR5zlf-6Y0vRBAQxsLY-9Gt2HCu7erFVai5g?e=DipKcS Отлично, видеокарта видна в виртуальной машине. Если нет, то все плохо Соберем llama.cpp Создадим директорию и склонируем туда препозиторий: `# mkdir ~/src && cd ~/src && git clone --recurse-submodules https://github.com/ggml-org/llama.cpp` https://1drv.ms/i/c/00619a283ea027f9/IQCsoaDU3WEXR61q3P2rMr7rAUstCK8V-q5hb36B70haS5Q?e=yzUCC0 Создадим директорию для билда, перейдем туда: `# mkdir -p llama.cpp/build && cd llama.cpp/build` Запустим конфигурацию проекта, создание сборочных фаилов: `# cmake .. -DLLAMA_BUILD_SERVER=ON -DGGML_CUDA=ON -DCMAKE_CUDA_COMPILER=/usr/local/cuda-13.2/bin/nvcc` https://1drv.ms/i/c/00619a283ea027f9/IQAVXscTVpAtTqmNEGdRhCy7AceApHiOeuFRmsWnHqTwcH4?e=UwQVfU Здесь важен путь (/usr/local/cuda-13.2/bin/nvcc) к компилятору куды. Проверьте его у себя, если: - возникли ошибки прямо указывающие на его отсутствие; - другая версия куды (не 13.2). `# ls /usr/local/cuda-*` https://1drv.ms/i/c/00619a283ea027f9/IQAtjG6-YqWHRL0UkSKVJKW0AUiDaV8kh9dNYo1spRCgRJU?e=qE1dom Собираем: `# make -j$(nproc)` https://1drv.ms/i/c/00619a283ea027f9/IQAeLMqzF1RaSo0K8qvjlppvAYP_Bltk5dzlP6pXJyQVeWc?e=urpKSq Это займет какое-то время и ресурсы компа. Я ждал примерно 5-7 минут. Перемещаем библиотеки (.so, shared-object, из виндов аналог - DLL) и исполняемые фаилы. Сначала проверим что только библиотеки будут выбраны: `# ll bin/*.*so*` https://1drv.ms/i/c/00619a283ea027f9/IQDwI2q1Oz8jS5TjT8ui8JXwAdLpuqY1zTBxZezMjagZPVQ?e=38rle0 Хорошо, видим только либы и симлинки. Перемещаем: `# mv bin/*.*so* /lib/x86_64-linux-gnu/` и оставшиеся бинарники: `# mv bin/* /usr/local/bin/` И сменим имя хоста, заодно: `# nano /etc/wsl.conf` https://1drv.ms/i/c/00619a283ea027f9/IQADm1tlgEWvR6lOkzbxh_QXAW0l8F9CUBct9KDtueJz1ug?e=DnxVT5 В конце фаила допишем: ``` [network] hostname=llama ``` https://1drv.ms/i/c/00619a283ea027f9/IQALhL-3zqTQQ6MK1MLNRXU8AVVAorHyDV5L7mjvThbEaQI?e=R5DOc0 Сохранимся и выйдем. Нажимаем ^O (Ctrl+O) -> <Enter>; ^X (Ctrl+X). Больше операций от рута выполнять не требуется. Можно выйти: `# kill -9 $$` На этом установка llama.cpp подошла к концу. Посмотрим какой адрес присвоен виртуалке. Вдальнейшем будем использовать его для биндинга и подключения к серверу llama.cpp: `$ ip a` https://1drv.ms/i/c/00619a283ea027f9/IQDeIbQH_2B8SJC2lvEYYsXgAUPv__jRoAk6vQi-nLgeaxM?e=L414Sj В моем контейнере это - 10.10.10.76. И использовать я буду его, вам же надо использовать указаный в выводе. Пока тестировал wsl, выяснилось что при конфигурации сети в режиме зеркалирования (Mirrored Mode, по-умолчанию в 11 25H2 april 2026) все локалхосты всех виртуалок связаны %) Не буду браться судить о рациональности такого решения, но как минимум - страно. Другими словами: открывая какой-то порт на 127.0.0.1 одной виртуалки, он становится доступен на другой. Вот пример: https://1drv.ms/i/c/00619a283ea027f9/IQDeIbQH_2B8SJC2lvEYYsXgAUPv__jRoAk6vQi-nLgeaxM?e=L414Sj https://1drv.ms/i/c/00619a283ea027f9/IQDuZ8CuAWqfRLBHhRLIQrZhASrVWByI8ztWk2lRm-zkmTw?e=JBLL8a Простая проверка доступности tcp-порта через netcat. Как видно из скринов: обе виртуалки имеют один ip адрес на интерфейсе eth0. Если у вас схожая конфигурация сети - используйте localhost (127.0.0.1) как адрес бинда для llama-server. Запустим llama.cpp: `$ llama-server -m models/Qwen3.5-9B-Uncensored-HauhauCS-Aggressive-Q8_0.gguf --host 10.10.10.76 --port 8080 --ctx-size 60000 -ngl 18` https://1drv.ms/i/c/00619a283ea027f9/IQAVKLhEUYCkSrFcuM8CWu-AAXtvvrdCdOK1gpNolQkAMJc?e=2GwH2C Середина вывода обрезана. ,где: - --host ADDR - адрес интерфейса для бинда; - --port INT - номер порта; - --ctx-size INT - размер контекстного окна; - -ngl INT - количество слоев для загрузки в GPU. В зависимости от вашего аппаратного обеспечения, может возникнуть ошибка выделения памяти, а точнее - ее нехватки: https://1drv.ms/i/c/00619a283ea027f9/IQAcmXWWULz9RoxFvDPRjnO9AV8ZGuEGywzGtffLcK7_Anc?e=25FVoH Середина вывода обрезана В примере выше я специально указал количество слоев (-ngl 20) большее, чем может вместиться. Если видите схожее сообщение об ошибке, попробуйте: - уменьшить количество слоев загружаемых в GPU; - уменьшить размер контекстного окна. Возможно загрузить модель размером больше, чем объем VRAM / Как выгрузить часть модели в RAM? Использовать ключ `-ngl N`, где N - количество слоев сети загружаемые в VRAM, остальные будут загруже в RAM и использовать CPU. Как узнать сколько слоев в сети? `llama-cli -m /path/to/your/model.gguf --reasoning-budget 0 --reasoning off -st --simple-io -lv 3 -p 'say hi!' 2>&1 | grep print_info`, где: - -m /path/to/your/model.gguf - путь к модели; - --reasoning-budget 0 / --reasoning off - отключает thinking; - -st - одиночный запуск, выйти после генерации ответа, не оставаться в оболочке; - --simple-io - простой вывод (легче grep'ать); - -lv 3 - уровень логгирования (3 - info); - -p 'say hi!' - промт; - `2>&1 | grep TEXT` - перевести вывод STDERR в STDOUT (это нужно, т.к. некоторые текст бывает идет по другому каналу и не попадет в трубу) и передать через pipe вывод в ввод grep (программа для поиска вхождения строк в текст) Ищем строку `print_info: n_layer`, вот пример: ``` llama-cli -m models/Qwen3.5-9B-Uncensored-HauhauCS-Aggressive-Q8_0.gguf --reasoning-budget 0 --reasoning off -st --simple-io -lv 3 -p 'say hi!' 2>&1 | grep print_info print_info: file format = GGUF V3 (latest) print_info: file type = Q8_0 print_info: file size = 8.86 GiB (8.50 BPW) print_info: arch = qwen35 print_info: vocab_only = 0 print_info: no_alloc = 0 print_info: n_ctx_train = 262144 print_info: n_embd = 4096 print_info: n_embd_inp = 4096 print_info: n_layer = 32 ``` Вывод обрезан. Возможно выгрузить контекстное окно в RAM? Да, как-то возможно, но я пока не разобрался Найдете как - пишите в комметах. Какой размер контекстного окна нужен? Чем больше, тем лучше. Из личного опыта от 100к - нормально. 30к - мало. Внимательный читатель заметит, что ранее я писал про модель с 4-мя битами на квант, а здесь уже 8/квант. Скорость проседает значительно, но и повышается точность. Как говорил ранее: пробуйте, экспериментируйте. Теперь настроим агент. Откроем еще одну консоль, вызвав cmd.exe или нажав на выпадающее меню в области вкладок https://1drv.ms/i/c/00619a283ea027f9/IQBHt8Dv-rezRYXQoPA3WAwaAdmcLQxUjZFLQ4Igh9Xx0LI?e=QSc7WH Задеплоим еще одну виртуалку с убунтой. Зачем? Как же, разделяй и властвуй! В целом для изоляции. Если читатель находит это излишним, может продолжать в предыдущей. Повторим пункт с установкой убунты, только сразу пропишем имя виртуалке: `% wsl --install Ubuntu-24.04 --name agent` Как только развернется, заменим имя хоста, как делали выше. Только вместо llama будет agent. Установим nodejs и pi. Нода в репозитории пакетов canonnical старая - 18. Поставим свежую через node version manager: ``` $ curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.4/install.sh | bash` $ source ~/.nvm/nvm.sh $ nvm install node 24 $ echo 'console.log("hi!");' | node $ node -v ``` https://1drv.ms/i/c/00619a283ea027f9/IQA4BNkWmXNvTpsKnipSvHN_AftaoiQ6IpBxJOx3gOqMQ0A?e=8083eE ``` $ npm install -g @mariozechner/pi-coding-agent $ pi --version ``` https://1drv.ms/i/c/00619a283ea027f9/IQA9oTgK6DnMT7aN4s2fJkdrAfMFfWln5xczWK5uGXaHgNQ?e=Ovks9j Далее нужно добавить конфиг для локальной модели. Llama.cpp использует OpenAI-совместимый формат API. Создами конфиг: `$ nano ~/.pi/agent/models.json` Вставляем текст, подставляем IP-адрес виртуалки с llama.cpp, найденый ранее (в примере указан адрес моего контейнера): ``` { "providers": { "ollama": { "baseUrl": "http://10.10.10.76:8080/v1", "api": "openai-completions", "apiKey": "ollama", "compat": { "supportsDeveloperRole": false, "supportsReasoningEffort": false }, "models": [ { "id": "gpt-oss:20b", "reasoning": true, "contextWindow": 60000, } ] } } } ``` https://1drv.ms/i/c/00619a283ea027f9/IQAcoCMnY-z4To-yuEaEEta8AYO-6ICkQ2yq0CR1vY45g_g?e=qz3Umv Так как мы используем llama-server только с одной моделью заранее загруженой, секцию "models" можно не исправлять. Запустим простой тест pi: `pi -p 'say hi!'` https://1drv.ms/i/c/00619a283ea027f9/IQBWWaLsDdElS7Fc8y51cZ24AfiHbCvbO-JLOo7evt3-esE?e=wmj3Ek Если видите ответное сообщение - значит все получилось. Позравляем, теперь у вас есть локальная нейронка! Конечно, интерфейс командной строки вряд ли подходит для сложных задач, в отличии от пакетной обработки, например перевода текстовых файлов, как я показывал в другом посте. Интерактивный интерфейс агента выглядит так: https://1drv.ms/i/c/00619a283ea027f9/IQD4kVJ0giFgTLsKJpeL-y46Acf_ex5D3uVoMG3gxO23WvY?e=wWM4oE ,где: 1. системный лог, загрузка, системный промт (если используется); 2. история промтов; 3. размышления / thinking; 4. маркер активной работы; 5. маркер отменной операции; 6. использование инструментов (tools) - запись в фаил; 7. вывод; 8. строка пользовательского ввода; 9. использованый контекст; 0. имя подключеной модели (в нашем случае прописана одна модель в llama-server). Скрин нарезан из нескольких. На первом прогоне сетка зависла в своих размышлениях минут на 20.. без шуток Так и не дождавшись вывода, перезапустил процесс. Результат видно внизу скриншота. Как и обещал, установим opencode. OpenCode - это тоже агент, который работает с разными облачными поставщиками. Но так же можно подключить и локальную модель из llama.cpp. Т.к. уже настроили pi, пытливым читателям оставлю подключение локальной модели, как задачу со свздочкой для самостоятельной работы (в конце текста есть пример) Развернем еще одну виртуалку с убунтой, зададим хостнеим, как делали раньше. После, выполним: ``` $ curl -fsSL https://opencode.ai/install | bash $ source ~/.bashrc $ opencode --version ``` https://1drv.ms/i/c/00619a283ea027f9/IQBM4CVqAyCjSp8fD9BLDZiBAYuy9M_4NoBmgdiiW3uhTwk?e=43CYnb В общем-то, и все. Вот примеры интерфейса с описанием При старте новой сессии: https://1drv.ms/i/c/00619a283ea027f9/IQCx1fe3k4uyRplPVNAIlGdPAYTx_wsNxB_XW6pqvLzuq1A?e=qS7dG3 Интерфейс: https://1drv.ms/i/c/00619a283ea027f9/IQDu-zv3qQvBTKDAX9AxFclXAQS57iqHIXgPr_iY3rI3oZM?e=wdRGch Так где практическая сфера применения? Попробуем разобраться! А раз теперь мы роскошные бояре аж с двумя агентами, одним - с нейронкой локальной, вторым - облачным решением, проведем сравнительное тестирование. Будем проверять конечный результат, т.к. скорость работы сравнивать смысла нет. Исходные промты будем давать одинаковые, дальше уже по-ситуцаии. Что бы это не было чем-то абстракным, возьмем реальный проект. Некоторое свободное время я уделяю эдакой поделке на тему roughlike - моду для Fallout 1 на базе Fallout1-CE. Здесь не будет кода и команд, некоторое количество текста и скриншотов. Какой-то киллер-фичи, которую можно реализовать малой кровью, я придумать не смог. Остановился на простой системе голода/жажды. Опишу ее чуть позже, а пока посмотрим что предложат нейронки: https://1drv.ms/i/c/00619a283ea027f9/IQD4zdDvHoOBRoAkN0-GReouAZpDJzB16BD_zMp41-JW9wU?e=TjNHcJ https://1drv.ms/i/c/00619a283ea027f9/IQB_Xj5k1V-GTozim6e9AkshAaPBwY1-dZs1je6w2biIbNo?e=NjmBwu Как видно, если не считать 95% несоответствующим сути пустоши, нейронки предлагают ерунду, но приблизительно одинаковую. Что до голода/жажды, назовем это прожирание %) Для упрощения голод и жажда объединены в одну механику. Вот основные положения: - персонаж имеет очки сытости; - базовое значение очков сытости расчитывается из ВН * 1000; - очки сытости имеют максимум (базовое значение + 10%) и минимум(0); - "сытым" состояние персонажа считается < база - 10% < база; - "насыщенное" состояние - < база < база + 10%; - трейт быстрый метаболизм в два раза быстрее расходует очки сытости, но насыщение происходит в два раза больше; - очки сытости расходуются каждую игровую минуту; (на локальных картах игровое время течет медлено, относительно реального) - расход очков сытости производится из расчета СЛ + ИН; - каждые 20% шага от базового значения снижают базовые характеристики персонажа на 1; - при насыщеном состоянии персонаж получает +35 ко всем навыкам, а к тагнутым +50; - индикация состояния "голод" происходит через специальный одноименный перк, он добавляется персонажу при достижении значения база - 30%, удаляется при пересечении этого порога; - каждые 20% шага от базового значения (90-10%) меняют название перка на: - проголодался; - достаточно голоден; - чертовски голоден; - смертельно голоден; - если у персонажа есть перк "голод", отображать соответствующую плашку в пользовательском интерфейсе, так же как "уровень". - восстановление очков сытости происходит по таблице соотношения предмет - очки: - мутафрукт - 500; - шашлык из ягуаны - 1000; - нюка-кола - 250; - пиво - 350; - самогон - 500; - фляга У13 - 2000; Понятно что, спроектировано на коленке, вырисовывается некоторое количество явных проблем. Одна из них: острое отсутствие еды в игре Интереса ради, сунем в сетки "как есть" с промтом "улучши в соответствии с духом игры" :)) Скрины будут размещаться последовательно: сначала из PI, потом из OC. Заранее извиняюсь за вырвиглазную нарезку в некоторых местах. Размышления: https://1drv.ms/i/c/00619a283ea027f9/IQDUI6Qh2g91TI70CAYmPqFbAfSwNw-mKNQZ3ENYJCrjVTc?e=jl11C2 https://1drv.ms/i/c/00619a283ea027f9/IQDUI6Qh2g91TI70CAYmPqFbAfSwNw-mKNQZ3ENYJCrjVTc?e=jl11C2 Вывод: https://1drv.ms/i/c/00619a283ea027f9/IQAxNawQunFxR4yu-qI-qKzVAXX7vXFuPa14YTJER3jvfhE?e=qezyJz https://1drv.ms/i/c/00619a283ea027f9/IQBtAm6S3QlmT4-rOPSyfRVeAQAZhn2eQyTAt39EvcMie_w?e=SGYa3p В целом - практически один мусор. Но цифры подправим, и пожалуй, возьмем идею с обмораками Пусть при снижении очков сытости ниже 40%, появляется возрастающий шанс отправиться в нокаут на N игровых минут. А при насыщении давать +2 ОД. Жирно? Жирно! А что поделать, пустошь - суровое место! (Еще и с отсутствующей едой) В первой итерации PI начал бодро, даже слишком. Поскольку модель частично загружена в RAM, работает долго. Я решил лечь спать и оставил работать на ночь агент. Проснувшись, увидел полотнище из нейрослопа какого-то с повторяющимися переменными и перезаписью основного фаила с реализацией голода. И коммиты агент почему-то не делал. Прекрасно Во второй, он никак не хотел понимать градации (шаг/лестницу) бонуса/штрафов. Несколько раз пришлось прямо указать. Это все я не стал скринить. OpenCode некоторое количество времени ходил вокруг да около таблички, пока ему прямо не указали это делать и где искать код. Выдавал вот такие перлы https://1drv.ms/i/c/00619a283ea027f9/IQBxVgby0Mk1QYpPbsqT3eNqAbivwh87GhjbLr3oUGGPAI0?e=JMO4SG Кто машина, а кто человек... https://1drv.ms/i/c/00619a283ea027f9/IQBLZ3CtAiE-S5gsyNlSiNJ7Ad-P24q3Cvi8Jl2_46X8_o0?e=t9qrGA В процессе работы повылезали ошибки в работе PI. Агент часто сваливается в петли, из которых не может выйти; перестает использовать инструменты (read, write, edit) для работы с текстовыми фаилами, скатывается к написанию pthon-кода для редактирования фаилов, иногда прибегает к sed, awk. А модель начала выдумывать несущестующие структуры. It's by design. Нет, это не шутка, современные нейронки именно так спроектированы. https://1drv.ms/i/c/00619a283ea027f9/IQBM-wIf1fTRRJvFX2QX_JHFAZQhv3ZqVuoAcBNcFYZ30IU?e=tNVyiG Поэтому было принято решение подключить локальную модель к OpenCode. Вот пример как это сделать: добавим настроки для локальной модели в фаил `~/.config/opencode/opencode.json` ``` { "$schema": "https://opencode.ai/config.json", "compaction": { "auto": true, "prune": true, "reserved": 10000 }, "provider": { "llama-local": { "name": "llama.cpp", "npm": "@ai-sdk/openai-compatible", "options": { "baseURL": "http://10.10.10.76:8080/v1" }, "models": { "hauhau/Qwen3.5-9B-GGUF": { "name": "Qwen3.5-9B Q8", "reasoning": true, "tool_call": true, "options": { "enable_thinking": true }, "limit": { "context": 60000, "output": 20000 } } } } } } ``` Чутка Фаллаута https://1drv.ms/i/c/00619a283ea027f9/IQAXnseENPcyR6YVvMOY49FEAZrt-yMoRNf_mDGhu-9q0Xg?e=1eRt4F Прошло уже достаточно времени (вечеров пять, приблизительно) битвы нейронок. И я решил разместить материал "как есть". Хотел все же дождаться результата обоих сетей, но что же. Может потом дополню. Из того что есть на текущий момент: достаточно очевидно, что облачное решение справляется лучше. Но тоже порядочно лажает. Пару раз удаляло рабочий код, приводило его в нерабочее состояние сомнительными патчами. Благо, все это заливается в локальный гит, иначе работать невозможно; что до llama.cpp и "местной" модели, в текущий момент она отключена от задач по фаллауту и занята разработкой небольшой программы для воспроизведения видео. Тоже не очень хорошо там справляется Отсюда и простой вывод: для локального запуска нужны более жирные модели, с большим числом параметров, и хорошим квантование; в целом, да - это юзабельно. да - это бесплатно (условно, конечно). только оборудование необходимо. Здесь я хотел написать какой-то красивый эпилог. Просто скажу: мы стали свидетелями еще одной промышленной революции. Мир уже не будет прежним. Вероятнее всего, в ближайшие 5 лет мы увидим серьезную перестройку общества. И вряд ли это будет светлый кибер-социализм. Скорее гнусный техно-феодализм. Спасибо что дочитали .. или долистали до конца! П.С. вычитку делал, но косяки точно остались. Использованые материалы: https://learn.microsoft.com/en-us/windows/wsl/install https://learn.microsoft.com/en-us/windows/ai/directml/gpu-cuda-in-wsl https://developer.nvidia.com/cuda-downloads?target_os=Linux&target_arch=x86_64&Distribution=Ubuntu&target_version=24.04&target_type=deb_network https://github.com/ggml-org/llama.cpp/wiki https://nodejs.org/en/download https://github.com/badlogic/pi-mono/tree/main/packages/coding-agent https://github.com/badlogic/pi-mono/blob/main/packages/coding-agent/docs/models.md https://github.com/badlogic/pi-mono/blob/main/packages/coding-agent/docs/usage.md https://github.com/anomalyco/opencode/ https://opencode.ai/docs/config/ https://github.com/xiaobluesky/opencode-model-config-guide 1
stratego Опубликовано 11 мая Опубликовано 11 мая 18 часов назад, VanPukMen сказал: Мир уже не будет прежним. Вероятнее всего, в ближайшие 5 лет мы увидим серьезную перестройку общества. Надеюсь не доживу... Устал от разных перемен, хочется стабильности и постоянства (( Зачем вообще голод добавлять в игру? Это же просто рутины добавляет... Ну или автоматом еда и вода берутся из запасов... Я пока не дорос, до использования ИИ, так сильно. Так, через браузер иногода , что то спросить, нарисовать или найти прошу... Но плюсую - кому то будет очень полезно, я надеюсь... «Прогресс технологии одаряет нас всё более совершенными средствами для движения вспять». ( Олдос Хаксли )
VanPukMen Опубликовано 15 мая Автор Опубликовано 15 мая On 5/11/2026 at 8:06 PM, stratego said: Зачем вообще голод добавлять в игру? Хотелось какую-то реальную, не очень сложную, но при этом относительно не самостоятельную механику (интегрирующуюся в текущий код) показать. Получилось: - работа со статусными сообщениями; - обработка предметов; - таймеры (они через статусные сообщения работают); - штрафы/бонусы к статам/скиллам. Пока на паузе стоит, попадет ли в игру - возможно. Как/если результат будет - поделюсь им здесь ввиде поста. 1
stratego Опубликовано 18 мая Опубликовано 18 мая Голод вообще штука сложная, если хочется реалестичности. Допустим не есть вовсе, или есть по чуть-чуть. Будет два разных эффекта, в первом случае организм будет экономить, во втором будет работать как обычно. И если психологически человек себя не накрутит, то тот кто ест по чуть-чуть быстрее может загнутся, при прочих равных условиях. А уж в условиях пустыни, потребления вяленого мяса, при отсутствие воды - вообще смертельно... Конечно можно выносливость и еще что-то заставить снижать влияние голода и обезвоживания. Но тут можно просто рутины добавить, вместо интереса... Если заставлять игрока регулярно, делать действия по употреблению пищи )) «Прогресс технологии одаряет нас всё более совершенными средствами для движения вспять». ( Олдос Хаксли )
VanPukMen Опубликовано 18 мая Автор Опубликовано 18 мая Говоря про "реальную" механику, я не подразумевал "реалистичную". Реальная здесь - это синноним "востребованой", "играбельной". Как-то так. Основную мысль уловил: не превращать в рутину. Да, вполне возможно, требуется автоматически потреблять более подходящий предмет из инвентаря. Так же надо на случайных встречах давать возможность найти что-то съедобное (генерить в контейнерах, но такое в моде уже и так есть, правда на статичных локах), или скорее, в зависимости от навыка скитальца при нехватке пищи в инвентаре при переходе по глобалу, давать шанс найти пищу. Как сделано с событиями "вы потратили N часов на поиск воды", "вы упали с холма" (или как там оно звучит). Т.е. когда выкидывает на энкаунтер, а там лежит уже предмет перед ГГ. В перечисленых выше примерах никаких предметов нет. 1
Рекомендуемые сообщения
Для публикации сообщений создайте учётную запись или авторизуйтесь
Вы должны быть пользователем, чтобы оставить комментарий
Создать аккаунт
Зарегистрируйте новый аккаунт в нашем сообществе. Это очень просто!
Регистрация нового пользователяВойти
Уже есть аккаунт? Войти в систему.
Войти