devpilot.
К выбору примеров

УЧЕБНЫЙ ПРИМЕР

Распределение обращений по теме

Обучите небольшую модель на учебных фразах и проверьте новый запрос. Категория определяется по выученной статистике слов, а не по списку заранее заданных ответов.

DEMOБез выдуманных показателей продаж
Холст:

Это ширина демонстрационного холста. Она не заменяет проверку настоящего устройства.

DEMO / ai-routing

Распределение обращений по теме

Для обработки обращений полезно предварительно различать задачи по сайтам, рекламе и интеграциям. Демонстрация обучает небольшой статистический классификатор на двенадцати вымышленных фразах; редактируемый набор позволяет проверить, как примеры влияют на результат.

Открыть рабочую демонстрацию
ОБУЧАЕМАЯ МИНИ-МОДЕЛЬ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. Изменения остаются во вкладке.

    Задача в этом сценарии

    Для обработки обращений полезно предварительно различать задачи по сайтам, рекламе и интеграциям. Демонстрация обучает небольшой статистический классификатор на двенадцати вымышленных фразах; редактируемый набор позволяет проверить, как примеры влияют на результат.

    Как устроено решение

    • Из строк «категория | текст» собираем статистику слов по трём направлениям. Это обучаемая небольшая модель, без нейросети, LLM и облачного сервиса.
    • Для нового текста сравниваем баллы категорий на основе выученных слов. Балл помогает сравнить варианты этого запроса и не означает вероятность правильного ответа или измеренную точность.
    • Незнакомый или неоднозначный текст требует ручной оценки. Изменённые учебные фразы можно использовать для повторного обучения прямо на странице.

    Промежуточные материалы

    1. Исходная задача и ограничения → Для обработки обращений полезно предварительно различать задачи по сайтам, рекламе и интеграциям. Демонстрация обучает небольшой статистический классификатор на двенадцати вымышленных фразах; редактируемый набор позволяет проверить, как примеры влияют на результат.
    2. Состав решения → Редактируемый набор из трёх категорий и четырёх учебных фраз на каждую.
    3. Проверка перед запуском → Обучить модель, проверить новый текст, затем изменить примеры и переобучить; отдельно попробовать незнакомый и неоднозначный запрос.

    Что проверить перед запуском

    • Обучить модель, проверить новый текст, затем изменить примеры и переобучить; отдельно попробовать незнакомый и неоднозначный запрос.
    • Для рабочего процесса подготовить реальные размеченные данные, проверить модель на отложенных примерах и согласовать условия ручного решения до интеграции.

    Что входит в пример

    • Редактируемый набор из трёх категорий и четырёх учебных фраз на каждую.
    • Обучение модели в браузере и проверка нового текста со сравнительными баллами.
    • Обозначение случаев для ручной оценки и фрагмент работающего кода.

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

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

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