Comments 7
Шуткам оламе точно стоит поучиться….🤣🤣
Запускаем докер контейнер с ollama - docker run -d -v ollama:/root/.ollama -p 11434:11434 --name ollama ollama/ollama в качестве порта можно использовать любые значения
Судя по отсутствию ключей "--runtime nvidia --gpus all" запуск в ОЗУ. Даже для поиграться вызовет разочарование.
А вместо 3/4 статьи с обрывками кодов, можно было бы привести ссылку https://docs.ollama.com/api
типа для вот этого "curl http://127.0.0.1:11434/api/chat -d '{"model": "llama3.2", "messages": [{ "role": "user", "content": "why is the sky blue?" }]}'"
нужно обязательно и DTO и прочую обвязку растягивать на несколько страниц в статье?
Понятно, что все в ОЗУ и она будет не такой крутой, но на рабочих ноутах, которые выдают сейчас, это все, что есть, да и многие работают на них)
Я показывал как сделать это из Java, поэтому и все приложил, чтобы можно было по коду запустить и посмотреть, как пример)
Вы показали как сделать конкретно на SpringBoot + RestTemplate. Это очень частный вариант. Да и тривиальный. Я верю что Вы умеете писать эти обертки (тривиальная задача), но этому посвящено 3/4 статьи.
Как бы мир не замыкается на SpringBoot и использовании DTO и прочей многословной обертки вокруг простого http client
Но при этом:
Не сказав откуда взялась информация по API (типа вот вам OllamaRequest). Если что, там еще куча параметров настройки (например температура и пр.)
Управление stream как бы присутствует, но вообще ни на что не влияет. Схлопыватется в реализации до ожидания полного ответа от LLM). Зачем его вообще тогда делать не константой false?
Кстати, никогда не проверял что сделает getBody, если HTTP ответ будет в режиме stream.
restTemplate.postForEntity(__).getBody();
Есть подозрение (уверенность), что обработает некорректно. Потому что из ollama летят куски в виде json объектов, из которых нужно выдирать и склеивать ответ. (летят токны)
Живьем это выглядит так (сам запрос не привожу, но в нем "stream": true,)
И 100% restTemplate.postForEntity(___, OllamaResponse.class).getBody();
работать не будет.
curl http://192.168.0.101:11434/api/generate -d @rq2.json {"model":"Qwen3-Coder-REAP-25B-A3B-MXFP4_MOE-GGUF:latest","created_at":"2025-11-12T04:45:12.532813997Z","response":" ","done":false}
{"model":"Qwen3-Coder-REAP-25B-A3B-MXFP4_MOE-GGUF:latest","created_at":"2025-11-12T04:45:12.598434939Z","response":"请","done":false}
{"model":"Qwen3-Coder-REAP-25B-A3B-MXFP4_MOE-GGUF:latest","created_at":"2025-11-12T04:45:12.611161221Z","response":" translate","done":false}
{"model":"Qwen3-Coder-REAP-25B-A3B-MXFP4_MOE-GGUF:latest","created_at":"2025-11-12T04:45:12.623824174Z","response":" this","done":false}
{"model":"Qwen3-Coder-REAP-25B-A3B-MXFP4_MOE-GGUF:latest","created_at":"2025-11-12T04:45:12.636252126Z","response":" to","done":false}
{"model":"Qwen3-Coder-REAP-25B-A3B-MXFP4_MOE-GGUF:latest","created_at":"2025-11-12T04:45:12.648964908Z","response":" Chinese","done":false}
{"model":"Qwen3-Coder-REAP-25B-A3B-MXFP4_MOE-GGUF:latest","created_at":"2025-11-12T04:45:12.66136273Z","response":"\n\n","done":false}
{"model":"Qwen3-Coder-REAP-25B-A3B-MXFP4_MOE-GGUF:latest","created_at":"2025-11-12T04:45:12.674073212Z","response":"5","done":false}
...
Это, если что, пример бреда локальной LLM, который можно остановить (услышав шум вентиляторов GPU) оборвав TCP/IP HTTP клиента, в котором был послан вопрос и полетел (визуально) бред.
Локальные LLM с настройками по умолчанию, иногда впадают в бесконечный цикл генерации бреда.
И должна быть возможность сказать "стоп", а не пытаться сложить этот бесконечный ответ в буфер для показа "сразу"
По сути, вся статья о том, что берем готовый образ докера и шлем ему запросы. Ни подробностей, ни нюансов, даже стриминг не настроен. Как-то бесполезно, уж извините
Спасибо! информативно.
Подключаем LLMку в свой Java/Kotlin проект через Docker