Содержание ↓
Исследования, которые никто не перечитывает
В большой компании исследований много: сегментации, глубинные интервью, опросы, отчёты агентств. Живут они в презентациях по чьим-то папкам. Когда для брифа нужна цифра, маркетолог пишет коллеге, который «вроде видел такой слайд». Коллега в отпуске — цифру берут по памяти или не берут вовсе.
Задача, которую я ставил себе: положить исследования туда, где их находит и человек, и модель, а ответ приходит со ссылкой вида «такое-то исследование, слайд 14». Отдельно — чтобы бриф кампании опирался на те же документы, что читает команда.
Как устроено: два контура
В кабинете две базы. Первая кормит бриф кампании, вторую читают люди и ассистент.
База документов для кампаний
Сюда попадают материалы по категориям: исследования аудитории, рынок и конкуренты, редакторская политика, брендбук, правила для писем и пушей. Текст извлекается из файла, из него вычищаются персональные данные, дальше он режется на фрагменты около 1 800 знаков с нахлёстом в 220. Разрез ищет конец абзаца или предложения, чтобы мысль не обрывалась на середине.
Поиск берёт до восьми фрагментов с порогом сходства 0,72. Если сильных совпадений меньше трёх, он добирает полнотекстовым поиском: на названиях и цифрах это спасает. Для каждого документа модель один раз пишет конспект, и на этих конспектах стоит бриф в разделе кампаний.
Библиотека исследований
Второй контур я строил под вопросы команды. Файл превращается в канонический Markdown, человек его проверяет, и только потом документ уходит в поиск. Статусы видны в интерфейсе по шагам: извлечение текста, выжимка, готово к проверке, индексация, готово.
Сверху документа модель пишет выжимку из шести обязательных разделов, среди них резюме, методология, сегменты, барьеры и живые цитаты клиентов. Числа — дословно, только из текста. Под выжимкой стоит полный текст источника, тоже дословно. Документ режется по заголовкам второго уровня, и у презентации один слайд становится одним фрагментом.
Поиск гибридный. Векторный ранг и полнотекстовый ранг по-русски сводятся формулой RRF с константой 50 прямо в базе, по умолчанию ассистент получает 8 лучших слайдов. Когда в вопросе термин или цифра, выручает полнотекстовый. Если человек спросил своими словами, находит векторный.
Загружать и читать библиотеку может вся команда. Удаление документа и пересборка выжимки остались за администратором, потому что промах тут бьёт по общей базе ассистента.
Ассистент
Кнопка ассистента есть на страницах кампаний, медиакалендаря, радара рынка и проектов, на главной — полноэкранный чат. Работает он на gpt-4.1-mini с температурой 0,3, в контекст уходят последние 10 сообщений и страницы проектной вики по текущему разделу. Вики читается с диска на каждый запрос, поэтому ассистент знает о разделе то же, что написано в документации сегодня.
Инструментов шесть. Половина только читает: открывает страницу вики, ищет по исследованиям, дочитывает соседние слайды к найденному. Остальные предлагают действие — создать кампанию, сменить статус, дописать вики — и без подтверждения ничего не делают. За один вопрос ассистент может сходить в поиск до трёх раз подряд: исследования часто требуют переформулировать запрос или дочитать слайд до и после. Последний вызов идёт без инструментов, и текстовый ответ приходит всегда.
Представим (пример условный, не из практики): маркетолог сети клиник спрашивает ассистента, почему пациенты не возвращаются на повторный приём. Первый поиск находит слайд с барьерами, второй дочитывает соседний слайд с цитатами, а в ответе стоят название исследования и номер слайда.
Что держит код
У модели здесь немного дел: выжимка, поисковый запрос и текст ответа. Всё, что под ними, написано кодом.
- Разбор PPTX — свой, на zip и XML, без распознавания картинок. Порядок слайдов берётся из списка презентации: по именам файлов
slide10встал бы раньшеslide2. Из диаграмм достаются сами ряды данных, потому что в исследовательских презентациях большая часть чисел живёт в графиках. Тестовая презентация на 300 слайдов, где группы вложены друг в друга на 40 уровней, разбирается за доли секунды. - Персональные данные вычищаются до выжимки и до хранения.
- Идентификатор документа строится из названия детерминированно. Повторная загрузка обновляет старые фрагменты, дубли не появляются.
- Индексация, пересборка выжимки и удаление одного документа не идут одновременно: каждая операция сначала занимает документ сменой статуса.
- Права проверяются внутри серверного действия. Серверное действие — открытый адрес, спрятанной кнопки для защиты мало.
Что получает маркетолог
Главное — библиотека исследований. Каждый документ в ней читается целиком, с оглавлением, и скачивается в Markdown, а бейдж рядом показывает, сколько фрагментов документа лежит в базе ассистента. На вопрос «что мешает сегменту X» ассистент отвечает ссылкой на исследование и слайд. И бриф кампании собирается на тех же документах, что читает команда.
Грабли
Выжимка вместо документа. Первая версия хранила только конспект. Он сжимал исследование примерно до шестой части объёма, и длинный PDF-отчёт превращался в 9 фрагментов. В поиск не доходили ни цифры, ни сегменты, ни цитаты. Выжимка к тому же утверждала, что методология в исследовании не описана. Она там была. После того как под выжимку встал дословный текст, тот же отчёт дал 41 фрагмент.
Текст без заголовков. Нарезка идёт по заголовкам второго уровня, и плоский текст без них выпал бы из индекса целиком. Для таких источников код сам расставляет блоки «Фрагмент N».
Сироты в поиске. Удаление искало фрагменты по фиксированной метке происхождения. Документы, загруженные пакетом, оставляли в поиске фрагменты-сироты, а переиндексация плодила дубли. Помогло поле происхождения у самого документа.
Три списка форматов. Список допустимых файлов жил в трёх местах: в проверке на сервере, в фильтре формы и в подписи для человека. PPTX добавили, две подписи забыли, и страница уверяла, что презентации не поддерживаются, пока загрузка уже работала. Теперь список один.
Вики отстала от кода. Этот текст я писал по собственной вики проекта и сверял с кодом. Вики обещала фрагменты по 500 знаков и старую модель эмбеддингов, в коде оказались 1 800 знаков и text-embedding-3-small. Про модель эмбеддингов это расхождение однажды уже породило ложное техзадание.
Анонимайзер ловит не всё, поэтому перед индексацией Markdown просматривает человек.
С чего начать
Я бы взял десяток исследований, о которых команда спрашивает чаще всего, и сразу положил под выжимку дословный текст: без него поиск не увидит ни цифр, ни цитат. Из техники хватит Postgres с pgvector, одной модели эмбеддингов, разбора PDF и PPTX и промпта выжимки с фиксированными разделами.
Если не уверены, какие документы вашей команды класть первыми, это хороший вопрос для консультации. Как ассистент входит в ежедневную работу отдела, описано в разделе про внедрение ИИ в маркетинг.
- Next.js
- Supabase
- pgvector
- OpenAI text-embedding-3-small
- gpt-4.1-mini
