Разработка AI-интерактивных симуляций для обучения
AI-симуляции создают интерактивные сценарии, где обучаемый принимает решения в реалистичных ситуациях: переговоры с клиентом, медицинский приём, управление кризисом, продажи. AI-персонаж реагирует на действия ученика, создавая уникальный опыт каждый раз.
Архитектура симуляции диалога
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)
Готовые симуляции по нишам
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" # Стандартное поведение
Сроки: MVP симуляции с одним сценарием и AI-персонажем — 2–3 недели. Платформа с библиотекой сценариев, аналитикой и LMS-интеграцией — 2–3 месяца.







