Рабочыя працэсы вучальніка інструментаў з автазявам дадзенняў PostHog і спецыяльнымі запускамі
Разместыце функцыі PostHog для аўтовыявлення, запісу рэзультатаў, перагляду сесый і часовых шкал аб’ектаў, каб продукты для навчання з дапамогай AI маглі вярнаваць даны пра завершаныя заданні — а не толькі калькі клікаў.
Крыніцы: **Instrumenting User Behaviour on KaushalSaathi with PostHog**
KaushalSaathi — гэта платформа для адукацыі, спрамованая на вучоўцаў і сфокусаваная на тэхналогіях AI. Яна можа ствараць планы урокоў, кераваць багатапрыемным рэжымам выкладвання, складаць расклады і арганізаваць чаты для наставніцтва. Паколькі значны частка ценнасці продукту адпавядае асінхроннай генерацыі інфармацыі, а не простам перэходам між сторанкамі, стратэгія аналізу павінна спрацоўваць з завершанымі задачамі як з прыорытэтнымі сігналамі — не толькі з клікамі і змянамі маршрутаў.
Дааванне функцыяй без аналізу рэальнага выкарыстоўвання — гэта звычная пастка. Дадатковыя экраны не абавязкова значаць лепшыя рэзультаты. Перш чым дадаць новую можлівасць, каманда павінна маты доказы таго, чым вучоўцы ўжо карыстуюцца, дзе у яных выходзяць на тупік і якія элементы продукту яны ніколі не ачынаюць. Можлівасць назірання за паведаннем ператварае выбір функцыяй з прыпускаў у рашэнні, апараныя дадзеннямі пра выкарыстоўванне продукту. Самэ гэтае пытанне і было рашанае за дапамогою PostHog: як насправды вучоўцы карыстуюцца існуючым продуктом?
Аўтазахват як бесплатная базовая версія
Аўтазахват пакрывае дзейнасьць на рэвэлі DOM без неабяжных налаштаваннях — клікі, $pageview, $pageleave і межы сесій. Безусловная настройка прадаста і адносаванне відсутньага ключа API як сігналу выключэння дапамагае утрымваць локальную разработку і форкі спадчынных версій без неабяжной настройкі або вікорыстання галузей у фармаце if (enabled) ў всім кодзе:
const POSTHOG_KEY = import.meta.env.VITE_POSTHOG_KEY ?? "phc_disabled_no_key_set";
const ENABLED = POSTHOG_KEY !== "phc_disabled_no_key_set";
<PostHogProvider
apiKey={POSTHOG_KEY}
options={{
api_host: POSTHOG_HOST,
autocapture: ENABLED,
capture_pageview: ENABLED,
session_recording: { maskAllInputs: true },
loaded: (ph) => { if (!ENABLED) ph.opt_out_capturing(); },
}}
Аўтазахват адпавядае на пытанне дэ чалавек навігав. Ён не адпавядае на пытанне што ён завершыў. Адпрацоўвальнік клікаў у DOM ніколі не бачыць завершэння асінхронных заданняў — напрыклад, завершэння стварэння плану урокаў, заканчэння перыоду ў рэжыме выкладвання або успешны экспорт PDF. Ніякае з гэтых завершэнняў не стварае клікаў у DOM, якія можна было б адследаваць, таму за прыродай аўтазахват не можа іх бачыць. Самэ гэтае прасечка ёсць прычыной існавання другага шару.
Настаўнія запускі, які становяцься паметрамі
Значамыя рэзультаты выдаюцца як спецыяльныя запускі праз просты кэшэўрабер з трыма функціямі. Кожны вызов пераканальваеся ў posthog.__loaded, таму рэштка прыкладнення ніколі не пераканальваеся ў наявнасць аналітыкі і не цікавіцца тым, чы рэжым збору даных актыўны:
export function captureEvent(name: string, props?: Record<string, unknown>) {
if (!posthog.__loaded) return;
posthog.capture(name, props);
}
Две прыметы робяць гэтыя запускі корыстнымі для запітоў пазней.
Выдаваць запускі пасля успеху, а не пасля спробы. Збор даных выконваецца на асінхронным шляху успеху, а не ўнутры обрабоўчыка кнопкі, таму графікі паказваюць завершаную работу:
const plan = await generateLessonPlan(payload); // resolves only on success
captureEvent("lesson_plan_generated", {
grade: plan.grade, sector: plan.sector, language: plan.language,
});
Даўаць атрыбуты, якія стануць параметрамі разбівкі. Поле такія, як grade, language, sector і periodNumber, перавозяцца разам з запуском у момент яго выдання. У PostHog гэтыя атрыбуты стануць фільтрамі і параметрамі разбівкі без дадатковага пракэсу інструменталізацыі — адны запуск можа даць адказ на пытанні «паколення за класам», «за мовай» або «за сектором».
Ключовым адаптаром являецца identifyUser, які запускаецца адна раз з хука аўтэнтыфікаціі пасля успеху заходжання. Штояе вызов прыяўляе тымчасавы ананімны ідэнтыфікатор да автэнтыфікованага акаунта і дадзеўвае поля, якія па свойму характару адпавядаюць ролям, тое значыць, што пазнейшыя зафіксаваны даны і запісы успадкуюць тэтыя ж атрыбуты:
posthog.identify(user.id,
{ role: user.role, grade: user.grade, school: user.school });
// on logout: posthog.reset() ← must run before the redirect, or events leak to the next id
Парацэп вызоўа пад час выходу з сістэмы мае значэнне. Перэнаправлення перад вызывам reset() на спяльным прыстрое можа заставіць наступную сесію залішыцца з атрыбутамі пакананай ідэнтычнасці. Спачатку выконайце reset, а потым перэйдзіце далей.
Кожны з адбыўшыхся заходаў пасля таго даае даны для зберагання. Звычны спосаб — гэта пісьба колькасці заходаў, разлічаная па імену адпаведнай особы:
lesson_plan_generatedу всім вікні, апрантаваны па гадзіны, дае серыю часоў пра калі плюс табелю з дэтальнымі рэзультатамі, апрантаваным па рангу, пра хто. Штырый відзор адкрывае інформацыю пра актываўых корыстувачоў, бездзейныя рэгістрацыі і концентрацыю выкарыстання. Стандартны ліміт роўнаў дакладнай інфармацыі — 25; яго можна падняць да 50, калі важны дзейства, якія выкарыстоўваюцца рэдка.chat_message_sent, апрантаваны толькі за вчора і па гадзіны, пераўтарае той самы запіс, але для шчырэйшага перыоду — напрыклад, падвышанне актываўнасці апошнім часам прыблізна о 15:00, якае асоцыюецца з аднім вучытэлем.
Тая жа дэфініцыя запісу, але разны перыод часу і спосаб апрантавання. Новы запіт стае новым зберажаным відзорам, а не новым кодам прыкладнення.
Павторнае перагляданне сесіі для з’ясоўвання “чаму”
Статыстыкі адпаведзяюць на пытанні шта і як часта, а не чаму. Запіс працюе за змовчаннем, калі настаўлены параметр maskAllInputs: true, таму што вучыцелі вводзяць персональныя даны учняў і школ. Клікі, навігацыя, глыбіна прасування і затрымкі застаюць віднымі; значэння, введзеныя корыстувальнікамі, маскуюцца пад час запісу.
Случаі, калі перэгляд здаецца корыстным:
- Адгукаванне на вылівы дадзеных. Калі параметр
lesson_plan_generatedактывацыяўся, алеpdf_exported— няма для певнай групы, статыстыкі паказваюць месца выліву, а перэгляд паказвае точны крок экспорту, дзе люды зупіняюцца. - Безшумныя багі у калькуляцыях. Рэжым выкладчыка можа працаваць без проблем; корыстувальнікі проста перастаюць работаць. Перэгляд дазволяе адрозніць зламаны стан інтэрфейса ад плутаных пазначэнняў чы сляпога генеравання, якое спрычыняе тайма-аут.
Часовыя шэдулі дзеянняў кожнага корыстувальніка
Калі ідэнтыфікацыя прыўязана да захаваных дадзеных і ўспамінаў на адначыну, экран з данымі пра аблік на PostHog паказвае графік падзей для таго вучыльніка: якія здарэння выйшлі, якія функцыі ён ачыніў, якія сесіі былі захаваны. Практычныя выкарыстоўванні включаюць перакананне, што пасля справы registration_completed адбываецца першая справа lesson_plan_generated (перакананне ў правільнасці адключэння), ачыненне графіка падзей актыўнага вучыльніка перш чым праектаваць рашэнняя на адповіднасць з яго паходжанням, або рэканструюванне згаданага бага на адповіднай сесіі замест таго, каб спалагацца на памяці.
Складанне всіх слоёў
Автазбір прыносіць базавы сігнал без дадзення дапамогі. Адзінакавыя запускі і показнікі ператвараюць рэзультаты функцый на класыфікаваныя, разбітые па атрыбутах тайм-серыі. Павторны працэўканне сесій прадстаўляе прычынна-наследныя дэталі, якія стояць за паводзамі на графіках. Часовыя лініі адзіных аб’ектаў дазволяюць зменшваць масштаб ад загальнага рэзультата да конкрэтнага вучоўца. Аднаўсе гэтыя шары дастатковы, каб адначасова вырашыць, што ствараць на аднойчы зафіксаванай поведэнцы, а не на падазрах ў тым, як “павінен” выкарыстоўвацца продукт.