С тех пор как я стал регулярно пользоваться ChatGPT в повседневной работе, меня не оставляла мысль о создании виртуального секретаря, который бы записывал все мои разговоры, сохранял места в которых я бываю, а также регистрировал занятия, которыми я занимаюсь в течение дня. С помощью такого помощника всегда можно было бы вспомнить с кем о чём говорил или что делал в любой интересующий момент прошлого. Также было бы здорово получать советы по планированию с учётом накопленных обо мне знаний.
Однако реализация такого проекта кажется слишком сложной и ресурсоёмкой. К тому же, нет уверенности, что подобный инструмент будет действительно востребован. Поэтому я решил сузить задачу до создания виртуального помощника, способного решать задачи администрирования компьютера по запросам на естественном языке. Тем не менее, даже такая задача оказывается далеко не простой. Чтобы быть полезным, помощник должен хорошо понимать операционную систему, отслеживать действия пользователя и уметь создавать и выполнять скрипты для решения поставленных задач.
В итоге я решил начать с более реалистичного подхода — разработать небольшую CLI-утилиту, которая преобразует запросы на естественном языке в вызовы встроенных инструментов. Напрашивается идея генерации и выполнения shell-команд, но на практике этот подход неэффективен. LLM часто путаются в аргументах командной строки и не всегда корректно интерпретируют вывод. К тому же, возникают проблемы с безопасностью предоставления LLM доступа к командной строке. Поэтому я сосредоточился на обработке запросов с помощью ограниченного набора заранее определённых инструментов.
Итак, за пару недель в свободное от других занятий время была написана korah, небольшая консольная Rust-утилита, умеющая на данный момент выполнять лишь две задачи: поиск файлов и выдача информации о процессах.
Примеры использования
Пример поиска файлов:
korah 'pdf файлы на рабочем столе'
{"path":"/Users/simon.golbert/Desktop/nederpelt_geuvers__type_theory_and_formal_proof_an_introduction.pdf"}
{"path":"/Users/simon.golbert/Desktop/cuda-programming.pdf"}
{"path":"/Users/simon.golbert/Desktop/ChartrandPolimeniZhang.pdf"}
...
Пример поиска процесса:
korah 'process that listens to 11434 TCP port'
{"name":"ollama","pid":38876}
Используя флаг -d можно посмотреть полученные параметры инструмента без его запуска:
korah -d 'detailed info for process named with "gram"'
{"tool":"find_processes","params":{"detailed_output":true,"name_regex":"gram"}}
Можно запустить инструмент с данными параметрами минуя фазу LLM-вывода, просто передав их в качестве запроса:
korah '{"tool":"find_processes","params":{"detailed_output":true,"name_regex":"gram"}}'
{"cmd":["/Applications/Telegram.app/Contents/MacOS/Telegram","-noupdate"],"cpu_usage":0.0,"exe":"/Applications/Telegram.app/Contents/MacOS/Telegram","memory":58064896,"read_from_disk":5288710144,"tcp_ports":[62941,62371,62374,62376,62378,62379],"udp_ports":[],"written_to_disk":6127181824,"name":"Telegram","pid":25537}
Параметры, которые утилита может распознавать в запросах
Параметры поиска файлов:
Шаблон имени объекта.
Шаблон содержимого файла.
Директория, где производить поиск.
Тип объекта: файл или директория, символическая ссылка.
Диапазон размеров файла.
Диапазон времени создания и модификации.
Параметры для получения информации о процессах:
Шаблон имени процесса.
Диапазон загрузки процессора.
Диапазон использования памяти (RAM).
Диапазон размера прочитанных или записанных данных на диск.
Используемые TCP или UDP порты.
LLM-бэкенд
Korah поддерживает два LLM-бэкенда: Ollama и OpenAI. Первый - бесплатный, но неторопливый и ресурсоёмкий, особенно на слабых машинах. Второй - быстрый, но платный. Качество вывода параметров запроса тоже отличается - OpenAI ошибается гораздо реже.
Ollama достаточно сносно работает на моём Macbook Pro 16" M2. Перепробовав несколько моделей, я остановился на qwen2.5, обеспечивающей неплохой баланс между производительностью и точностью. OpenAI обеспечивает наилучшее качество вывода параметров, а также высокую скорость работы.
Модели обоих бэкендов работают неидеально. К примеру, qwen2.5 часто путает год при выводе времени создания или модификации файла, а gpt-4o-mini иногда путает между шаблоном имени и шаблоном содержимого при поиске файлов (впрочем, как и qwen2.5). Не знаю, будут ли подобные ошибки воспроизводиться с моделью gpt-4o.
Установка
Установить korah очень легко:
cargo install korah
Потом нужно будет добавить конфигурационный файл в ~/.config/korah.toml (или %USERPROFILE%\korah.toml для Windows):
# Derive tool and parameters in two passes.
# Reduces token usage, but increases response time due to an extra request.
double_pass_derive = false
# The number of tries to derive a tool call.
num_derive_tries = 3
[llm]
api = "ollama"
query_fmt = "Using the context {context} derive a tool call for the following query. {query}"
[llm.ollama]
base_url = "http://localhost:11434"
model = "qwen2.5"
[llm.open_ai]
base_url = "https://api.openai.com/v1"
key = "$OPENAI_API_KEY"
model = "gpt-4o-mini"
Исходный код открыт под лицензией MIT/Apache-2.0. Буду рад, если моя работа будет кому-то полезной.
gfiopl8
Мистраль дает бесплатно через апи 500к токенов в минуту, 1 запрос в секунду, 1млрд токенов в месяц. Более чем достаточно что бы даже мыслей про олламу не возникало. Гугл дает еще больше. А еще самбанова, у нее бесплатное ограничение на самую большую лламу405 - 10 запросов в минуту (и контекст 8к).