Я работаю с POC (proof-of-concept. проверка концепции), где мы используем Ktor (Kotlin Framework) в качестве бекэнда DSL. В этом проекте нами извлекается обобщенное резюме из значительного объема текста. Мы столкнулись с проблемой написания кода машинного обучения на Kotlin. Kotlin молод по сравнению с Python, R и т.д.
Любая технология, которую мы выберем, должна иметь
Сильную библиотечную поддержку, позволяющую нам сосредоточиться на проблемах бизнеса
Независимость от платформы
Высокую производительность труда разработчиков
Надежность при масштабировании
Ориентированность на будущее, способность поддерживать рост нашего бизнеса.
Мы сравнили языки с учетом этих требований. Ниже представлен список, который поможет нам сравнить и сопоставить сильные и слабые стороны каждого варианта.
Сравнение языков
Python
Плюсы :
Простота и лаконичность
Отличная экосистема библиотек
Гибкость
Независимость от платформы
Поддержка сообщества
Минусы :
Меньшая скорость
Ошибки во время выполнения
Нелегко тестировать
R
Плюсы:
Открытый исходный код
Используется в процессе преобразования необработанных данных из одного формата в более подходящий (data wrangling)
Используется для качественного построения графиков и диаграмм
Независимость от платформы
Становится популярным
Минусы:
Слабый исходник
Обработка данных
Базовый уровень безопасности
Меньшая скорость
Kotlin
Плюсы:
Наследует экосистему Java.
Null-безопасный
Быстрый и масштабируемый
Имеет нативные примитивы для параллелизма
Минусы:
Ограниченная поддержка машинного обучения
Имеет ограниченную поддержку сообщества
Мы решили использовать Python для машинного обучения. Бэкэнд разрабатывается на языке Kotlin, а суммаризация текста выполняется с помощью Python. Нам нужно было обеспечить взаимодействие между Kotlin и Python. Вот некоторые варианты взаимодействия Kotlin и Python.
Варианты взаимодействия
Python
Плюсы:
Интерактивное экспериментирование (Kotlin/Java и Python)
Быстрая разработка приложений
Производительность выше по сравнению с Python
Минусы:
Не все библиотеки поддерживают Jython
Необходима дополнительная настройка для запуска программы
Отдельный сервер Python, взаимодействующий с сервером Kotlin
Плюсы:
Гибкость
Разделение проблем
Минусы:
Задержка
Дополнительные сетевые вызовы
Оба варианта не соответствуют требованиям, поэтому мы решили использовать Python-скрипт вместо Python-проекта. Python-скрипт будет выполняться на той же машине, где находится сервер Kotlin.
Настройка окружения
Для выполнения Python скрипта требуются различные библиотеки. Поэтому нам нужно настроить для него определенное окружение. Для настройки, пожалуйста, выполните следующие шаги:
Проверьте, установлен ли Python в вашей системе, используя команду
python - version
. Если Python не установлен, пожалуйста, установите его.
Проверьте, установлен ли pip в вашей системе, используя команду
pip - version
. Если pip не установлен, пожалуйста, установите его.
Установите pip с помощью команды
Python3 get-pip.py
.Обновите pip до последней версии командой
pip3 install - upgrade pip
.
Установите необходимые библиотеки для скриптов Python, такие как (Numpy и NLTK), используя pip.
Запустите Python-скрипт. Для получения дополнительной информации о том, как мы создавали Python-скрипт, обратитесь к этой статье.
Вышеуказанные настройки необходимы для запуска Python-скрипта на локальной машине. Теперь перед нами стоит другая задача — запустить Python-скрипт из кода Kotlin и получить результат.
Окончательное взаимодействие
Вот фрагмент кода, который мы использовали для запуска Python-скрипта из Kotlin-кода.
![](https://habrastorage.org/getpro/habr/upload_files/869/29a/feb/86929afeb7ac8a4ae287363c3c6b98fe.png)
Этот код отвечает за выполнение скрипта и получение результата. Давайте разберем код шаг за шагом:
Создайте процесс для того, чтобы запустить скрипт:
![](https://habrastorage.org/getpro/habr/upload_files/302/17e/aab/30217eaab9e9d0cf98011ef3b7c3e298.png)
Создайте процесс, который принимает в качестве входных параметров путь к файлу обобщенного скрипта, суммаризованный текст и заголовок обобщения. Этот процесс отвечает за выполнение команд на терминале и генерацию выходных данных.
Прочитайте вывод:
![](https://habrastorage.org/getpro/habr/upload_files/aeb/f17/575/aebf17575a9c600938f5218f1ab48804.png)
Мы создаем BufferReader для построчного чтения вывода из терминала.
Прочитайте журналы ошибок:
![](https://habrastorage.org/getpro/habr/upload_files/70a/569/7c0/70a5697c0715de80a49eb904fee95b3a.png)
Если во время выполнения скрипта или генерации вывода что-то пошло не так, то нам нужно прочитать журналы ошибок, созданные скриптом или процессом. Используя BufferReader, читаем журналы ошибок, выведенные на терминал.
Уничтожить процесс: После прочтения вывода скрипта нам нужно завершить процесс.
![](https://habrastorage.org/getpro/habr/upload_files/da5/f95/b7c/da5f95b7c50beae1e141be17b75aaa8e.png)
Резюме
С помощью описанных выше шагов мы смогли выполнить Python-скрипт, обработать ошибки и предоставить его результат в качестве ответа нашему клиенту. Надеюсь, это поможет тем, кто ищет хорошее решение для взаимодействия Kotlin и Python. Чтобы узнать больше о том, как данный фрагмент вписывается в наш более крупный проект, обратитесь к этим статьям:
Пользовательский интерфейс и общая архитектура
Экстрактивная суммаризация
Абстрактная суммаризация
Машина состояний, или, по-другому, конечный автомат — это мощное средство описания бизнес-логики разрабатываемого приложения. Приглашаем на открытый урок, на котором мы рассмотрим как теоретические, так и практические аспекты использования машины состояний, а также пределы их применения. Полученные на вебинаре знания позволят более широко и осознанно применять конечные автоматы в задачах разработки и получать более эффективный код. Записаться на урок можно на странице онлайн-курса "Kotlin Backend Developer. Professional".