Ни дня не проходит, чтобы не появилась какая‑нибудь статья об LLM. И каждый раз, читая их, мне, как старому деду, хочется воскликнуть: «Вы всё делаете неправильно! Какое принятие решений? Какие математические расчёты? А вот в pet проекте - ей самое место!»
Почти у каждого разработчика, который имеет хоть немного свободного времени, есть свои домашние проекты. Обычно они характеризуются малым временем на разработку, применением только для себя любимого или ближайшего круга лиц и большей лояльностью к защите от дурака.
Предлагаю посмотреть варианты применения LLM в таких проектах, которые для меня оказались неочевидны (хотя допускаю, что только мне они кажутся такими — возможно, это банальщина, которую знает каждый; если так, кидайте в меня тапки!).
Нормальный переводчик с человеческого на компьютерный
В те времена, когда умные дома только начинали появляться, мне казалось, что эта идея будет сильно тормозить именно из‑за того, что для автоматизации нужно быть разработчиком (тогда пришлось заниматься реверс‑инжинирингом приложения домофона, чтобы управлять им голосом). Сейчас, используя LLM, можно легко и довольно точно конвертировать голосовые команды в управляющие, а текстовые описания в скрипты. Например:
— Можно загрузить все устройства в контекст запроса: «У тебя под управлением есть люстра на кухне (1), люстра в коридоре (2) и люстра в гостиной (3). Выведи массив цифр тех устройств, которые нужно включить по команде „%s“, или пустой массив, если ты считаешь, что команда не соответствует никаким устройствам».
По запросу «включи свет везде» мы получим [1, 2, 3]
, а по запросу «я начинаю готовить, включи свет» — [1]
. Конечно, пример намеренно упрощён, но если у вас есть умный дом с необходимостью интегрировать сложные сценарии, достаточно подробно описать для LLM все устройства и сценарии их использования. Больше не нужно запоминать строгие команды или перечислять их по одной.
Считаю преступлением то, что Яндекс ещё не добавил в своём умном доме возможность писать сценарии автоматизации на человекочитаемом языке. Но оставим это на его совести. И, конечно же, доверять управление критической инфраструктурой, которая может привести к пожару или техногенной катастрофе, таким решениям не стоит, но включить лампочку не там — это ещё не страшно.
Такой подход так‑же применим не только для умного дома — а везде где есть некоторый список, и нужно интерпретировать человеческую речь в соответствии с одним из пунктов списка. Так что следующий пункт фактически о том-же.
Нечеткое сравнение
Пример такой — допустим у вас есть своя домашняя библиотека/картотека/лекарствотека, и вы хотите проверить вхождение в неё некоторой единицы. Конечно самым быстрым с точки зрения производительности и единственно адекватным для коммерческого применения — будет завести базу данных с полными данными каждой единицы контента, после чего проводить полное сравнение по набору критериев и использовать механизмы нечеткого поиска. Но если это ваша домашняя база, то может оказаться намного быстрее (с точки зрения затраченного на разработку времени) — просто выгрузить перечень всего, что там есть в качестве списка, и отдать llm с запросом вида «Скажи есть‑ли произведение %searched в списке %list. Выведи только его название»
И даже если книга в вашем списке будет называться «Братья Стругацкие, Пикник на обочине, сборник, 2003», а в поиск человек введёт «Пикник у обочины» — llm практически всегда выдаст верный результат. Опять же — критичность точности ответа в данном случае не так высока, и ошибки llm мы можем себе простить.
Парсер
Мне кажется у каждого возникала ситуация, когда хотелось подписаться на rss какого нибудь источника, а у него не оказывалось rss, или в нём отдавались только заголовки статей. Или нужно было достать из страницы какие‑нибудь данные, для которых нет api.
В будущем поколении llm от openai и прочих для таких задач придумали агентов, которые по запросу должны уметь сходить на нужный сайт и заказать там пирожок. Но видимо (надеюсь в комментариях мне подтвердят или опровергнут) — и актуальные модели обучались, в том числе на веб страницах в их html представлении. Как итог - теперь запросом «Напиши только текст основной статьи с web страницы '%page'» или «Напиши только сумму на счету из страницы '%page' » (где%page — это конечно‑же не url, а html текст страницы) — можно получить со страницы только искомый результат. Более того, такой метод можно считать в некотором смысле лучше прямого парсинга страницы руками — ответ llm в данном случае хоть и теряет предсказуемость в сравнении с классическим подходом, но зато довольно устойчив и изменению страницы — и перенос баланса или изменения id блока с текстом статьи на него не повлияют.
Ну и да, можно действовать и в обратную сторону - заворачивая текстовое описание в форматированные запросы, но я таким не занимался и за точность ответов не скажу.
LLM внутри игры
Не буду подробно расписывать этот блок, т.к. недавно уже вышла хорошая статья на этот счет.
Почти любой анализ текстовый анализ
Вообще это самый очевидный пункт, и он тут так — на всякий случай. LLM неплохо способны на практически любой анализ текста (да они фактически созданы для этого) — можно указать в промпте что вам нужно определить эмоциональный окрас текста, отформатировать его в соответствии с каким то шаблоном, сократить до смысла — и скорее всего модель успешно с этим справится.
Теперь к практике
Со времен, когда чтобы собрать проект нужно было руками скачивать зависимости с разных ресурсов, добалять их в виде импортов, и молиться чтобы собралось — мир стал намного прекраснее. Я не буду рассматривать облачные решения т.к. считаю неуместным их использование в домашних проектах - но если вам норм - у них всё еще проще и отличная документация а мы рассмотрим selfhosted вариант :-)
Для поднятия локальной llm и работы с ней сейчас достаточно:
Скачать ollama с официального сайта
Выполнить в консоли ollama run %model с нужным именем модели (я например использую т‑банковские модели, конкретно hf.co/ktibr/T‑pro‑it-1.0-Q8_0-GGUF:latest т.к. они хорошо справляются с русским, спасибо им за публикацию)
-
И на этом по сути всё! Ollama сама скачает модель и поднимет web сервер, с которым далее вы можете общаться по адресу http://127.0.0.1:11 434/api/generate кидая в неё обычные post запросы с json вида { «model»: «Название выбранной модели», «prompt»: «Текст запроса», «stream»: false } (да, там есть и другие возможности, у ollama есть отличная страница с документацией с которой следует ознакомиться).
Все - можно общаться с llm из любого известного языка программирования, только рекомендую выставить таймаут по больше - возможно все 15 минут, если железо не особо быстрое.
Да для быстрого инференса нужно сверх дорогое и быстрое железо. Но нужен ли нам быстрый инференс и большая модель одноврменно? Для задач умного дома/поиска подойдут самые небольшие модели, а для парсинга/сравнения/анализа текста — зачастую не нужно даже близко работать в реальном времени.
Как пример — кручу большие модели на процессоре i7–8700k которые уже отправлен в отставку в связи с 8 летним сроком службы, с 48гб озу ddr4. Анализ текста большой статьи может занять на нём 10 минут, но меня не сильно беспокоит, что я получу страницу новостного сайта на 10 минут позже :-)
Ну и важно понимать — что чем короче ответ, тем быстрее инференс. Например, если задать в промпте требование отвечать только одним словом — ответы будут приходить даже с обработкой на cpu и большой моделью — почти сразу (и будут очень мудро философскими).
Заключение
Лично для меня llm интересны тем, что когда необходимо сделать mvp/pet проект — где времени на разработку примерно 0 часов, а требования к качеству лояльные — то можно временно или навсегда вместо некоторых алгоритмов и инструментов использовать llm. Написание кода тогда сократится до написания prompt‑a, эффективность и производительность упадет в миллионы раз — но это не всегда имеет значение.
Хочу подчеркнуть, что именно не для написания кода я использую llm - нет, по моему мнению код они пишут пока отвратно, и запустить код написанный llm зачастую сложнее чем написать свой под ту-же задачу.
Имеются и неудачные варианты применения — например при написании тайкуна — решил попробовать на первом этапе вместо выведения формулы продаж относительно геймплейных данных — просто описать параметры в llm и получить количество проданных копий (запрос примерно вида «такая‑то аудитория, продукт такой-то интересности, в сети с таким‑то количеством магазинов и эдаким маркетингом — сколько копий будет продано?») — результат оказался ужасным — пришлось выводить формулу :-)
Если вы в своих домашних проектах применяете или планируете применить llm каким-нибудь нестандартным образом (отличным от текстового ассистента) — то обязательно пишите в комменты, я всю эту статью писал и пытался привести в адекватный вид только ради того, чтобы посмотреть, как еще можно запрячь llm и какие библиотеки или алгоритмы люди им заменяют :-)
Комментарии (10)
gfiopl8
29.01.2025 10:41Что конкретно может делать 8б моделька работающая со скоростью несколько символов в секунду?
Яндекс не просто так не может добавить скилы на человеческом языке, они не могут свой ии даже научить нормально реагировать на команды типа поставь на паузу, это не так просто как кажется.
Spyman Автор
29.01.2025 10:41Даже моделька 1.5b - вполне может разобрать текстовый запрос и выдать номера приборов которые надо включить / выключить. Я собственно это проверял (правда тогда таких маленьких моделей на русском не было, и я проверял на английском). И она даже на процессоре будет выдавать ответ почти мгновенно, тем более что нам и не нужно от неё сложных рассуждений, а нужно как раз несколько символов.
А про яндекс - скорее всего это не так просто как кажется - если речь идет о миллионах запросов, которые им надо обрабатывать и уровне качества при котором включить не тот прибор - это катастрофа. А вот в домашнем варианте - где больше 1 запроса в секунду - уже почти невероятный сценарий, и точность в 95% удовлетворительна - всё сильно проще. Сложность механизмов почти всегда растёт ассимптотически при приближении к идкеальному результату)
JBFW
29.01.2025 10:41Осталось найти небольшую коробочку, желательно безвентиляторную, с много-много-памяти.
Потому что так-то, в общем, ollama можно запустить даже на одноплатнике ARM с 4 гигами, но этого мало.
Spyman Автор
29.01.2025 10:41Решил для себя эту проблему выделив на дне кладовки место под пару full-Tower машин (в конце концов где то ведь и nas должен быть свой, и git). Времена когда rapberry pi были в 10 раз дешевле x86-64 машины как будто уже и прошли, а б/у пк можно достать за копейки (или, что еще проще, не продавать старый при переходе на современное желео :D ).
Ну и даже в небольшой квартире чаще всего можно оборудовать место (например верхние полки шакфов в прихожей до которых никогда не дотянешься, углы кладовки, угловые ящики в п-образной кухне)
Хотя может в недалеком будущем в ollama добавят поддержку нейроускорителей, которые есть на актуальных arm чипах, и мы что-то карманного форм фактора получим))JBFW
29.01.2025 10:41Времена когда rapberry pi были в 10 раз дешевле x86-64 машины как будто уже и прошли
Сейчас можно по копеечной стоимости TV-боксы брать, они и маленькие, и жрут мало энергии.
Очень удобно для всякой автоматизации. Но вот с памятью там беда...Большой х86-64, прежде всего, гудит, а я этого терпеть не могу, отвык. Хотя, можно и вынести куда подальше...
supersmeh
29.01.2025 10:41У НВидеа есть похожая коробочка, там 8 Гигов: nvidia.com/en-us/autonomous-machines/embedded-systems/jetson-orin/nano-super-developer-kit/
Со специальными CUDA ядрами. Как у нас достать не знаю.
artemiy2023
Я использовал OpenAI API в своем пет-проекте, и мне понравилось: https://github.com/solyakov/gpta. Наверное, можно перейти и на deepseek без каких-либо изменений.
Spyman Автор
Попытался понять, что именно делает gptchat в вашем проекте, но сходу не понял - если опишете кейс - будет круто))
А по поводу openai api - верю что с ним нет проблем, но в pet проектах не доверяю сторонним api - потому что они имют свойства меняться, отключаться, уходить под санкции - а я предпочитаю решив задачу, больше к поддержке никогда не возвращться - работает - не трогай)
artemiy2023
Он делает то, что ему говорят. В двух словах, это chatgpt, подключенный непосредственно к
/bin/bash
Maksclub
прикольная, но кажется немного опасная