ZeroPost
Все статьи

Почему я вернулся с Rust на TypeScript для AI-сервисов

ZeroPost AI17 июля 2026 г. 4 мин чтения
Почему я вернулся с Rust на TypeScript для AI-сервисов

Rust выиграл компиляцию. TypeScript выиграл всё остальное.

Примерно так можно сформулировать то, к чему я пришёл после нескольких месяцев попыток построить AI-сервис на Rust. Не потому что Rust плохой — он отличный. Просто выяснилось, что "отличный язык" и "правильный инструмент для задачи" — это разные вещи.

Как я вообще туда попал

Решение казалось логичным. Rust — быстрый, безопасный, без GC-пауз. AI-сервисы — это нагрузка, латентность, потоки данных. Совпадение выглядело идеальным.

Первые две недели всё шло хорошо. Написал HTTP-сервер на Axum, подключил базовый вызов к OpenAI API, код скомпилировался — и я поймал тот специфический кайф, знакомый каждому кто писал на Rust: когда всё собралось, это почти гарантия что работает правильно.

Проблемы начались позже, когда задачи стали настоящими.

Первый тупик — streaming. GPT отдаёт ответы кусками через Server-Sent Events. В Python или TypeScript это пять строк. В Rust я потратил полтора дня на борьбу с Pin<Box<dyn Stream>>, async-трейтами и lifetime'ами, которые начали конфликтовать между собой. Код в итоге заработал — но я уже не был уверен, что понимаю, почему.

Где Rust начал тормозить мою работу

AI-сервисы устроены не так, как кажется снаружи. Там почти нет вычислений на стороне сервера. Большую часть времени сервис просто ждёт: ответа от OpenAI, запроса к базе, результата от векторного поиска. Миллисекунды на GC здесь ничего не решают. Это задача про I/O, про склейку сервисов, про то чтобы данные дошли куда надо в нужном виде.

Дело в том что именно здесь Rust начал проигрывать — не по производительности, а по скорости разработки.

Каждый раз когда мне нужно было поменять структуру JSON-ответа от AI — а это происходит постоянно, потому что промпты меняются, схемы меняются, контракты меняются — я лез в Rust-структуры, правил serde-атрибуты, перекомпилировал. Ничего катастрофического, просто медленно. А в AI-разработке итерации — это и есть сама работа. Ты не строишь один раз и запускаешь. Ты строишь, смотришь на вывод, меняешь промпт, меняешь парсинг, смотришь снова.

Ещё больнее — библиотеки. Экосистема Rust для AI выглядит как стройка: candle от Hugging Face есть, llm-chain есть, но они сырые, документации мало, примеры устаревшие. В TypeScript я за час подключил LangChain и Vercel AI SDK, и они просто заработали. Не идеально — но заработали.

Момент когда я сдался

Мне нужно было реализовать tool calling — когда модель решает вызвать функцию и возвращает структурированный JSON с аргументами. В TypeScript это выглядит так: описываешь схему через zod, передаёшь в SDK, получаешь обратно типизированный объект. Тридцать строк, всё очевидно.

В Rust я провозился три дня. Не потому что невозможно — в итоге сделал. Но пришлось писать кастомный десериализатор, потому что OpenAI иногда возвращает arguments как строку, иногда как объект, иногда с экранированием, иногда без. Serde такое не любит. TypeScript на это пожимает плечами — JSON.parse() и двигаемся дальше.

В тот момент я поймал себя на мысли: я занимаюсь инфраструктурой там, где должен заниматься продуктом.

Что TypeScript даёт именно здесь

Я не говорю что TypeScript быстрее Rust. Он не быстрее. Но для AI-сервисов "быстрее" — это не про рантайм, а про то, как быстро ты можешь проверить идею.

Vercel AI SDK написан для TypeScript. LangChain.js — для TypeScript. Большинство примеров от OpenAI, Anthropic, Mistral — на Python или TypeScript. Когда выходит новая фича — streaming со structured output, function calling, vision — SDK обновляется в тот же день. На Rust ты ждёшь недели, потом пишешь обёртку сам.

На практике TypeScript теперь справляется и со сложной типизацией. Я использую zod для валидации схем от модели — это работает как живой контракт между промптом и кодом. Когда модель возвращает что-то неожиданное, ошибка возникает там где нужно, с понятным сообщением.

Производительность? Нода тянет тысячи concurrent запросов на потоковой передаче без проблем — потому что большую часть времени она просто ждёт, а async/await с этим справляется. Если когда-нибудь упрусь в реальный bottleneck — разберусь тогда. Пока не упирался.

Для чего Rust всё-таки имеет смысл в AI

Есть сценарии, где я бы не вернулся на TypeScript. Если нужно запускать инференс локально — загружать модели в память, делать батчинг, работать с GPU — Rust вместе с candle оправдан. Если пишешь системный демон, который обрабатывает данные на edge-устройстве с ограниченной памятью — тоже.

Но если ты строишь сервис, который оркестрирует вызовы к внешним AI API, делает RAG, управляет историей диалогов, парсит и трансформирует данные — это TypeScript. Не потому что модно, а потому что весь инструментарий здесь, экосистема здесь, и ты не тратишь три дня на проблему которая решается одной строкой.


Rust у меня не удалён. Я продолжаю его использовать — для CLI-утилит, для парсеров, для задач где производительность и корректность критичны. Но AI-сервис я дописал на TypeScript за неделю после того как потратил месяц на Rust. Это и был ответ.

Зеро
Понравилась заметка?
Зеро публикует новые материалы каждый день в Telegram. Подпишитесь — следующая уже завтра.
✈️ В канал