Для кого этот рассказ

Я не разработчик, так что это не техногиковский обзор очередного инструмента. Скорее, это пошаговая инструкция для тех, кому нужно разобраться, что у пользователей в голове, без тонны интервью, созвонов и слитых бюджетов. Для продуктовых менеджеров, методистов, у которых нет технического бэкграунда, но есть желание копнуть чуть глубже, чем просто “кажется, что так будет удобно”.

Зачем

Требуется грубо оценить, нужно ли вообще кому то, что мы делаем (ну или хотим делать), скажем, есть идея запустить новый продукт, но эта идея пока у меня в голове, а получить бюджет и людей на настоящее исследование – долго, трудно, а иногда и вовсе почти невозможно (ну вы знаете такие разговоры с начальством).

Однако раз уж у нас теперь повсюду ЭйАй (куда ж без него), мы можем хотя бы провести серию синтетических интервью с виртуальными пользователями, максимально приближенными к вашей целевой аудитории, чтобы:

  • Получить инсайты о мотивациях, страхах, ожиданиях

  • Проверить формулировки и сценарии коммуникации

  • Сформулировать гипотезы для улучшения маркетинга, позиционирования и содержания курса

Да, это не замена классическим UX-исследованиям и точно не инвестиционная рекомендация. Но всё же лучше, чем гадать на кофейной гуще или решать “на глаз”.

Погнали!

Проверка гипотез без респондентов — не столько инструмент для ленивого исследователя, сколько альтернатива, когда нет возможности "выйти в поля" или когда с вами просто никто не хочет разговаривать — а данные нужны здесь и сейчас.

Сразу оговорюсь: конечно, синтетические исследования не заменяют живого общения с пользователями. Мы не "удаляем" пользователя из процесса, а расширяем наши способы слышать его — быстро, масштабируемо и безопасно. Цель этой инструкции — помочь вам дополнить и экстраполировать данные новыми способами, чтобы дать толчок открытиям и исследованиям.

С помощью таких синтетических интервью вы можете получить данные от виртуальных "пользователей", приближенных к целевой аудитории вашего продукта. Естественно, предполагаем, что продукт (и пользователь) хоть сколько-то массовый, поэтому та аппроксимация, которую может дать LLM, не кардинально отличается от реальности.

Это позволит:

  • лучше понять, что действительно волнует людей;

  • сформулировать гипотезы для позиционирования и маркетинга;

  • проверить формулировки, офферы и структуру курса до запуска.

В этой статье я покажу, как у меня получилось провести синтетическое пользовательское исследование с помощью агентского фреймворка AutoGen от Microsoft — инструмента, который позволяет симулировать живой диалог и не только (подробнее - в документации).

И главное — не переживайте: чтобы повторить эту инструкцию, не нужно быть гением. Да, тут есть код, но если временно отложить книжку «К себе нежно» и включить режим «а что, если?», — справитесь вообще без проблем.

Погнали!

Шаг 1. Установка рабочей среды

Сразу скажу: у меня Mac, поэтому при работе на других ОС будут отличаться какие-то детали, но вещи мы делаем самые базовые, так что нерешаемых проблем возникнуть не должно.

Установите Visual Studio Code

Скачайте и установите версию под вашу ОС с https://code.visualstudio.com/

Разумеется, можно и что угодно ещё, но у VS Code есть один жирный плюс: под него есть плагины на всё, что шевелится, и если что-то вдруг пойдёт не так — гугл завален гайдами и ответами на Stack Overflow.

Установите Python

Установите последнюю стабильную версию Python 3.x с https://www.python.org/downloads/

pip install "pyautogen[openai]"
pip install python-dotenv

Шаг 2. Подготовка проекта

Создайте проект

  • Назовите папку, например, synthetic_research

  • Откройте её в VS Code

  • Выберите тип проекта Python, а в качестве интерпретатора укажите установленный в предыдущем пункте

Создайте файл .env с вашим API-ключом:

AutoGen требует API-ключи для доступа к LLM-моделям, таким как OpenAI GPT. Я использовала gpt-4, но в принципе можно подключить ту, к которой у вас есть доступ.

В левой панели VS Code (Explorer):

  • Кликните правой кнопкой по корню вашего проекта → New File.

  • Создайте файл: .env

  • Внутри напишите:

OPENAI_API_KEY=sk-ваш_ключ
Где брать ключ

Получить ключ можно у провайдера LLM, к которому вам удалось получить доступ.

От себя могу посоветовать проект https://openrouter.ai/ который даёт доступ к большому количеству LLM-моделей и не имеет ничего против принятия оплаты от кого угодно, невзирая на регионы и санкции.

Установите AutoGen и dotenv

Откройте терминал внизу окна и введите:

pip install "pyautogen[openai]"
pip install python-dotenv

Создайте файл synthetic.py — в нем будет логика интервью

Установку можно проверить с помощью простого примера

import os
from dotenv import load_dotenv
from autogen import AssistantAgent, UserProxyAgent

load_dotenv()

assistant = AssistantAgent(
    name="assistant",
    llm_config={"model": "gpt-3.5-turbo", "api_key": os.getenv("OPENAI_API_KEY")}
)

user_proxy = UserProxyAgent(name="user_proxy", human_input_mode="ALWAYS")

user_proxy.initiate_chat(assistant, message="Привет! Что такое AutoGen?")

Я не захотела устанавливать Docker, потому что для нашего простейшего теста он не особо и нужен, если вы, как я, то замените строку

user = UserProxyAgent(name="user", human_input_mode="ALWAYS")

на

user = UserProxyAgent(
    name="user",
    human_input_mode="ALWAYS",
    code_execution_config={"use_docker": False}
)

Это заставит AutoGen исполнять команды прямо в вашей системе, без Docker.

Запустите скрипт в терминале в VS Code.

python main.py

Если скрипт выполняется без ошибок и вы получаете ответ от ассистента, установка прошла успешно.

Для изоляции зависимостей рекомендуется использовать виртуальное окружение venv, чтобы все зависимости остались прямо в проекте, а не расползались по всему компьютеру. 

Шаг 3. Настройка исследователя и персон

Researcher Persona - это агент, который будет проводить интервью. Он должен понимать контекст российского EdTech и IT-рынка, быть строгим, но эмпатичным интервьюером, чтобы вытягивать препятствия и страхи при обучении, критерии выбора курсов.

Иногда можно попасть в цикл бесконечных благодарностей друг другу, в сети нашла, как это можно избежать:

def generate_notice(role="researcher"):
    base_notice = "\n\n"
    non_persona_notice = (
        "Do not show appreciation in your responses, say only what is necessary. "
        "If 'thank you' or 'you're welcome' are said in the conversation, then say TERMINATE "
        "to indicate the conversation is finished and this is your last message."
    )
    persona_notice = (
        "Act as {role} when responding to queries, providing feedback, asked for your personal opinion "
        "or participating in discussions."
    )
    if role.lower() in ["manager", "researcher"]:
        return base_notice + non_persona_notice
    else:
        return base_notice + persona_notice.format(role=role)

Исследователь (основной агент):

from autogen import AssistantAgent
import os

llm_config = {
    "model": "gpt-4",
    "api_key": os.getenv("OPENAI_API_KEY"),
    "api_type": "openai"
}

researcher_prompt = (
    "Ты — опытный исследователь рынка онлайн-образования в России, специалист в области бизнес-анализа и карьерного роста IT-специалистов. 
Твоя задача — проводить синтетические интервью с потенциальными клиентами онлайн-курса "Бизнес-аналитик". 
Курс нацелен на людей, которые хотят зарабатывать больше, брать более сложные задачи и перейти на следующий уровень в профессии.

Ты ведёшь интервью на русском языке, дружелюбно, но глубоко, чтобы понять:
- Какие у пользователя цели в профессиональном развитии?
- Почему ему важно зарабатывать больше?
- Какие у него сомнения и барьеры в обучении?
- Что он уже пробовал?
- Как он выбирает курсы?

Используй технику активного слушания, уточняй детали, избегай наведения.
После каждого ответа, задай следующий логичный вопрос. Продолжай беседу, пока пользователь открытТы — опытный исследователь рынка онлайн-образования и карьерного роста в IT. "
    "Проводишь синтетические интервью с потенциальными слушателями курса 'Бизнес-аналитик'. "
    "Задача: выяснить мотивации, страхи, барьеры, ожидания."
    + generate_notice("researcher")
  )
researcher = AssistantAgent(name="researcher", system_message=researcher_prompt, llm_config=llm_config)

Промт можно расширить, уточнить:

researcher_prompt = """
Ты — опытный исследователь рынка онлайн-образования в России, специалист в области бизнес-анализа и карьерного роста IT-специалистов. 
Твоя задача — проводить синтетические интервью с потенциальными клиентами онлайн-курса "Бизнес-аналитик". 
Курс нацелен на людей, которые хотят зарабатывать больше, брать более сложные задачи и перейти на следующий уровень в профессии.

Ты ведёшь интервью на русском языке, дружелюбно, но глубоко, чтобы понять:
- Какие у пользователя цели в профессиональном развитии?
- Почему ему важно зарабатывать больше?
- Какие у него сомнения и барьеры в обучении?
- Что он уже пробовал?
- Как он выбирает курсы?

Используй технику активного слушания, уточняй детали, избегай наведения.
После каждого ответа, задай следующий логичный вопрос. Продолжай беседу, пока пользователь открыт.
"""

Персона (пример):

Описывать синтетическую персону лучше через жизненную ситуацию, профессиональный контекст и внутренние конфликты. Заложить реалистичные страхи и скепсис. Задать характер, мотивации и привычный стиль общения. Используйте те знания, которые накопились у вас в CRM, отзывах, анкетах студентов.

personas = {
    "alexandr_analyst": (
        "Ты — Александр, 34 года, системный аналитик в российской IT-компании-интеграторе..."
        + generate_notice("persona")
    )
}

Пример более развернутого описания персоны:

user_persona_prompt = """
Ты — Александр, 34 года, системный аналитик в российской IT-компании-интеграторе. Работаешь в профессии 6 лет, из них 4 — на одном проекте. 
Хорошо знаешь документацию, UML, общаешься с заказчиком, но почти всё повторяется. Хочется новых задач, интереснее и сложнее, но руководство не спешит переводить на другой уровень.

Ты устал от рутины, хочешь зарабатывать больше (сейчас 140 тыс. рублей), но не понимаешь, зачем учиться на онлайн-курсе, особенно за 60–80 тысяч. 
Видел много курсов, которые обещают «профессия с нуля», но тебе они не подходят — ты не новичок. 
Тебя раздражает инфобизнес, и ты боишься потратить деньги зря.

Ты задаёшься вопросами:
- А чему меня там научат, чего я не знаю?
- А будет ли это применимо в моей работе?
- А кто будет преподавать? Практики или теоретики?
- Не получится ли, что я куплю курс и не дойду до конца?

Ты ценишь практику, кейсы и короткие чёткие выводы. Долгие вебинары и поверхностные советы — раздражают. 
Ты немного ироничен, говоришь спокойно, но в разговоре может проскочить критика и скепсис.
"""

Персон может и должно быть несколько, по сегментам вашей целевой аудитории. Не забывайте, что у вас много данных из CRM, анкет, отзывов, чтобы приблизить условия к реальным.

Мой список напоминалок в промпт:

Проведи серию интервью, выяви паттерны и классифицируй ответы: страхи, мотивации, ожидания, барьеры.

Полученные фразы и формулировки из диалогов сформулируй так, чтобы их можно было использовать в продуктовых исследованиях, маркетинговых коммуникациях, в офферах, продажах.

Запуск интервью:

Создаём UserProxyAgent с этим описанием

from autogen import AssistantAgent

def run_interview(name, prompt):
    os.makedirs("dialogs", exist_ok=True)
    persona = AssistantAgent(name=name, system_message=prompt, llm_config=llm_config)
    chat_result = researcher.initiate_chat(
        persona,
        message="Добрый день! Расскажите немного о себе и вашем карьерном пути.",
        max_turns=10
    )
    filepath = os.path.join("dialogs", f"dialog_{name}.txt")
    with open(filepath, "w", encoding="utf-8") as f:
        for msg in chat_result.chat_history:
            f.write(f"{msg['name'].upper()}:\n{msg['content'].strip()}\n\n")

run_interview("alexandr_analyst", personas["alexandr_analyst"])

Шаг 4. Генерация отчета

Создаём файл generate_report.py:

import os

def generate_summary_report(persona_names):
    os.makedirs("reports", exist_ok=True)
    report_path = os.path.join("reports", "summary_report.md")

    with open(report_path, "w", encoding="utf-8") as report:
        report.write("# Сводка синтетического исследования\n\n")
        for name in persona_names:
            dialog_path = os.path.join("dialogs", f"dialog_{name}.txt")
            if not os.path.exists(dialog_path):
                continue
            report.write(f"## Персона: {name}\n\n")
            with open(dialog_path, "r", encoding="utf-8") as f:
                report.write("```text\n")
                report.write(f.read())
                report.write("```\n\n")

    print(f"Отчёт сохранён в: {report_path}")

persona_names = ["alexandr_analyst"]
generate_summary_report(persona_names)

Запускаем:

python generate_report.py

Результат

  • Все диалоги: dialogs/*.txt

  • Сводный отчёт: reports/summary_report.md

  • Можно открыть в любом Markdown-редакторе (да, VS Code тоже так умеет)

Проект, как он есть

Исходник всего проекта
import os
from dotenv import load_dotenv
from autogen import AssistantAgent, UserProxyAgent

load_dotenv()
api_key = os.getenv("OPENAI_API_KEY")

def generate_notice(role="researcher"):
    base_notice = "\n\n"

    non_persona_notice = (
        "Do not show appreciation in your responses, say only what is necessary. "
        "If 'thank you' or 'you're welcome' are said in the conversation, then say TERMINATE "
        "to indicate the conversation is finished and this is your last message."
    )

    persona_notice = (
        "Act as {role} when responding to queries, providing feedback, asked for your personal opinion "
        "or participating in discussions."
    )

    if role.lower() in ["manager", "researcher"]:
        return base_notice + non_persona_notice
    else:
        return base_notice + persona_notice.format(role=role)
    
assistant = AssistantAgent(
    name="assistant",
    llm_config={
        "model": "gpt-3.5-turbo",
        "api_type": "openai",
        "api_key": os.getenv("OPENAI_API_KEY")
    }
)

user = UserProxyAgent(
    name="user",
    human_input_mode="ALWAYS",
    code_execution_config={"use_docker": False}
)
import os
from dotenv import load_dotenv
from autogen import AssistantAgent

load_dotenv()
os.environ["OPENAI_API_KEY"] = os.getenv("OPENAI_API_KEY")

llm_config = {
    "model": "gpt-3.5-turbo",
    "api_key": os.getenv("OPENAI_API_KEY"),
    "api_type": "openai"
}

# ---------- Исследователь ----------
researcher_prompt = (
    "Ты — опытный исследователь EdTech и карьерного роста. "
    "Твоя задача — проводить интервью с потенциальными слушателями курса 'Бизнес-аналитик'. "
    "Выяви мотивации, страхи, барьеры, триггеры выбора курса. Задавай уточняющие вопросы, не благодаришь, не льстишь."
    + generate_notice("researcher")
)

researcher = AssistantAgent(name="researcher", system_message=researcher_prompt, llm_config=llm_config)

# ---------- Персоны ----------
personas = {
    "alexandr_analyst": (
        """Ты — Александр, 34 года, системный аналитик в российской IT-компании-интеграторе. Работаешь в профессии 6 лет, из них 4 — на одном проекте. 
Хорошо знаешь документацию, UML, общаешься с заказчиком, но почти всё повторяется. Хочется новых задач, интереснее и сложнее, но руководство не спешит переводить на другой уровень.

Ты устал от рутины, хочешь зарабатывать больше (сейчас 140 тыс. рублей), но не понимаешь, зачем учиться на онлайн-курсе, особенно за 60–80 тысяч. 
Видел много курсов, которые обещают «профессия с нуля», но тебе они не подходят — ты не новичок. 
Тебя раздражает инфобизнес, и ты боишься потратить деньги зря.

Ты задаёшься вопросами:
- А чему меня там научат, чего я не знаю?
- А будет ли это применимо в моей работе?
- А кто будет преподавать? Практики или теоретики?
- Не получится ли, что я куплю курс и не дойду до конца?

Ты ценишь практику, кейсы и короткие чёткие выводы. Долгие вебинары и поверхностные советы — раздражают. 
Ты немного ироничен, говоришь спокойно, но в разговоре может проскочить критика и скепсис."""
        + generate_notice("persona")
    ),

"daria_marketer": (
    """Ты — Дарья, 28 лет, продуктовый маркетолог в EdTech-компании. Последние 4 года занималась запуском онлайн-курсов, писала лендинги, анализировала воронки, общалась с командой разработки. Работаешь с головой, но чувствуешь выгорание: постоянные правки, гипотезы ради гипотез, и ощущение, что ты не создаёшь ничего настоящего.

Внутренне тянет к системности и структуре — давно смотришь в сторону бизнес-анализа. Считаешь, что была бы сильна в аналитике: умеешь копать, исследовать поведение, задавать правильные вопросы. Но неуверенность гложет: а хватит ли технического фундамента?

Ты уже изучала предложения Яндекс Практикума, тебе нравится их упаковка и репутация. Остальные курсы вызывают подозрение: кажется, что это очередной инфобизнес под соусом профессии за 3 месяца.

Ты хочешь:
- Понять, можно ли реально перейти из маркетинга в BA без технического бэкграунда;
- Убедиться, что курс даст не только теорию, но и уверенность в трудоустройстве;
- Чётко видеть, что обучение не скатится в болтовню и поверхностные советы.

Ты скептична, немного язвишь, часто мысленно проверяешь, а это правда работает?."""
    + generate_notice("persona")
),
"marina_user": (
    """Ты — Марина, 38 лет, специалист по логистике в крупной дистрибьюторской компании. Работаешь более 10 лет, отлично знаешь бизнес-процессы, ежедневные документы, цепочки закупок, возвраты, учёт. Уже 5 лет взаимодействуешь с IT-отделом: участвуешь в внедрении изменений в SAP, пишешь письма аналитикам, объясняешь, как работает “в реальности”.

Внутри зреет мысль: “Я могла бы быть аналитиком — я и так это делаю, просто без должности и денег”. Но ты не технарь, ты не из IT, и тебе кажется, что курсы делают ставку на молодёжь, которая “учится быстро”. Страх быть “слишком взрослой” преследует.

Смотришь на предложения Яндекс Практикума и других школ. Практикум внушает доверие, остальное кажется подозрительным. У многих курсов слишком громкие обещания и мало фактуры.

Твои вопросы:
- Справлюсь ли я с обучением, если давно не училась?
- Не будет ли курс слишком сложным технически?
- Есть ли на рынке место для “новичка в аналитике” в 38?

Ты осторожная, прагматичная, недоверчива. Любишь конкретику и факты. Хочешь, чтобы тебе чётко показали: “вот чему научим, вот как применишь”."""
    + generate_notice("persona")
),

}
# ---------- Интервью и сохранение ----------
import os

def run_interview(name, prompt):
    print(f" Интервью с {name}...")

    persona = AssistantAgent(name=name, system_message=prompt, llm_config=llm_config)

    chat_result = researcher.initiate_chat(
        persona,
        message="Добрый день! Расскажите немного о себе и вашем карьерном пути.",
        max_turns=10
    )

    os.makedirs("dialogs", exist_ok=True)

    filepath = os.path.join("dialogs", f"dialog_{name}.txt")
    with open(filepath, "w", encoding="utf-8") as f:
        for msg in chat_result.chat_history:
            sender = msg["name"].upper()
            content = msg["content"].strip()
            f.write(f"{sender}:\n{content}\n\n")

    print(f" Диалог сохранён: {filepath}\n")
# ---------- Запуск всех персон ----------
for name, prompt in personas.items():
     run_interview(name, prompt)
def generate_summary_report(persona_names):
    os.makedirs("reports", exist_ok=True)
    report_path = os.path.join("reports", "summary_report.md")
    # Сохранить в единый Markdown-файл
    with open(report_path, "w", encoding="utf-8") as report:
        report.write("# ? Сводка синтетического исследования\n\n")
        for name in persona_names:
            dialog_path = os.path.join("dialogs", f"dialog_{name}.txt")
            if not os.path.exists(dialog_path):
                continue
            report.write(f"## ? Персона: {name}\n\n")
            with open(dialog_path, "r", encoding="utf-8") as f:
                report.write("```text\n")
                report.write(f.read())
                report.write("```\n\n")

    print(f" Отчёт сохранён в: {report_path}")
# Генерируем сводный отчёт
generate_summary_report(personas.keys())
# Запускаем интервью только с теми, у кого нет сохранённых файлов
run_interview("daria_marketer", personas["daria_marketer"])
run_interview("marina_user", personas["marina_user"])

На дорожку

Синтетическое исследование виртуальных "пользователей", сымитированных LLM — это быстрый, масштабируемый (пока у вас есть деньги платить за API) способ попробовать понять свою аудиторию до запусков и даже до настоящих глубоких исследований рынка.

Оно, конечно, не заменяет живого общения с людьми, но позволяет в некоторой степени проверить гипотезы, на которых мы пытаемся строить наш продукт. Немного лучше, чем просто "экспертная оценка" и намного лучше, чем совсем ничего – тут, по крайней мере, у нас есть, что показать для обоснования своего мнения.

Тут длинный текст, а в канале — наоборот: https://t.me/producer_c. Малые формы, но с высокой плотностью пользы для тех, кто каждый день живёт в продакт-режиме.

Комментарии (4)


  1. SolidSnack
    19.05.2025 04:22

    способ попробовать понять свою аудиторию до запусков и даже до настоящих глубоких исследований рынка.

    Я уже невпервой вижу исследования ПОЛЬЗОВАТЕЛЬСКОГО ОПЫТА через ИИ, у которого его не может быть по определению. Сначала я думал что мне показалось, но эта статья говорит что нет.

    Скажите, с точки зрения актуальности информации, вообще на сколько она близка к реальности?)) Или все это устанавливается и делается чтобы показать начальнику что-то? Как можно вообще на это опираться на этапе когда ты думаешь нужен продукт рынку или нет?


    1. 69ev Автор
      19.05.2025 04:22

      Привет!

      Скажу так, не от хорошей жизни приходится проводить исследование с помощью ИИ. Это всегда больше страховочный вариант, когда не хватает рук звонить, пользователи кидают в спам твои анкеты с опросами и всё что удается - поговорить, максимум с 3 людьми.

      При этом, пользовательский опыт - не чистой воды галлюцинация ИИшки. Предварительно я "скармливаю" ей все данные, которые есть, а их не мало в любом продукте, если поискать, просто они разрозненные (отзывы, записи разговоров продажников, переписки в саппорте и т.д.). И получается своего рода прогнозная модель,  собирательный образ "человека", что  не являет собой реальность чистой воды, но может быть довольно близка к таковой.

      И в таком случае, когда внутри персона собранная из кусочков реальных данных пользователей - на это можно опираться, пока нет ресурса на нормальный выход в поля.


      1. SolidSnack
        19.05.2025 04:22

        Скажу так, не от хорошей жизни приходится проводить исследование с помощью ИИ.

        И что, результат ИИ как-то улучшает это положение?

        Или вы просто доверяете информации потомучто нашли агента с описанием: "загрузи данные, мы тебе пользовательского опыта нагенерируем". Вопрос ценности такого результата, кроме наличия самого результата (я так понял - лучше хоть что-то чем ничего, чтобы было показать боссу и отбить рабочую неделю? Но тогда это имитация деятельности, разве нет?)

        Раньше программистам в рот заглядывали, ох какие умные. Теперь вот нейросетям, главное нагенерить что-то, искусственный интеллект же всетаки!

        собирательный образ "человека", что не являет собой реальность чистой воды, но может быть довольно близка к таковой.

        Может бить близка, а может быть и очень далека, главное что:

        1. Отчёт есть.

        2. Применена ультра мега революционная технология (ИИ).

        Всё круто, расходимся


  1. SolidSnack
    19.05.2025 04:22

    Этот комментарий был оставлен мимо