Для обработки обращений полезно предварительно различать задачи по сайтам, рекламе и интеграциям. Демонстрация обучает небольшой статистический классификатор на двенадцати вымышленных фразах; редактируемый набор позволяет проверить, как примеры влияют на результат.
УЧЕБНЫЙ ПРИМЕР
Распределение обращений по теме
Обучите небольшую модель на учебных фразах и проверьте новый запрос. Категория определяется по выученной статистике слов, а не по списку заранее заданных ответов.
Это ширина демонстрационного холста. Она не заменяет проверку настоящего устройства.
DEMO / ai-routing
Распределение обращений по теме
Для обработки обращений полезно предварительно различать задачи по сайтам, рекламе и интеграциям. Демонстрация обучает небольшой статистический классификатор на двенадцати вымышленных фразах; редактируемый набор позволяет проверить, как примеры влияют на результат.
Открыть рабочую демонстрацию
Распределение обращений по теме
Посмотреть рабочий код модели
Функция обучения
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, не нейросеть и не облачный ИИ.
Редактируемый набор из трёх категорий и четырёх учебных фраз на каждую.
Обучить модель, проверить новый текст, затем изменить примеры и переобучить; отдельно попробовать незнакомый и неоднозначный запрос.
Задача в этом сценарии
Для обработки обращений полезно предварительно различать задачи по сайтам, рекламе и интеграциям. Демонстрация обучает небольшой статистический классификатор на двенадцати вымышленных фразах; редактируемый набор позволяет проверить, как примеры влияют на результат.
Как устроено решение
- Из строк «категория | текст» собираем статистику слов по трём направлениям. Это обучаемая небольшая модель, без нейросети, LLM и облачного сервиса.
- Для нового текста сравниваем баллы категорий на основе выученных слов. Балл помогает сравнить варианты этого запроса и не означает вероятность правильного ответа или измеренную точность.
- Незнакомый или неоднозначный текст требует ручной оценки. Изменённые учебные фразы можно использовать для повторного обучения прямо на странице.
Промежуточные материалы
- Исходная задача и ограничения → Для обработки обращений полезно предварительно различать задачи по сайтам, рекламе и интеграциям. Демонстрация обучает небольшой статистический классификатор на двенадцати вымышленных фразах; редактируемый набор позволяет проверить, как примеры влияют на результат.
- Состав решения → Редактируемый набор из трёх категорий и четырёх учебных фраз на каждую.
- Проверка перед запуском → Обучить модель, проверить новый текст, затем изменить примеры и переобучить; отдельно попробовать незнакомый и неоднозначный запрос.
Что проверить перед запуском
- Обучить модель, проверить новый текст, затем изменить примеры и переобучить; отдельно попробовать незнакомый и неоднозначный запрос.
- Для рабочего процесса подготовить реальные размеченные данные, проверить модель на отложенных примерах и согласовать условия ручного решения до интеграции.
Что входит в пример
- Редактируемый набор из трёх категорий и четырёх учебных фраз на каждую.
- Обучение модели в браузере и проверка нового текста со сравнительными баллами.
- Обозначение случаев для ручной оценки и фрагмент работающего кода.
Технический паспорт
DevPilot 1.5.2 · Охват проверок, исходники и дата свидетельств
- Статус
- DEMO · Вымышленная компания и учебные данные
- Материалы
- Собственные HTML/CSS/SVG, исходники и локальные алгоритмы. Фотографии клиентов не используются.
- Обработка
- Демонстрация выполняется в браузере. Открытие примера не создаёт заявку или оплаченный проект.
- Доказательства
- Содержимое и локальные проверки отделены от реальной браузерной, хостинговой и коммерческой приёмки.