Evidence-traced artifacts: каждое утверждение в PRD — со ссылкой на источник
Открываете PRD, сгенерированный AI. Читаете: “Клиенты ценят скорость доставки”. Звучит убедительно. Но откуда это взялось? Из анализа 50 интервью? Из одного случайного комментария? Или модель просто решила, что это звучит правдоподобно?
Вы не знаете. И это фундаментальная проблема всех AI-генерированных документов.
Проблема: красивая ложь
AI-модели — гениальные рассказчики. Они генерируют связный текст, который выглядит как результат глубокого анализа. Проблема в том, что модель не отличает выводы из данных от правдоподобных предположений. Для LLM “клиенты ценят скорость” и “клиенты ценят возможность отслеживать заказ” — одинаково вероятные продолжения текста.
В продуктовом исследовании это катастрофа. PRD, построенный на галлюцинациях, приводит к тому, что команда три месяца строит фичу, которую никто не просил. Карта конкурентов с выдуманными преимуществами — к неправильному позиционированию. Unit economics с “примерными” цифрами — к сожжённому бюджету.
Решение не в том, чтобы запретить AI генерировать документы. Решение — сделать каждое утверждение прослеживаемым.
Архитектура: четыре слоя до источника
В AICPO я построил четырёхслойный Knowledge Graph (KG2), где каждый факт в артефакте прослеживается до конкретных слов конкретного пользователя.
Слой 1: Episodes (сырые данные). Каждое сообщение в чате, каждый загруженный файл, каждый импорт из коннектора — создаёт неизменяемый эпизод. Это иммутабельный лог: что было сказано, когда, кем. Episodes нельзя отредактировать — это источник истины.
Episode #142
type: chat_message
content: "Наши курьеры жалуются, что приложение тормозит
при слабом интернете в подвалах"
source: Message #47, 15 марта 2026
valid_at: 2026-03-15T14:23:00Z
Слой 2: Nodes (извлечённые сущности). LLM-экстрактор разбирает эпизод и выделяет структурированные объекты: боли, сегменты, конкуренты, фичи, метрики. Каждый узел хранит ссылку на породивший его эпизод.
Node #891
type: pain
label: "приложение тормозит при слабом интернете"
confidence: 82
source_episodes: [142]
valid_at: 2026-03-15
Слой 3: Edges (связи). Между узлами автоматически обнаруживаются связи — тоже через LLM, но с валидацией по онтологии (18 типов допустимых связей). Связь “сегмент → боль” создаётся только если оба узла существуют и связь семантически подтверждена.
Edge #2104
source: Node #445 (segment: "курьеры")
target: Node #891 (pain: "приложение тормозит")
relation: experiences
confidence: 78
evidence: "Наши курьеры жалуются..."
Слой 4: Artifact context (сборка). Когда генерируется артефакт — например, PRD — ContextBuilder собирает из графа все релевантные узлы и связи. Каждый узел приходит с enrich_with_evidence — массивом эпизодов, на которых он основан.
Как это выглядит на практике
Пользователь общается с AI-ассистентом. За 30 сообщений он рассказывает о своём продукте: кто клиенты, какие боли, кто конкуренты, какая экономика.
Каждое сообщение проходит через пайплайн:
- Сохранение — сообщение записывается в базу
- Эпизод —
EpisodeService.create_from_factсоздаёт иммутабельный эпизод с привязкой к источнику - Экстракция —
EntityExtractorвыделяет сущности через LLM - Резолвинг —
EntityResolverпроверяет: может, эта боль уже упоминалась? Точное совпадение → fuzzy-поиск (Levenshtein) → LLM-подтверждение при неуверенности - Связи —
RelationDiscovererнаходит связи между новыми и существующими узлами - Временная метка — каждый факт помечен
valid_at, чтобы отслеживать эволюцию знаний
Теперь пользователь нажимает “Сгенерировать PRD”. Система не просто отправляет в LLM запрос “напиши PRD”. Она собирает контекст из графа:
# Для PRD собираются: боли, сегменты, джобы, фичи — с evidence
Kg2::ContextBuilder.artifact_context(project_id, "prd")
# → { nodes: [...], edges: [...], avg_confidence: 74 }
Каждый узел в контексте несёт с собой цепочку: node → episode → source message. Модель генерирует PRD, но у каждого утверждения есть основание в данных.
Что это меняет
До: “Клиенты ценят скорость.” Откуда? Неизвестно. Может, из обучающих данных модели. Может, из одного сообщения, которое она интерпретировала вольно. Может, вообще галлюцинация.
После: “Клиенты ценят скорость (pain #891, confidence: 82, источник: сообщение #47 от 15 марта — ‘приложение тормозит при слабом интернете’; подтверждено в сообщениях #63, #71).”
Разница — как между слухами и судебным протоколом.
Три механизма защиты от галлюцинаций
Confidence scoring. Каждый узел имеет оценку уверенности 0-100. Факт, упомянутый один раз → 60-70. Подтверждённый из нескольких источников → 80-90. При генерации артефакта модель видит confidence и может взвешивать утверждения. Факт с confidence 45 не попадёт в PRD как безусловное утверждение.
Temporal tracking. Узлы имеют valid_at и invalid_at. Если в марте пользователь сказал “наш рынок — B2B”, а в апреле — “мы решили пивотнуть на B2C”, система не смешивает оба факта. TemporalManager помечает старый факт как недействительный, сохраняя историю. Артефакт генерируется на основе актуальных данных.
Contradiction detection. Если два узла противоречат друг другу (например, “цена — главный фактор” и “цена не важна, важно качество”), система обнаруживает конфликт и инжектирует его в промпт чата: “Обнаружено противоречие, уточните у пользователя”. Противоречие не замалчивается — оно становится вопросом.
Gap analysis: чего не хватает
Evidence trail работает и в обратную сторону. Если в графе есть сегмент, но нет связанных болей — это пробел. Если есть боли, но нет данных о конкурентных решениях — ещё один пробел.
ContextBuilder обнаруживает такие дыры и инжектирует их в системный промпт:
RESEARCH GAPS (ask the user about these):
- Segment "курьеры" has no linked triggers (what causes them to seek a solution?)
- Pain "тормозит при слабом интернете" has no competitive alternatives
AI-ассистент видит пробелы и задаёт уточняющие вопросы. Не потому что так запрограммирован, а потому что видит дыры в графе знаний.
Организационная память
Для корпоративных команд evidence trail решает ещё одну проблему: потерю контекста. Когда PM уходит в отпуск или увольняется, знания уходят с ним. Confluence-страницы устаревают. Slack-переписки тонут в потоке.
Knowledge Graph с evidence trail — это организационная память, которая не деградирует. Каждое решение прослеживается до данных. Новый PM открывает проект и видит не просто артефакты, а полную цепочку: вот что мы знаем → вот откуда мы это знаем → вот когда это было сказано → вот насколько мы в этом уверены.
При достижении двух и более проектов с пересекающимися сущностями система автоматически продвигает общие узлы на уровень организации (PromotionService). Инсайт из проекта A становится доступен проекту B — со всей цепочкой доказательств.
Итог: документы, которым можно верить
Evidence-traced artifacts — это не фича, а архитектурный принцип. Четыре слоя (episodes → nodes → edges → artifact context) создают непрерывную цепочку от утверждения в документе до слов пользователя.
AI по-прежнему генерирует текст. Но теперь у каждого предложения есть основание, которое можно проверить. Это разница между AI, который помогает принимать решения, и AI, который создаёт иллюзию информированности.
“Клиенты ценят скорость” — из сообщения #47 от 15 марта.
Хотите увидеть evidence trail в действии — попробуйте AICPO или напишите nevr@aicpo.com