В современном цифровом ландшафте с гиперсвязью становится все труднее поддерживать здоровые отношения с технологиями. Постоянные уведомления, бесконечные потоки контента и вызывающие привыкание шаблоны дизайна могут привести к цифровой усталости, снижению производительности и даже проблемам с психическим здоровьем.
Для решения этих проблем команда разработчиков Clarity Pro разработала инновационное расширение для браузера, которое использует принципы поведенческой психологии для конструктивного устранения вредных цифровых шаблонов. Вместо того чтобы прибегать к агрессивным блокировкам или ограничительным временным рамкам, Clarity Pro предлагает мягкие, учитывающие контекст вмешательства, которые постепенно направляют пользователей к более осознанным цифровым привычкам.
В этом техническом обзоре мы рассмотрим архитектуру, алгоритмы и детали реализации интеллектуального механизма прерывания работы Clarity Pro. Мы обсудим проблемы, с которыми столкнулась команда, разработанные ими решения и лучшие практики, которым они следовали для создания надежного, масштабируемого и удобного в использовании инструмента для обеспечения цифрового благополучия.
По своей сути Clarity Pro состоит из трех основных компонентов:
Браузерное расширение Clarity Pro создано с использованием TypeScript и React и использует API WebExtensions для обеспечения кроссбраузерной совместимости. Расширение состоит из нескольких ключевых модулей:
Модуль ActivityTracker отвечает за сбор данных об активности пользователя, таких как:
Вот упрощенная версия логики отслеживания активности:
class ActivityTracker { private ACTIVITY_THRESHOLD, доступный только для чтения = 5_000; //5 секунд приватная активность на вкладках: Карта<номер, активность на вкладках> = новая карта(); конструктор() { browser.tabs.OnActivated.addListener(этот.handleTabActivated); browser.tabs.onUpdated.addListener(этот.handleTabUpdated); browser.idle.onStateChanged.addListener(этот.handleIdleStateChanged); } частный асинхронный обработчик активирован({ tabId }: { tabId: номер }) { const tab = ожидание browser.tabs.get(tabId); this.TabActivity.set(tabId, this.createTabActivity(tab)); } частный обработчик обновлен(tabId: номер, changeInfo: { url?: строка }, вкладка: браузер.вкладки.Tab ) { if (changeInfo.url) { this.TabActivity.set(tabId, this.create.TabActivity(tab)); } } изменен личный идентификатор состояния(newState: browser.idle.IdleState) { if (newState === ‘активный’) { this.TabActivity.forEach((activity, tabId) => { activity.idleTime = 0; this.TabActivity.set(tabId, activity); }); } } личное создание TabActivity(вкладка: browser.tabs)..Tab): TabActivity { возвращает { url: tab.url, заголовок: tab.title, время начала: Дата.сейчас(), положение прокрутки: 0, время ожидания: 0, //… другие показатели активности }; } //… методы отслеживания прокрутки, взаимодействия и времени простоя }
ActivityTracker отслеживает различные события браузера, такие как активация вкладки, изменение URL-адреса и состояние ожидания, и поддерживает отображение активности вкладок для хранения текущих данных об активности для каждой вкладки.
Модуль InterventionEngine определяет, когда и как осуществлять осознанные сбои, основываясь на текущей активности пользователя и аналитических данных, генерируемых серверными моделями ML. Он определяет расширяемый интерфейс вмешательства и предоставляет набор встроенных типов вмешательства, таких как:
Вот пример реализации интерфейса Intervention и простого дыхательного упражнения:
интерфейс Intervention { id: string; type: InterventionType; shouldTrigger: (activity: TabActivity, insights: Insights) => логическое значение; render: () => void; } класс BreathingExercise реализует интервенцию { id = ‘breathing_exercise’; type = InterventionType.Наложение; shouldTrigger(activity: TabActivity, insights: Insights): логическое значение { возвращает ( activity.idleTime > 30_000 && //30 секунд простоя.insights.stressLevel > 0,7 //высокий прогнозируемый уровень стресса ); } render() _BOS_ const overlayElement = document.createElement(‘div’); overlayElement.innerHTML = `
Сделайте глубокий вдох на 4 секунды, задержите дыхание на 4 секунды, выдохните на 6 секунд.
`; document.body.appendChild(overlayElement); //… анимационные дыхательные упражнения } }
InterventionEngine периодически проверяет активность пользователя и данные insights на соответствие каждому зарегистрированному условию запуска вмешательства. Когда запускается вмешательство, движок вызывает свой метод render, чтобы отобразить сбой для пользователя.
Модуль InsightsSync взаимодействует с внутренним API для отправки данных об активности и получения аналитических данных, сгенерированных с помощью ML. Он использует регулируемый пакетный подход для минимизации нагрузки на сеть и оптимизации производительности.
class InsightsSync { private readonly SYNC_INTERVAL = 60_000; //1 минута, размер пакета только для чтения = 100; частная очередь действий: TabActivity[] = []; конструктор(частный ActivityTracker, доступный только для чтения: ActivityTracker) { setInterval(this.syncInsights, this.SYNC_INTERVAL); } частные асинхронные syncInsights() { const batchedActivities = this.activityQueue.splice(0, это.BATCH_SIZE); if (пакетные действия.длина === 0) { return; } попробуйте { const insights = await fetch(‘/api/insights’, { метод: ‘POST’, заголовки: { ‘Content-Type’: ‘application/json’ }, тело: JSON.stringify(пакетные действия), }).тогда((res) => res.json()); //… обновите механизм вмешательства, добавив новые данные } catch (err) { console.error(‘Ошибка синхронизации данных:’, err); this.activityQueue.unshift(…batchedActivities); } } enqueueActivity(activity: TabActivity) { this.activityQueue.push(activity); } }
Модуль InsightsSync поддерживает activityQueue для хранения данных о действиях и периодически отправляет пакеты данных в серверную часть API. Серверная часть возвращает набор данных, сгенерированных с помощью ML, которые затем используются для обновления логики запуска InterventionEngine.
Серверная часть Clarity Pro построена на бессерверной, управляемой событиями архитектуре с использованием AWS Lambda, API Gateway и DynamoDB. Когда расширение браузера отправляет пакет данных об активности, оно запускает лямбда-функцию, которая обрабатывает данные и обновляет историю активности пользователя в DynamoDB.
Лямбда-функция также публикует данные об активности в потоке Amazon Kinesis, который поступает в реальный- временной конвейер ML. Конвейер, реализованный с использованием Amazon SageMaker, выполняет следующие этапы:
Затем сгенерированные аналитические данные сохраняются в DynamoDB и становятся доступными для расширения браузера через конечную точку/api/insights.
Вот упрощенный пример процесса генерации аналитических данных с использованием модели прогнозирования уровня стресса:
импорт boto3 импорт numpy как np из sklearn.linear_model импорт логической регрессии в train_stress_model(пользовательские данные): features = extract_features(пользовательские данные) labels = пользовательские данные[‘stress_level’] model = LogisticRegression() model.fit(функции, метки) возвращает model def predict_stress_level(модель, activity_data): функции = extract_features([activity_data]) stress_level = model.predict_proba(функции)[0][1] возвращает значение stress_level def lambda_handler(событие, контекст): user_id = событие[‘идентификатор пользователя’] activity_data = событие[‘данные о действиях’] dynamodb = boto3.таблица ресурсов(‘dynamodb’) = dynamodb.Таблица(‘user_activity’) ответ = таблица.запрос(KeyConditionExpression=Ключ(‘идентификатор пользователя’).eq(user_id)) user_data = ответ[‘Элементы’] stress_model = модель тренировочного стресса(пользовательские данные) stress_level = уровень прогнозируемого стресса(stress_model, activity_data) insights = { ‘user_id’: идентификатор пользователя, ‘временная метка’: activity_data[‘временная метка’], ‘stress_level’: stress_level, # … другие аналитические данные } таблица.put_item(Item=insights) возвращает аналитические данные
В этом примере функция train_stress_model обучает модель логистической регрессии на основе данных о прошлых действиях пользователя для прогнозирования стресса уровни. Функция predict_stress_level применяет обученную модель к последним данным о деятельности для получения информации об уровне стресса в режиме реального времени.
Для обеспечения того, чтобы Clarity Pro оставался неизменным производительность и масштабируемость по мере роста базы пользователей команда внедрила несколько методов оптимизации:
Вот пример того, как поэтапное обучение может быть реализовано с использованием метода частичной подгонки scikit-learn:
def update_stress_model(модель, активности_данные, уровень напряжения_): features = extract_features([activity_data]) model.partial_fit(функции, [уровень напряжения_], классы=[0, 1]) возвращает model def lambda_handler(событие, контекст): # … извлекает пользовательские данные и обучает исходную модель для activity_data в событии[‘activity_data’]: stress_level = прогноз_стресс_уровня(stress_model, activity_data) stress_model = обновление_стресс_модели(stress_model, activity_data, stress_level) # … сохраняйте обновленную модель и генерируйте аналитические данные
За счет постепенного обновления модели стресса с каждой новой точкой данных о активности конвейер ML может адаптироваться к изменяющемуся поведению пользователя в режиме реального времени без полной переподготовки.
Для поддержания высокого качества кодовой базы и раннего выявления потенциальных проблем команда Clarity Pro внедрила комплексную стратегию тестирования:
Clarity Pro представляет собой новый подход к продвижению цифрового благополучия, основанный на принципах поведенческой психологии и персонализации, основанной на ML. Расширение для браузера позволяет пользователям формировать более осознанные цифровые привычки, не прибегая к жестким блокировкам или временным ограничениям, за счет мягкого контекстуального вмешательства в нужные моменты.Техническая архитектура Clarity Pro, ориентированная на бессерверные вычисления, конвейеры ML в реальном времени и оптимизацию производительности на стороне клиента, демонстрирует лучшие практики создания масштабируемых приложений, управляемых данными. Как подчеркнули технические эксперты мероприятия, в том числе Нисарг Шах, эффективное управление памятью проекта и модульные схемы проектирования способствуют его общей надежности и ремонтопригодности.Заглядывая в будущее, команда Clarity Pro планирует расширить спектр доступных вмешательств, изучить более продвинутые методы управления персоналом для персонализации и, возможно, интегрироваться с другими инструментами и платформами цифрового благополучия. Используя ключевые компоненты кодовой базы с открытым исходным кодом и делясь своими знаниями с более широким сообществом разработчиков, они надеются вдохновить на дальнейшие инновации в области осознанных технологий.Сообщение Building Clarity Pro: продуманное расширение для браузера для цифрового благополучия впервые появилось на Nextotech.