Каждая вторая 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 и избавьте свою команду от бесконечных правок.







