Мы построили AI-агента на Python без if/else
Начиная проект AI-агента с персистентной памятью, мы приняли необычное решение: никаких if/else в агентной логике.
Не "минимизируем". А ноль.
Полгода спустя — это лучшее архитектурное решение которое мы приняли.
Изучая код других агентных фреймворков, видели один паттерн:
if user_emotion == "angry":
apologize()
elif user_emotion == "happy":
celebrate()
elif context_length > 8000:
summarize()
Проблема очевидна: это не масштабируется. 10 условий → понятно. 100 условий → сложно. 1000 → невозможно.
Решили не идти этим путём с первого дня.
Принцип: всё вычисляется
Вместо категорий — непрерывные метрики
Классика:
if task.urgency == "high":
priority = 1
elif task.urgency == "medium":
priority = 2
Наш подход:
priority = (
deadline_pressure(task) * 0.4 +
importance_weight(task) * 0.3 +
context_multiplier() * 0.3
)
Вместо ветвления — параллельный scoring
Классика:
if query_simple:
use_cache()
elif resources_available:
deep_search()
else:
hybrid()
Наш подход:
strategies = {
'cache': compute_cache_score(query),
'deep': compute_deep_score(query),
'hybrid': compute_hybrid_score(query)
}
best = max(strategies, key=strategies.get)
Каждый вариант оценивается независимо. Выбираем лучший.
Что это даёт
Модульность
Каждая scoring function тестируется отдельно. Нет coupling между компонентами.
Композиция
Одни и те же базовые функции комбинируются по-разному:
score_v1 = urgency * 0.5 + importance * 0.5
score_v2 = urgency * 0.3 + importance * 0.3 + context * 0.4
Обучаемость
Веса можно обновлять градиентно:
error = actual - expected
weights['urgency'] += learning_rate * error
Объяснимость
Не "if на строке 342 сработал", а "X scored 0.85 (temporal: 0.3, semantic: 0.4, resource: 0.15)".
scoring/
├── temporal.py # urgency, deadlines
├── semantic.py # similarity,