LLM в Pet проектах

в 10:15, , рубрики: llm

Ни дня не проходит, чтобы не появилась какая‑нибудь статья об 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 и работы с ней сейчас достаточно:

  1. Скачать ollama с официального сайта

  2. Выполнить в консоли ollama run %model с нужным именем модели (я например использую т‑банковские модели, конкретно hf.co/ktibr/T‑pro‑it-1.0-Q8_0-GGUF:latest т.к. они хорошо справляются с русским, спасибо им за публикацию)

  3. И на этом по сути всё! 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 и какие библиотеки или алгоритмы люди им заменяют :-)

Автор: Spyman

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js