AI-приоритизация бэклога и фич продукта
Бэклог из 300+ задач, в котором всё помечено как «High Priority» — стандартная ситуация после полугода разработки. Ручная приоритизация превращается в политические переговоры между командами, а не в data-driven решение. AI-система приоритизации формализует критерии и автоматически ранжирует фичи, подтягивая данные из нескольких источников.
Как работает автоматическая приоритизация
Система агрегирует сигналы четырёх типов:
- Частота запросов — сколько пользователей просят фичу (фидбек, тикеты, интервью)
- Бизнес-импакт — ожидаемое влияние на выручку, удержание, NPS
- Техническая сложность — оценка story points или T-shirt sizing из Jira
- Стратегическое соответствие — насколько фича совпадает с OKR квартала
from langchain_openai import ChatOpenAI
from pydantic import BaseModel
from typing import Optional
import json
class FeatureScore(BaseModel):
feature_id: str
title: str
demand_score: float # 0-10, на основе количества запросов
business_impact: float # 0-10, оценка LLM по описанию
effort_score: float # 0-10, инверсия сложности
strategic_fit: float # 0-10, cosine similarity с OKR
final_score: float # взвешенная сумма
rationale: str # объяснение оценки
class BacklogPrioritizer:
WEIGHTS = {
"demand": 0.30,
"business_impact": 0.35,
"effort": 0.20, # инверсия: меньше effort = выше балл
"strategic_fit": 0.15
}
def __init__(self, okr_embeddings, embedder, llm):
self.okr_embeddings = okr_embeddings
self.embedder = embedder
self.llm = llm
def score_feature(self, feature: dict, demand_data: dict) -> FeatureScore:
# Demand score из агрегированного фидбека
demand_count = demand_data.get(feature["id"], {}).get("mention_count", 0)
demand_score = min(10, demand_count / 50) # 500+ упоминаний = 10
# Strategic fit через cosine similarity с OKR
feat_emb = self.embedder.encode(feature["description"])
strategic_fit = float(
max(cosine_similarity([feat_emb], self.okr_embeddings)[0])
) * 10
# Business impact через LLM
business_impact = self._llm_impact_score(feature)
# Effort (инверсия: 1 SP = 10 баллов, 100 SP = 0 баллов)
sp = feature.get("story_points", 20)
effort_score = max(0, 10 - (sp / 10))
final = (
self.WEIGHTS["demand"] * demand_score +
self.WEIGHTS["business_impact"] * business_impact +
self.WEIGHTS["effort"] * effort_score +
self.WEIGHTS["strategic_fit"] * strategic_fit
)
return FeatureScore(
feature_id=feature["id"],
title=feature["title"],
demand_score=round(demand_score, 2),
business_impact=round(business_impact, 2),
effort_score=round(effort_score, 2),
strategic_fit=round(strategic_fit, 2),
final_score=round(final, 2),
rationale=self._generate_rationale(feature, demand_score,
business_impact, strategic_fit)
)
def _llm_impact_score(self, feature: dict) -> float:
prompt = f"""Оцени бизнес-импакт фичи от 0 до 10.
Фича: {feature['title']}
Описание: {feature.get('description', '')}
Целевые пользователи: {feature.get('target_users', 'не указаны')}
Верни только число от 0 до 10."""
result = self.llm.invoke(prompt).content.strip()
try:
return float(result)
except ValueError:
return 5.0
Интеграция с фреймворками приоритизации
Система поддерживает несколько популярных фреймворков — выбор зависит от зрелости команды:
| Фреймворк | Формула | Когда применять |
|---|---|---|
| RICE | (Reach × Impact × Confidence) / Effort | Стартапы, быстрый рост |
| WSJF | (Business Value + Time Criticality + Risk) / Job Size | SAFe, enterprise |
| ICE | Impact × Confidence × Ease | Ранние стадии, мало данных |
| MoSCoW | Must / Should / Could / Won't | Sprint planning |
| Weighted scoring | Кастомные веса под OKR | Зрелые продуктовые команды |
Кейс: продукт для B2B SaaS, бэклог 280 задач. До внедрения — приоритизация раз в квартал занимала 2 полных дня командой из 6 человек. После — еженедельный автоматический ранжированный список с обоснованием за каждой позицией, время ревью PM — 20 минут. Ключевой результат: фичи из топ-10 системы совпали с «интуитивными» приоритетами команды на 73%, при этом система выявила 4 задачи с высоким demand_score, которые команда системно откладывала.
Работа с конфликтами приоритетов
Частая проблема: Sales хочет фичу для одного крупного клиента (высокий perceived impact), но данные говорят об обратном. Система разделяет «стратегические ставки» (ручная метка PM) от data-driven приоритетов, не смешивает их в одном ранге.
Процесс внедрения
Подключение источников данных (Jira, Linear, фидбек-системы). Формализация критериев приоритизации с командой. Калибровка весов на исторических данных. Запуск в режиме «рекомендации» — команда сравнивает с ручными решениями. Переход к автоматическому ранжированию.
Сроки: базовая система с RICE/ICE — 2–3 недели; полная интеграция с OKR и фидбеком — 6–8 недель.







