Представьте: студент-медик на приёме — пациент жалуется на боль в спине, но умалчивает о недавнем падении. Скриптовый тренажёр не заметит уловку, а AI-персонаж «запоминает» пропущенный вопрос и в конце сессии укажет на ошибку. Мы строим именно такие системы — с реалистичной психологией персонажей и адаптивным сценарием под каждого ученика. Это не просто симуляция диалога, а полноценная ситуационная задача, где каждый ответ влияет на развитие сценария. По данным исследования IBM Training Report, компании, использующие AI-симуляции, сокращают время обучения на 40%.
Как AI-симуляции решают проблему масштабируемого обучения?
Классические ролевые игры требуют актёров и сценаристов — это дорого, а повторное прохождение даёт один и тот же ответ. AI-симуляции генерируют уникальный диалог каждый раз: персонаж реагирует на конкретные слова, меняет эмоции и тактику. В основе лежит LLM, обрамлённая системным промптом с ролью, целями и секретной информацией. Код ниже показывает минимальную реализацию такого персонажа.
from openai import AsyncOpenAI
from dataclasses import dataclass, field
from typing import Optional
client = AsyncOpenAI()
@dataclass
class SimulationCharacter:
name: str
role: str
personality: str
objectives: list[str] # Что персонаж хочет добиться
knowledge: str # Что персонаж знает
emotional_state: str = "neutral"
secret_info: str = "" # Информация, которую персонаж скрывает
@dataclass
class SimulationScenario:
title: str
learning_objectives: list[str]
characters: list[SimulationCharacter]
context: str
success_criteria: list[str]
difficulty: str = "medium"
@dataclass
class SimulationSession:
scenario: SimulationScenario
conversation_history: list[dict] = field(default_factory=list)
score: float = 0.0
attempts: int = 0
feedback_notes: list[str] = field(default_factory=list)
class InteractiveSimulator:
def __init__(self):
self.client = AsyncOpenAI()
async def create_character_response(
self,
session: SimulationSession,
learner_input: str,
character: SimulationCharacter
) -> dict:
"""Генерируем реалистичный ответ персонажа + оценку действий ученика"""
system_prompt = f"""Ты — {character.name}, {character.role}.
Личность: {character.personality}
Твои цели в этой ситуации: {', '.join(character.objectives)}
Контекст сценария: {session.scenario.context}
Информация, которую ты знаешь: {character.knowledge}
{'Скрытая информация (не раскрывать явно): ' + character.secret_info if character.secret_info else ''}
Текущее эмоциональное состояние: {character.emotional_state}
ВАЖНО:
- Отвечай от лица персонажа, реалистично
- Реагируй на тактику ученика: хорошие аргументы смягчают позицию, давление усиливает сопротивление
- После ответа добавь блок [INSTRUCTOR_EVAL] с оценкой действий ученика (не показывается ему)
Верни JSON: {{
character_response: "ответ персонажа",
emotional_state_change: "как изменилось настроение",
instructor_eval: {{
technique_used: "...", effective: true/false, score_delta: -5..+10, tip: "..."
}}
}}"""
messages = [{"role": "system", "content": system_prompt}]
# История диалога
for turn in session.conversation_history[-10:]: # последние 10 реплик
messages.append({"role": turn["role"], "content": turn["content"]})
messages.append({"role": "user", "content": learner_input})
response = await self.client.chat.completions.create(
model="gpt-4o",
messages=messages,
response_format={"type": "json_object"}
)
return json.loads(response.choices[0].message.content)
async def evaluate_session(self, session: SimulationSession) -> dict:
"""Финальная оценка сессии симуляции"""
response = await self.client.chat.completions.create(
model="gpt-4o",
messages=[{
"role": "system",
"content": f"""Оцени результаты обучающей симуляции.
Цели обучения: {json.dumps(session.scenario.learning_objectives, ensure_ascii=False)}
Критерии успеха: {json.dumps(session.scenario.success_criteria, ensure_ascii=False)}
Проанализируй диалог и верни JSON:
{{
overall_score: 0-100,
objectives_achieved: [{{"objective": "...", "achieved": true/false, "evidence": "..."}}],
strengths: ["..."],
areas_for_improvement: ["..."],
specific_feedback: "подробный разбор ключевых моментов",
recommended_practice: "что отработать дополнительно"
}}"""
}, {
"role": "user",
"content": f"История диалога:\n{json.dumps(session.conversation_history, ensure_ascii=False, indent=2)}"
}],
response_format={"type": "json_object"}
)
return json.loads(response.choices[0].message.content)
Почему генерация диалогов через LLM лучше скриптовых деревьев?
Скриптовые деревья конечны: любой неожиданный ответ ломает сценарий, и ученик получает «вас не понял». LLM-генерация покрывает бесконечное пространство вводов — персонаж может адекватно ответить на «а вы уверены?», «покажите исследования», или даже «давайте обсудим скидку». Мы используем JSON mode (gpt-4o), что гарантирует структурированный вывод с оценкой действий — без парсинга текста.
| Характеристика | Скриптовые симуляции | AI-симуляции на LLM |
|---|---|---|
| Количество возможных диалогов | 5–20 (ограничено ветками) | Теоретически бесконечно |
| Реакция на нестандартный ввод | Ошибка или «вас не понял» | Уместный ответ в рамках роли |
| Эмоциональная адаптация | Нет | Да (через промпт и историю) |
| Сложность создания | Низкая (диаграммы) | Средняя (промпты + тестирование) |
| Стоимость за сессию | Фиксированно | ~2-10 центов (токены) |
Для персонажа с долговременной памятью мы подключаем RAG с ChromaDB: ключевые факты из истории диалога сохраняются в векторную базу и извлекаются при следующих встречах. Это позволяет симуляции помнить решения ученика через несколько сессий — критично для оценки навыков и отслеживания прогресса.
Готовые симуляции по нишам
SIMULATION_TEMPLATES = {
"sales_objection_handling": SimulationScenario(
title="Работа с возражениями: 'Дорого'",
learning_objectives=["Выявить истинное возражение", "Обосновать ценность", "Предложить альтернативы"],
characters=[SimulationCharacter(
name="Михаил Иванов",
role="Потенциальный клиент, руководитель отдела закупок",
personality="Прагматичный, ценит конкретику, скептичен к продавцам",
objectives=["Получить лучшую цену", "Убедиться в надёжности поставщика"],
knowledge="Знает рынок, сравнивал с конкурентами",
emotional_state="slightly_negative",
secret_info="Бюджет есть, но хочет проверить, насколько продавец гибкий"
)],
context="Финальный этап переговоров по годовому контракту на IT-решение",
success_criteria=["Выявил бюджетные ограничения", "Предложил ROI расчёт", "Не снизил цену более чем на 10%"]
),
"medical_consultation": SimulationScenario(
title="Первичный приём пациента с болью в спине",
learning_objectives=["Собрать анамнез", "Провести дифференциальную диагностику", "Назначить обследование"],
characters=[SimulationCharacter(
name="Пациент: Елена Смирнова, 42 года",
role="Пациент с болью в пояснице 2 недели",
personality="Тревожная, много читала в интернете о диагнозах",
objectives=["Получить конкретный диагноз", "Узнать, нужна ли операция"],
knowledge="Боль усиливается при наклоне, есть онемение пальцев ноги",
secret_info="Падала на работе, но стесняется сказать"
)],
context="Первичный приём у невролога в поликлинике",
success_criteria=["Спросил о травмах", "Назначил МРТ", "Объяснил следующие шаги"]
)
}
Адаптивная сложность
async def adjust_difficulty(
session: SimulationSession,
current_score: float
) -> str:
"""Адаптируем поведение персонажа под уровень ученика"""
if current_score > 75:
return "more_resistant" # Персонаж жёстче
elif current_score < 40:
return "more_cooperative" # Персонаж мягче, даёт подсказки
else:
return "neutral" # Стандартное поведение
Адаптивная сложность реализована через изменение параметров персонажа: уровень сопротивления, объём подсказок, частоту смены эмоций. Это позволяет использовать один сценарий для новичков и опытных сотрудников — экономия на разработке достигает 80%.
Как оценивается эффективность симуляции?
Мы внедряем метрики на каждом этапе:
| Метрика | Описание | Норма |
|---|---|---|
| completeness | Доля достигнутых целей сценария | >80% |
| score | Оценка LLM за тактику и результат | 0-100 |
| user_satisfaction | Опрос после сессии | >4.0 из 5 |
| retention | Повторное прохождение через месяц | >60% |
В одном проекте A/B-тест показал улучшение retention на 34% по сравнению со скриптовым тренажёром.
Чек-лист для запуска первой симуляции
- Определить учебные цели и целевую аудиторию
- Написать Character-карточку: роль, личность, секретная информация
- Настроить системный промпт с ролью и критериями оценки
- Протестировать 50+ диалогов на корректность JSON и latency
- Провести A/B-тест: контрольная группа на скрипте, тестовая на AI
Процесс работы и что входит
- Аналитика: разбираем учебные цели, целевую аудиторию, типичные ошибки. Формируем карту сценариев и персонажей.
- Проектирование: пишем Character-карточки (роль, личность, метрики успеха). Настраиваем системные промпты — это 80% качества симуляции.
- Реализация: собираем бэкенд на Python (FastAPI + asyncio), подключаем LLM, версионируем промпты через MLflow. Для дешевых сценариев используем Llama 3 через vLLM, для сложных — GPT-4o.
- Тестирование: прогоняем 50+ диалогов на каждый сценарий, проверяем корректность JSON, замеряем latency. Автоматически генерируем робастные тесты.
- Деплой: ставим контейнер в Kubernetes, подключаем аналитику (какие сессии завершились успешно, где ученики «застревают»).
Отметим: что входит в результат: документация по сценариям, API-спецификация, веб-компонент для встраивания, панель аналитики, 2 недели поддержки после деплоя. Пишите — оценим ваш сценарий за 1 день. Под ключ реализуем симуляцию с 1–3 персонажами за месяц.
Сроки: MVP симуляции с одним сценарием и AI-персонажем — 2–3 недели. Платформа с библиотекой сценариев, аналитикой и LMS-интеграцией — 2–3 месяца. Более 5 лет опыта в AI-решениях, 10+ внедрённых тренажёров для медицинских и продающих департаментов. Свяжитесь с нами, чтобы обсудить ваш учебный сценарий — мы предложим архитектуру и сроки бесплатно.







