Перейти к содержанию

Введение

mlango — фреймворк «с батарейками» для машинного обучения, аналитики и LLM-агентов, построенный на философии Django.

ML-проекты имеют свойство превращаться в свалку скриптов: один загружает данные, другой обучает, где-то лежит ноутбук, который выдал цифру для презентации за прошлый квартал, и папка checkpoints/, которую уже никто не сопоставит с коммитом.

В веб-разработке была ровно такая же проблема. Django её решил — не тем, что выпустил более удачную библиотеку, а тем, что стал фреймворком: структура проекта, модуль настроек, декларативные классы, миграции, автоматическая админка и manage.py, который всё это связывает. mlango применяет этот ответ к машинному обучению.

Вы объявляете датасеты, модели, агентов и оценки. Фреймворк их запускает, версионирует, записывает и показывает вам.

Две вещи отличают это от инструментов, которые у вас уже есть. Одно тело класса разом становится страницей админки, документированным эндпоинтом API, миграцией и целью для CLI — связывать не нужно ничего. И агенты — полноправное семейство рядом с моделями: общий метастор, общая админка, общая система оценки, а не отдельный стек.

Уже пользуетесь MLflow, Kedro, W&B или LangChain?

mlango и альтернативы — где находится каждый из них, что действительно пересекается и, сказанное прямо, когда mlango не подходит.

Установка

pip install "mlango[sklearn]"
Extra Что добавляет
sklearn тренер на scikit-learn
torch тренер на PyTorch
anthropic провайдер Claude для агентов
dev pytest, ruff, mypy
all всё перечисленное

Пять минут с нуля

mlango startproject myproject
cd myproject
python manage.py migrate
python manage.py train demo.Sentiment
python manage.py runserver

Откройте http://127.0.0.1:8000/admin/.

В отличие от пустого каркаса, свежий проект mlango уже содержит рабочий пример — датасет, обученную модель с настоящими метриками, агента с инструментом и набор оценок. В админке с первого взгляда есть что смотреть, и это разница между «понятно, как это работает» и «а дальше-то что?».

Чтобы дойти до этой точки, настраивать ничего не нужно: метастор — SQLite, артефакты пишутся в локальную папку, а агенты работают на офлайн-провайдере, которому не нужен API-ключ.

Нужен пустой проект?

mlango startproject myproject --bare создаст проект без демо-приложения.

Как выглядит декларация

# reviews/datasets.py
from mlango.core import fields
from mlango.data import Dataset, JSONLSource

class Reviews(Dataset):
    """Отзывы покупателей о товарах."""

    id = fields.IntegerField()
    text = fields.TextField()
    label = fields.LabelField(["negative", "positive"])

    class Meta:
        source = JSONLSource("data/reviews.jsonl")
        primary_key = "id"
# reviews/models.py
from mlango.core import fields
from mlango.training import Model
from reviews.datasets import Reviews

class Sentiment(Model):
    """TF-IDF и логистическая регрессия."""

    max_features = fields.IntegerField(default=20_000, tunable=True)
    C = fields.FloatField(default=1.0, min_value=0.0, tunable=True)

    class Meta:
        dataset = Reviews
        trainer = "sklearn"
        task = "classification"
        features = ["text"]

    def build(self):
        from sklearn.feature_extraction.text import TfidfVectorizer
        from sklearn.linear_model import LogisticRegression
        from sklearn.pipeline import make_pipeline
        return make_pipeline(
            TfidfVectorizer(max_features=self.max_features),
            LogisticRegression(C=self.C),
        )
# support/agents.py
from mlango.agents import Agent, BufferMemory, tool

@tool
def search_docs(query: str, limit: int = 5) -> list[str]:
    """Поиск по документации продукта.

    Args:
        query: Что искать.
        limit: Максимум результатов.
    """
    return retrieve(query, limit)

class Support(Agent):
    """Отвечает на вопросы о продукте по документации."""

    class Meta:
        model = "claude-opus-5"
        system = "Ты инженер поддержки. Ссылайся на использованные разделы документации."
        tools = [search_docs]
        memory = BufferMemory(k=20)
# support/evals.py
from mlango.evals import Eval, contains_all, token_f1

class AnswerQuality(Eval):
    """Отвечает ли агент именно по документации?"""

    class Meta:
        dataset = SupportCases
        target = Support
        input_field = "question"
        expected_field = "answer"
        scorers = {"overlap": token_f1, "cited": contains_all("docs/")}
        threshold = 0.6

Дальше:

python manage.py train reviews.Sentiment -p C=2.0

Эта одна команда находит ваш класс, открывает отслеживаемый ран, ставит сид всем генераторам случайных чисел, детерминированно режет данные на выборки, вызывает ваш build(), ведёт цикл обучения, пишет метрики, фиксирует git-коммит, сохраняет артефакт и регистрирует версию модели, готовую к промоуту. Вы написали build() и четыре объявления полей.

Куда дальше