Перейти к содержанию

Люди vs. Машины


Рекомендуемые сообщения

Опубликовано

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

О нейронных сетях не говорит только ленивый. Для упрощения части задач, будем разворачивать "ИИ"-агента.
В кавычках, потому что математическую модель сложно назвать интеллектом, и никакой магии в этом нет.
А вот агенты позволяют некую магию сотворить. Шутка. Они выступают прослойкой между 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

Опубликовано
18 часов назад, VanPukMen сказал:

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

Надеюсь не доживу... Устал от разных перемен, хочется стабильности и постоянства ((

 

 

Зачем вообще голод добавлять в игру? Это же просто рутины добавляет... Ну или автоматом еда и вода берутся из запасов...

 

 

Я пока не дорос, до использования ИИ, так сильно. Так, через браузер иногода , что то спросить, нарисовать или найти прошу... Но плюсую - кому то будет очень полезно, я надеюсь...

«Прогресс технологии одаряет нас всё более совершенными средствами для движения вспять». ( Олдос Хаксли )

Опубликовано
On 5/11/2026 at 8:06 PM, stratego said:

Зачем вообще голод добавлять в игру?


Хотелось какую-то реальную, не очень сложную, но при этом относительно не самостоятельную механику (интегрирующуюся в текущий код) показать.
Получилось:
- работа со статусными сообщениями;
- обработка предметов;
- таймеры (они через статусные сообщения работают);
- штрафы/бонусы к статам/скиллам.

Пока на паузе стоит, попадет ли в игру - возможно. Как/если результат будет - поделюсь им здесь ввиде поста. 

Опубликовано

Голод вообще штука сложная, если хочется реалестичности. Допустим не есть вовсе, или есть по чуть-чуть. Будет два разных эффекта, в первом случае организм будет экономить, во втором будет работать как обычно. И если психологически человек себя не накрутит, то тот кто ест по чуть-чуть быстрее может загнутся, при прочих равных условиях. А уж в условиях пустыни, потребления вяленого мяса, при отсутствие воды - вообще смертельно...

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

«Прогресс технологии одаряет нас всё более совершенными средствами для движения вспять». ( Олдос Хаксли )

Опубликовано

Говоря про "реальную" механику, я не подразумевал "реалистичную". :)
Реальная здесь - это синноним "востребованой", "играбельной".
Как-то так.

Основную мысль уловил: не превращать в рутину.
Да, вполне возможно, требуется автоматически потреблять более подходящий предмет из инвентаря.
Так же надо на случайных встречах давать возможность найти что-то съедобное (генерить в контейнерах,
но такое в моде уже и так есть, правда на статичных локах), или скорее, в зависимости от навыка скитальца
при нехватке пищи в инвентаре при переходе по глобалу, давать шанс найти пищу.
Как сделано с событиями "вы потратили N часов на поиск воды", "вы упали с холма" (или как там оно звучит).
Т.е. когда выкидывает на энкаунтер, а там лежит уже предмет перед ГГ.
В перечисленых выше примерах никаких предметов нет. :)

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйте новый аккаунт в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...