Вопрос об уроке уходит из урока
Человек смотрит урок, застревает на одном слове и открывает новую вкладку. Дальше он читает чужой пересказ темы, спорит с ним про себя и возвращается в курс с версией, которой в курсе нет.
Второй путь — написать куратору. Тогда ответа нужно ждать, а куратор третий раз за неделю объясняет одно и то же одними и теми же словами.
Обычный чат-бот эту дыру только расширяет. Он охотно ответит на любой вопрос — своими словами и мимо программы. Для курса это хуже молчания: ученик уносит уверенный ответ, которого преподаватель не говорил.
Ассистент читает только материалы курса
База знаний фиксированная. В неё кладут расшифровки уроков, чек-листы и глоссарии — и ничего сверх этого. В интернет ассистент не ходит: у него нет ни поиска, ни доступа к внешним источникам.
Правила ответа заданы прямо и коротко: отвечать по материалам; если ответа в них нет — сказать об этом и отправить к куратору; ничего не додумывать. Отдельным правилом — не выдавать готовые ответы на тесты: ассистент помогает разобраться в материале, сдавать тест за ученика он не должен.
Из-за этого на четыре разных вопроса он ведёт себя четырьмя разными способами.
Кнопка в углу урока и предупреждение под полем ввода
Виджет не переделывает страницу. В правом нижнем углу появляется кнопка, по ней открывается панель чата, урок остаётся на месте и ничем не перекрыт.
Вопрос задаётся обычными словами — так же, как задали бы преподавателю. Ответ появляется постепенно, по мере того как пишется. Диалог помнит последние двенадцать реплик, поэтому «а поподробнее?» работает.
Под полем ввода стоит строка «возможны неточности, сверяйтесь с уроком». Она нужна, чтобы ученик помнил: источник — урок, а чат помогает в нём разобраться.
Платформа не запускала наш скрипт — и была права
Первая вставка не заработала. Тег в разметке урока стоял, файл виджета лежал на месте, кнопка не появлялась. Ошибок в консоли тоже не было.
Причина оказалась не в платформе и не в виджете. Содержимое блока платформа подставляет в страницу как готовую разметку — а браузер по спецификации не выполняет скрипты, вставленные таким способом. Тег в документе есть, и он мёртвый.
Обходной путь простой: попросить браузер создать скрипт самому — уже на живой странице.
<script src="…/widget.js"></script>Тег появляется в документе, но не выполняется.
<img src=x style="display:none" onerror="var s=document.createElement('script');s.src='…/widget.js';document.body.appendChild(s);this.remove()">
Картинки нет, срабатывает обработчик ошибки — он и создаёт скрипт. Обёртка убирает себя из документа.
Платформа подставляет содержимое блока как готовую разметку, а браузер такие скрипты не запускает.
Подключаем виджет обёрткой, которая создаёт тег скрипта уже на странице. В урок идёт одна строка.
Если платформа рендерит блок отдельным окном внутри страницы, виджет оказался бы заперт в этой рамке.
Виджет проверяет, где он оказался, и вешает себя на главную страницу урока — поэтому панель открывается поверх всего.
Файл виджета, отданный не по HTTPS, до урока просто не доедет: страница его заблокирует.
Виджет отдаётся по HTTPS, сертификат бесплатный и продлевается сам.
Оговорка: на аккаунте заказчика сработал штатный блок платформы, и обходной приём не понадобился — поведение зависит от типа блока и настроек аккаунта. Поэтому в запасе держим оба пути. И ещё: в конструкторе и в предпросмотре скрипты не работают вовсе, проверять можно только на реальной странице урока, открытой учеником.
Проверку устроили так, чтобы её нельзя было подогнать
Ассистента настраивают на «золотом наборе» — списке вопросов по материалам, где для каждого записан эталонный ответ. Прогон, сверка, разбор расхождений, повторный прогон. Так видно, где он отвечает неточно, до того как курс увидят ученики.
Приёмка устроена иначе. По договору ассистента принимают на двадцати вопросах — и мы предложили, чтобы эти двадцать составлял заказчик и не показывал их нам заранее. Иначе приёмка проверит нашу способность подогнать ответы.
Вопросы с эталонными ответами. Составить его может как исполнитель, так и заказчик — состав согласуется. Инструмент рабочий: он показывает слабые места, пока их ещё можно чинить.
Список готовит заказчик и держит у себя до приёмки. Так видно настоящее качество ответов, без подготовки к известным вопросам.
Прогонов пока не было: материалы тридцати уроков ещё не переданы. Пока это метод; результаты появятся после первого прогона.
Вопрос ученика стоит двадцать четыре копейки
Модель считает объём текста в токенах, а токен — это кусочек примерно в половину слова. Одно обращение — это вопрос вместе с фрагментами уроков, которые ассистент прочитывает перед ответом, и сам ответ: около 3 700 токенов.
При тарифе российской модели GigaChat — 0,065 ₽ за тысячу токенов — вопрос с ответом обходится в 24 копейки.
Это ориентировочный расчёт по опубликованным тарифам: боевой ассистент ещё не работал на живом потоке, и точного счёта пока нет. Аккаунты сервера и модели оформляются на заказчика — расходы видны ему напрямую, авансовый баланс без автопополнения не даёт неожиданных списаний.
Где ассистент останавливается
Помощник в учёбе опаснее помощника в чём угодно другом: уверенно сказанная неправда закрепится и уедет с учеником дальше. Поэтому границы устанавливаются заранее, до того как появятся жалобы.
Где мы сейчас: виджет собран и проверен вживую на двух аккаунтах GetCourse — на нашем демонстрационном и на платформе заказчика, где под это собрали отдельный урок. Проверялась именно возможность встроить ассистента: боевая база знаний ждёт материалы тридцати уроков, поэтому готовых ответов по курсу пока нет. В демонстрационной версии стоит зарубежная модель и ограничение в 30 вопросов за десять минут с одного адреса; для боевой выбрана российская.
Тот же виджет подходит для других платформ
Платформа тут — деталь. Устройство простое и повторяемое: страница, фиксированная база знаний, одна строка в разметке и правило «отвечать только по этой базе».
Меняются материалы и место, куда вставляется строка. Всё остальное остаётся тем же.
Соберём такого ассистента под ваш курс
Начинаем с одного модуля: кладём в базу его материалы и показываем ответы на ваших вопросах — расширяем только после этого. Приёмочные вопросы задаёте вы, и нам их знать не нужно.