С появлением первых открытых языковых моделей, способных генерировать код, мой подход к разработке начал трансформироваться. Первые версии llm помогали мне компоновать функций в ООП, создавать каркас для будущих программ, даже иногда выдавали какой то результат в сложных решениях, который можно было доработать и использовать. Если в начале пути соотношение усилий было 90/10 в пользу «куска мяса» (то есть меня), то сейчас цифры те же, но уже в пользу зарождающегося цифрового интеллекта... Сообщество молодых исследователей 2000-х "разгоняют" развитие цифрового интеллекта невообразимыми для исследователей прошлого века темпами, технологическая сингулярность запущена, уже достаточно характеристик что бы признать данный факт, хорошо это или плохо в будущем узнаем, усилия которые прилагают ученые и государства не заставят долго ждать результат. Главное, настроение ученных в чьих руках возможность выпустить из под контроля супер интеллект, так что самые умные из нас, носители аналоговых сигналов, всё так же будут получать мега зарплаты что бы минимизировать плохое настроение. Алгоритм из 1950-х, дополненные обучением с подкреплением, вопреки скептикам, эволюционируют в системы с элементами самомотивации и дедукции дополнив имеющиеся внимание, способствуя созданию AGI.

Когда microsoft представила phi-3-mini, демонстрация возможностей llm быть компактной и достаточно производительной для решения многих задач, в том числе генерировать код, я решил провести эксперимент. Суть эксперимента проста - создать чат бота для telegram, делегируя кодогенерацию самой llm, минимизируя человеческое вмешательство в построении программы. Не обладая нужными знаниями, не смог создать что то подобное текущему воплощению рассуждений в "топовых" языковых моделях, но моих навыков хватило быть неплохим учителем для модели, проверяя её решения, указывая на ошибки для дальнейшего создания работающего решения, конечно это не обучение с подкреплением, а теорема о бесконечных обезьянах в действии... Результат? Telegram бот, работающий на gpu nvidia и intel, созданный языковой моделью https://github.com/naturalkind/agi/tree/v0.1

Стартовал эксперимент на оборудовании с gpu nvidia rtx 3090, закончил на intel arc a770 16gb. Собрал отдельную игровую площадку для экспериментов на китайской материнской плате с распаянным мобильным i9-12900h и встроенным gpu Intel Iris Xe, 32gb ОЗУ, для работы ускорителей в тандеме балансируя нагрузку. Итоговая производительность в данной конфигурации не вызывает восторга в сравнении с rtx 3090, но главное работает. Количество генераций от начала до решения которое представляю в этой статье - 9534 (8 месяцев).
Возможности бота
Мультимодальность: обработка текста, голоса и файлов (.txt, .py, .cpp)
Контекстное общение: история диалога хранится в SQLite
Кэширование ответов: Redis для ускорения повторяющихся запросов
Голосовой интерфейс:
Распознавание речи через Whisper Large v3
Синтез голоса с клонированием голоса пользователя (XTTS)
Генерация кода: анализ и исправление Python/C++ кода

Технологический стек
Ядро AI:
Phi-3-mini (4k instruct) для текстовой генерации
Whisper Large v3 для ASR
XTTS v2 для синтеза речи
Инфраструктура:
Torch + Intel Extension for PyTorch (IPEX)
Асинхронная обработка (Tornado, ZeroMQ, AioHTTP)
Кэширование (Redis)
База данных (SQLite)
Будем анализировать версию для intel, в машинном обучении не только nvidia едины... Intel в машинном обучении: путь «новичка» сквозь тернии к звёздам
Сравнивая работу gpu intel и nvidia, nvidia явный лидер, все современные решения запускается из коробки с минимальным количеством манипуляций. По времени подготовки систем к работе - паритет, драйверы, дополнительные компоненты для вычислений устанавливаются без особых трудностей, vpn обязателен для моего региона. В дальнейшей работе с intel у меня возникало недовольство, не понятная работа torch.xpu.empty_cache(), в nvidia вызов torch.cuda.empty_cache() освобождает N количества памяти после генерации llm. У intel, при первом запуске arc a770 16gb может генерировать 800 новых токенов, второй раз при генерации получаю ошибку нехватки памяти, torch.xpu.empty_cache() не работает, поэтому ограничение на генерацию новых токенов 500, и даже так, в работе чат бота, память выходит за пределы существующего объема устройства, но продолжает стабильно работать. Встроенная графика intel iris xe с whisper работает медленней чем cpu. У intel есть потенциал, но нужно работать над по. В данный момент это выбор энтузиастов готовых тратить время на изучение архитектуры intel. В будущем нужно расширить эксперимент и дать возможность llm оптимизировать себя и рабочее окружение.

Архитектура решения предложенная llm
Первая рабочая версия telegram бота была синхронной, на её создание ушло 1219 генерации, что очень мало в масштабах полученного кода и реализованного функционала. Перейти с синхронной версии на асинхронную, языковая модель смогла за 542 генерации, основной каркас программы сформирован в синхронной версии.
# Главный цикл обработки сообщений
async def pipeline_worker():
# Инициализация моделей на разных устройствах
model.to("xpu:0") # Phi-3 для текста
whisper_model.to("xpu:1") # Whisper для речи
xtts_model.to("xpu:1") # XTTS для синтеза
while True:
message = await receiver.recv()
# Распределение задач по типу контента
if message_type == 'voice':
audio → Whisper → текст → Phi-3 → ответ → XTTS → голос
else:
текст → Phi-3 → ответКлючевые оптимизации
Использование Intel IPEX:
# Оптимизация моделей для Intel GPUs
model = ipex.optimize(model, dtype=torch.bfloat16)Асинхронная обработка:
Tornado для веб-сервера
ZeroMQ для межпроцессного взаимодействия
Отдельные процессы для:
Веб-сервера
AI-пайплайна
Отправки сообщений AioHTTP
Управление памятью:
# Когда бот пытается работать с памятью:
@contextmanager
def xpu_memory_scope(device="xpu:0"):
try:
yield
finally:
torch.xpu.synchronize() # "Эй, память, не убегай!"
torch.xpu.empty_cache() # Принудительная очисткаСтарт программы
Интересно реализован запуск с передачей lamda в tornado, динамическое связывание зависимостей, позволяет «пробрасывать» изменяемое состояние (typing_tasks) в хендлеры без использования глобальных переменных.
Гибридная архитектура - мультипроцессинг + асинхронность, запуск отдельного процесса для pipeline_worker через multiprocessing.Process. Использование асинхронного цикла событий Tornado (IOLoop) для обработки HTTP-запросов и ответов, сочетание двух парадигм: параллелизм процессов и асинхронное I/O.
ZeroMQ для межпроцессного взаимодействия напоминает pipeline-архитектуру, где процессы работают как конвейер. PUSH-PULL паттерн:
sender.connect(ZMQ_PIPELINE_ADDRESS)отправляет задачи в pipelinereceiver.connect(ZMQ_RESULT_ADDRESS)принимает результаты
Скрытый текст
Реализация отображения набора текста, одна из сложных задач с которой столкнулась языковая модель, 781 попытка ушла на реализацию функционала у phi 3
if __name__ == '__main__':
mp.set_start_method('spawn') # для совместимость с ОС.
# Запуск сервера
Process(target=start_pipeline_worker).start()
zmq_context = Context.instance()
sender = zmq_context.socket(zmq.PUSH)
sender.connect(ZMQ_PIPELINE_ADDRESS)
receiver = zmq_context.socket(zmq.PULL)
receiver.connect(ZMQ_RESULT_ADDRESS)
typing_tasks = {}
application = tornado.web.Application([
(r'/', MessageHandler, dict(
sender=sender,
send_message_func=lambda chat_id, message_id, text: send_message(chat_id, message_id, text, typing_tasks),
typing_tasks=typing_tasks
)),
])
http_server = tornado.httpserver.HTTPServer(
application,
ssl_options={
"certfile": "YOURPUBLIC.pem",
"keyfile": "YOURPRIVATE.key",
"ssl_version": ssl.PROTOCOL_TLSv1_2
}
)
http_server.listen(8443)
logger.info("Server started on port 8443")
io_loop = tornado.ioloop.IOLoop.current()
io_loop.add_callback(process_responses, receiver, lambda chat_id, message_id, text: send_message(chat_id, message_id, text, typing_tasks))
io_loop.start()Tornado + ZMQ: Мощная комбинация для высоконагруженных приложений, где Tornado обрабатывает HTTP, а ZMQ — межсервисное взаимодействие. Языковая модель создала хороший пример современного асинхронного Python-приложения, сочетающего несколько технологий для баланса между производительностью и сложностью.
Моя оценка кода: 6/10
Обоснование:
+ Реализована сложная функциональность (мультимодальность, асинхронность).
+ Есть оптимизация под Intel.
– Критические уязвимости в безопасности.
– Отсутствие структуры и документации.
– Риски нестабильности из-за ручного управления памятью.
Код имеет потенциал, но требует доработки для production-использования. Моя оценка совпала с мнением deepseek r1. Китайская поделка намного лучше сформулировала статью, чем эту, которую вы прочитаете, созданную примитивной формой жизни
