devpilot.
До вибору прикладів

НАВЧАЛЬНИЙ ПРИКЛАД

Первинна розмітка зворотного зв’язку

Навчальна модель порівнює повідомлення з прикладами похвали, проблеми й запитання. Фрази можна змінювати та перенавчати модель; це не готова оцінка якості обслуговування.

DEMOБез вигаданих показників продажів
Полотно:

Це ширина демонстраційного полотна. Вона не замінює перевірку справжнього пристрою.

DEMO / ai-feedback

Первинна розмітка зворотного зв’язку

У потоці зворотного зв’язку потрібно помітити повідомлення про проблему й відділити його від запитання чи подяки. У демонстрації використовуються лише вигадані навчальні фрази, а не відгуки клієнтів; невеликий класифікатор показує принцип попередньої розмітки.

Відкрити робочу демонстрацію
НАВЧАЛЬНА МІНІМОДЕЛЬNAIVE BAYES

Первинна розмітка зворотного зв’язку

Первинна розмітка зворотного зв’язку
Навчальні дані

Модель навчається під час відкриття прикладу. У кожному рядку мітка й фраза або заголовок і документ розділені знаком |; після зміни даних навчіть модель знову.

Скидання відновлює початкові навчальні дані та запит.

Результат моделі

Порівняльні бали

    Бали порівнюють варіанти в межах одного запиту; це не ймовірність правильної відповіді й не виміряна точність.

    Для навчання й перевірки потрібен JavaScript; опис підходу та навчальні дані доступні без запуску.

    Переглянути робочий код моделі

    Функція навчання

    function trainTextModel(samples) {
      if (!Array.isArray(samples) || samples.length < 4 || samples.length > 30) throw new Error('CLASSIFIER_COUNT');
      const classes = new Map();
      const vocabulary = new Set();
      for (const sample of samples) {
        if (!sample || typeof sample.label !== 'string' || !sample.label.trim() ||
            typeof sample.text !== 'string' || !sample.text.trim()) throw new Error('TRAINING_FORMAT');
        const label = sample.label.trim();
        const key = label.toLowerCase();
        const tokens = tokenizeText(sample.text);
        if (!tokens.length) throw new Error('TRAINING_WORDS');
        if (!classes.has(key)) classes.set(key, {label, documents: 0, tokens: 0, counts: new Map()});
        const target = classes.get(key);
        target.documents += 1;
        for (const token of tokens) {
          vocabulary.add(token);
          target.tokens += 1;
          target.counts.set(token, (target.counts.get(token) || 0) + 1);
        }
      }
      if (classes.size < 2) throw new Error('CLASSIFIER_LABELS');
      if (Array.from(classes.values()).some(target => target.documents < 2)) throw new Error('CLASSIFIER_EXAMPLES');
      return {kind: 'classifier', classes: Array.from(classes.values()), vocabulary, documents: samples.length};
    }

    Функція перевірки запиту

    function rankText(model, text) {
      if (!model || model.kind !== 'classifier') throw new Error('NOT_TRAINED');
      if (typeof text !== 'string' || text.length > 500) throw new Error('QUERY_LIMIT');
      const tokens = tokenizeText(text);
      const known = tokens.filter(token => model.vocabulary.has(token));
      const coverage = tokens.length ? known.length / tokens.length : 0;
      if (!known.length) return {review: true, reason: tokens.length ? 'UNKNOWN_WORDS' : 'QUERY_WORDS', label: null, scores: [], known: 0, total: tokens.length, coverage, gap: 0};
    
      const counts = new Map();
      known.forEach(token => counts.set(token, (counts.get(token) || 0) + 1));
      const logs = model.classes.map(target => {
        let value = Math.log(target.documents / model.documents);
        counts.forEach((count, token) => {
          value += count * Math.log(((target.counts.get(token) || 0) + 1) / (target.tokens + model.vocabulary.size));
        });
        return {label: target.label, value};
      });
      const maximum = Math.max(...logs.map(item => item.value));
      const total = logs.reduce((sum, item) => sum + Math.exp(item.value - maximum), 0);
      const scores = logs.map(item => ({label: item.label, score: Math.exp(item.value - maximum) / total}))
        .sort((left, right) => right.score - left.score);
      const gap = scores[0].score - scores[1].score;
      const reason = tokens.some(token=>token.startsWith('neg:')&&!model.vocabulary.has(token)) ? 'NEGATION_REVIEW' : coverage < 0.2 ? 'LOW_COVERAGE' : gap < 0.12 ? 'CLOSE_SCORES' : '';
      return {review: !!reason, reason, label: reason ? null : scores[0].label, scores, known: known.length, total: tokens.length, coverage, gap};
    }

    Показано функції з цієї демонстрації. Повна реалізація також містить підготовку тексту та інтерфейс.

    Малий навчальний корпус обмежує застосовність: модель зіставляє статистику слів і не розуміє сенсу. Незнайомі та неоднозначні тексти потребують ручної оцінки.

    Невеликі статистичні моделі працюють у браузері без мережі: це не LLM, не нейромережа й не хмарний ШІ.

    Лише текст, без HTML. Зміни залишаються у вкладці.

    Завдання в цьому сценарії

    У потоці зворотного зв’язку потрібно помітити повідомлення про проблему й відділити його від запитання чи подяки. У демонстрації використовуються лише вигадані навчальні фрази, а не відгуки клієнтів; невеликий класифікатор показує принцип попередньої розмітки.

    Як побудовано рішення

    • Навчаємо модель на чотирьох фразах кожної категорії: «Похвала», «Проблема», «Запитання». Після зміни набору статистика перераховується під час повторного навчання.
    • Порівнюємо новий текст із вивченою статистикою слів і показуємо відносні бали. Модель не розуміє сенсу, іронії або всього контексту листування.
    • За недостатніх або неоднозначних ознак потрібна ручна оцінка. Остаточне рішення про пріоритет повідомлення залишається частиною погодженого робочого процесу.

    Проміжні матеріали

    1. Початкове завдання та обмеження → У потоці зворотного зв’язку потрібно помітити повідомлення про проблему й відділити його від запитання чи подяки. У демонстрації використовуються лише вигадані навчальні фрази, а не відгуки клієнтів; невеликий класифікатор показує принцип попередньої розмітки.
    2. Склад рішення → Дванадцять редагованих синтетичних повідомлень із трьома мітками.
    3. Перевірка перед запуском → Спробувати повідомлення про помилку й змішаний текст із подякою та скаргою; перевірити результат після зміни навчальних фраз.

    Що перевірити перед запуском

    • Спробувати повідомлення про помилку й змішаний текст із подякою та скаргою; перевірити результат після зміни навчальних фраз.
    • До застосування на справжніх повідомленнях перевірити помилки на відкладеному наборі та погодити, які повідомлення завжди має переглядати людина.

    Що входить у приклад

    • Дванадцять редагованих синтетичних повідомлень із трьома мітками.
    • Локальне навчання та порівняння категорій для введеного повідомлення.
    • Порівняльні бали, позначення ручної оцінки та фрагмент робочого коду.

    Технічний паспорт

    DevPilot 1.5.2 · Охоплення перевірок, вихідний код і дата свідчень

    Статус
    DEMO · Вигадана компанія й навчальні дані
    Матеріали
    Власні HTML/CSS/SVG, вихідний код і локальні алгоритми. Фотографії клієнтів не використовуються.
    Обробка
    Демонстрація виконується в браузері. Відкриття прикладу не створює заявку чи оплачений проєкт.
    Докази
    Вміст і локальні перевірки відокремлені від справжнього браузерного, хостингового та комерційного приймання.