У потоці зворотного зв’язку потрібно помітити повідомлення про проблему й відділити його від запитання чи подяки. У демонстрації використовуються лише вигадані навчальні фрази, а не відгуки клієнтів; невеликий класифікатор показує принцип попередньої розмітки.
НАВЧАЛЬНИЙ ПРИКЛАД
Первинна розмітка зворотного зв’язку
Навчальна модель порівнює повідомлення з прикладами похвали, проблеми й запитання. Фрази можна змінювати та перенавчати модель; це не готова оцінка якості обслуговування.
Це ширина демонстраційного полотна. Вона не замінює перевірку справжнього пристрою.
DEMO / ai-feedback
Первинна розмітка зворотного зв’язку
У потоці зворотного зв’язку потрібно помітити повідомлення про проблему й відділити його від запитання чи подяки. У демонстрації використовуються лише вигадані навчальні фрази, а не відгуки клієнтів; невеликий класифікатор показує принцип попередньої розмітки.
Відкрити робочу демонстрацію
Первинна розмітка зворотного зв’язку
Переглянути робочий код моделі
Функція навчання
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, не нейромережа й не хмарний ШІ.
Дванадцять редагованих синтетичних повідомлень із трьома мітками.
Спробувати повідомлення про помилку й змішаний текст із подякою та скаргою; перевірити результат після зміни навчальних фраз.
Завдання в цьому сценарії
У потоці зворотного зв’язку потрібно помітити повідомлення про проблему й відділити його від запитання чи подяки. У демонстрації використовуються лише вигадані навчальні фрази, а не відгуки клієнтів; невеликий класифікатор показує принцип попередньої розмітки.
Як побудовано рішення
- Навчаємо модель на чотирьох фразах кожної категорії: «Похвала», «Проблема», «Запитання». Після зміни набору статистика перераховується під час повторного навчання.
- Порівнюємо новий текст із вивченою статистикою слів і показуємо відносні бали. Модель не розуміє сенсу, іронії або всього контексту листування.
- За недостатніх або неоднозначних ознак потрібна ручна оцінка. Остаточне рішення про пріоритет повідомлення залишається частиною погодженого робочого процесу.
Проміжні матеріали
- Початкове завдання та обмеження → У потоці зворотного зв’язку потрібно помітити повідомлення про проблему й відділити його від запитання чи подяки. У демонстрації використовуються лише вигадані навчальні фрази, а не відгуки клієнтів; невеликий класифікатор показує принцип попередньої розмітки.
- Склад рішення → Дванадцять редагованих синтетичних повідомлень із трьома мітками.
- Перевірка перед запуском → Спробувати повідомлення про помилку й змішаний текст із подякою та скаргою; перевірити результат після зміни навчальних фраз.
Що перевірити перед запуском
- Спробувати повідомлення про помилку й змішаний текст із подякою та скаргою; перевірити результат після зміни навчальних фраз.
- До застосування на справжніх повідомленнях перевірити помилки на відкладеному наборі та погодити, які повідомлення завжди має переглядати людина.
Що входить у приклад
- Дванадцять редагованих синтетичних повідомлень із трьома мітками.
- Локальне навчання та порівняння категорій для введеного повідомлення.
- Порівняльні бали, позначення ручної оцінки та фрагмент робочого коду.
Технічний паспорт
DevPilot 1.5.2 · Охоплення перевірок, вихідний код і дата свідчень
- Статус
- DEMO · Вигадана компанія й навчальні дані
- Матеріали
- Власні HTML/CSS/SVG, вихідний код і локальні алгоритми. Фотографії клієнтів не використовуються.
- Обробка
- Демонстрація виконується в браузері. Відкриття прикладу не створює заявку чи оплачений проєкт.
- Докази
- Вміст і локальні перевірки відокремлені від справжнього браузерного, хостингового та комерційного приймання.