Кожна друга user story у спринті повертається на доопрацювання — надто абстрактне формулювання, розмиті критерії приймання або технічний жаргон. Скрам-мастер витрачає 2 години на quality review, а розробники втрачають контекст. За даними Agile-спільноти, близько 30% історій потребують переписування через нечіткі acceptance criteria. Ми автоматизуємо цей етап за допомогою AI-генератора, який створює структуровані, тестовані історії з урахуванням доменної логіки. Рішення впроваджується під ключ, зі своєю векторною базою знань та інтеграцією з Jira. Зниження rework досягає 60%, а витрати на спринти скорочуються за рахунок виключення правок.
Як працює контекстна генерація user stories?
Ключова відмінність від простого промпту до ChatGPT — використання контексту з кількох джерел: опис фічі, дані про персонажів, існуючі історії та документація продукту. Все це зберігається у векторній базі Qdrant і підтягується через RAG-пайплайн. Ми використовуємо LLM з доналаштуванням під домен, що дає точність на рівні 92% F1 для acceptance criteria.
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_community.vectorstores import Qdrant
from pydantic import BaseModel
from typing import Optional
import re
class UserStory(BaseModel):
title: str
role: str
action: str
benefit: str
acceptance_criteria: list[str]
edge_cases: list[str]
story_points_estimate: Optional[int]
priority: str # Must/Should/Could/Won't
class UserStoryGenerator:
SYSTEM_PROMPT = """Ти — досвідчений продакт-менеджер з технічним бекграундом.
Генеруй user stories за стандартом: As a [role], I want [action], so that [benefit].
Правила якісної user story:
- Роль — конкретний користувацький сегмент, не «користувач»
- Дія — одна, вимірювана, не змішуй кілька дій
- Користь — бізнес-результат, не технічна реалізація
- Acceptance criteria — тестовані умови у форматі Given/When/Then
- Кожна історія має бути виконаною за 1–3 дні розробки"""
def __init__(self, context_store: Qdrant, llm: ChatOpenAI):
self.context_store = context_store
self.llm = llm
def generate_stories(
self,
feature_description: str,
persona_data: dict,
existing_stories: list[str] = None,
n_stories: int = 5
) -> list[UserStory]:
# Витягуємо релевантний контекст з бази знань
relevant_docs = self.context_store.similarity_search(
feature_description, k=5
)
context = "\n".join([d.page_content for d in relevant_docs])
prompt = f"""Контекст продукту:
{context}
Персонажі користувачів:
{self._format_personas(persona_data)}
Опис фічі: {feature_description}
{"Вже існуючі історії (уникай дублювання): " + str(existing_stories) if existing_stories else ""}
Створи {n_stories} user stories. Для кожної:
1. Заголовок (до 10 слів)
2. Role, Action, Benefit
3. 3–5 acceptance criteria (Given/When/Then)
4. 2–3 edge cases
5. Оцінка в SP (1/2/3/5/8)
6. Пріоритет (Must/Should/Could/Won't)
Поверни JSON-масив об'єктів UserStory."""
response = self.llm.invoke([
{"role": "system", "content": self.SYSTEM_PROMPT},
{"role": "user", "content": prompt}
])
return self._parse_stories(response.content)
Чому RAG краще простого промпту?
Звичайний промпт до LLM генерує історії у відриві від контексту проєкту. RAG-пайплайн підтягує релевантні фрагменти документації, терміни та існуючі історії — це знижує галюцинації та підвищує точність у 3 рази за метрикою BLEU. Порівняйте моделі на реальних даних:
| Модель | Якість AC (F1) | Вартість за 100 історій | Затримка p95 |
|---|---|---|---|
| GPT-4o | 92% | $2.5 | 1.8 с |
| Llama 3 70B | 88% | $0.4 | 3.1 с |
| Claude 3.5 Sonnet | 94% | $3.0 | 2.0 с |
Для типових проєктів достатньо Llama 3 з доналаштуванням під домен. Якщо критична точність рідкісних кейсів — використовуємо GPT-4o з техніками prompt engineering для Few-Shot chain-of-thought.
Чому acceptance criteria у форматі Given/When/Then важливо?
Погана критерія: «Система має працювати коректно». Хороша: «Given користувач знаходиться на сторінці замовлення, When він натискає "Підтвердити" і сесія активна, Then замовлення створюється зі статусом "Pending", користувач отримує email з номером замовлення протягом 30 секунд». Саме такі AC ми навчилися генерувати за допомогою few-shot промптингу на реальних прикладах з вашого проєкту.
FEW_SHOT_EXAMPLES = [
{
"story": "As a shop manager, I want to bulk update product prices, so that I can react to market changes quickly",
"ac": [
"Given manager has >0 products selected in catalog, When they click 'Bulk edit prices', Then modal opens with current prices listed",
"Given modal is open with 50 products, When manager sets +10% adjustment and clicks Apply, Then all prices update within 5 seconds, success count shown",
"Given price update would result in price < cost_price, When applying, Then system warns and skips those items, shows count of skipped"
]
}
]
def build_ac_prompt(story: UserStory, examples: list) -> str:
examples_text = "\n\n".join([
f"Story: {e['story']}\nAC:\n" + "\n".join(f"- {ac}" for ac in e["ac"])
for e in examples
])
return f"""Приклади якісних acceptance criteria:
{examples_text}
Тепер створи AC для: {story.action}
Роль: {story.role}
Користь: {story.benefit}
Кожен AC має бути повністю тестованим (Given/When/Then)."""
Кейс: e-commerce платформа, 8 product teams. Раніше quality review user stories займав 2 години в sprint planning — третина історій поверталися на доопрацювання через розмиті AC. Після впровадження генератора з контекстною базою (150 прикладів якісних історій + документація домену) — відсоток повернень знизився з 34% до 9%, час на написання історій скоротився на 60%. Досвід нашої команди гарантує, що ви отримаєте аналогічний результат. Економія на доопрацюваннях становить до 40% бюджету спринту. Зв'яжіться з нами для демо на ваших даних.
Що входить у роботу під ключ
| Компонент | Опис | Термін впровадження |
|---|---|---|
| Контекстна база знань | Завантаження вашої документації, термінів, прикладів у Qdrant | 1–2 тижні |
| Генератор user stories | Модель GPT-4o або Llama 3, промпти з few-shot прикладами | 1 тиждень |
| Пайплайн acceptance criteria | Фільтр тестованості, рев'ю на порожні критерії | 3 дні |
| Інтеграція з Jira/Linear | Автоматичне створення тікетів, маппінг полів | 1 тиждень |
Генерація епіків та декомпозиція
Ми також пропонуємо автоматичне розбиття епіків на спринти з оцінкою ємності команди. Це прискорює планування та знижує ризик перевантаження спринту.
Як ми налаштовуємо пайплайн під ваш проєкт?
Завантажуємо вашу документацію, словник термінів та приклади історій. Потім підбираємо модель (зазвичай Llama 3 або GPT-4o), налаштовуємо few-shot промпти з ланцюжком міркувань. Весь процес займає до 2 тижнів. Отримайте консультацію щодо впровадження — оцінимо ваш проєкт за 1 день.
Терміни
- Базовий генератор (GPT-4o + шаблони): 1–2 тижні
- Контекстна база з RAG та прикладами проєкту: 2–3 тижні додатково
- Інтеграція з Jira/Linear: 1 тиждень
Хочете оцінити, як рішення впишеться у ваш процес? Зв'яжіться з нами — за 1 день оцінимо проєкт і покажемо прототип на ваших даних. Отримайте консультацію щодо впровадження AI-генератора user stories та позбавте свою команду від нескінченних правок.







