Loading...
← Всі проекти

AI Humanizer: локальний детектор ШІ-тексту для UA та EN

AI Humanizer — програма для Windows, яка оцінює, наскільки український або англійський текст схожий на згенерований мовною моделлю, і показує, через які саме речення та звороти. Текст при цьому нікуди не йде: евристики рахуються в самій програмі, а глибокий аналіз робить модель, запущена в LM Studio на вашому ж комп’ютері.

Про Joomla-компонент, зроблений на основі цього застосунку, я вже писав окремо. Тут про сам десктопний застосунок: навіщо він з’явився, чим відрізняється від того, що вже є, і що в ньому досі не так.

Детектор як доказ: де ламається доброчесність

Детектори ШІ-тексту потрапили в процедури академічної доброчесності швидше, ніж хтось перевірив, чи можна на їхні відсотки спиратися. OpenAI свій класифікатор закрила ще 20 липня 2023 року. За її ж даними, він правильно впізнавав лише 26 % машинного тексту і в 9 % випадків називав машинним людський.

Ширші цифри не кращі. У дослідженні Ляна та співавторів зі Стенфорда (журнал Patterns, 2023) сім популярних детекторів позначали як згенеровані 61 % текстів людей, для яких англійська не рідна; приблизно на п’ятій частині робіт помилялися всі сім одностайно. Для українських авторів, які подають англомовні статті до Scopus-журналів, це не абстракція.

У лютому 2026 року Washington State University відмовилася від AI-модуля Turnitin. Аргументи в меморандумі проректора прості й неприємні: восени 2024 року через систему пройшло 148 547 робіт, тож навіть заявлені 1 % хибних спрацювань означають близько 1 485 несправедливо позначених людських текстів; у 33 % справ про ШІ за 2023–2025 роки студентів визнали невинними, бо звіт детектора був єдиним доказом; сам звіт бачив лише викладач, тож студент не міг нічого заперечити до звинувачення.

Є ще конфіденційність. Elsevier прямо забороняє рецензентам і редакторам завантажувати рукопис або будь-яку його частину в генеративні ШІ-інструменти, бо це може порушити конфіденційність і права авторів. Хмарний детектор, куди вставляють чужий неопублікований рукопис, працює за тією самою схемою.

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

Що вже є і чим AI Humanizer відрізняється

Грубо наявні інструменти діляться на чотири групи.

ГрупаПрикладиУкраїнськаДе обробляється текстЩо видає
Інституційні антиплагіатні системиTurnitin, StrikePlagiarismStrikePlagiarism заявляє понад 100 мов, українська в переліку на сайті прямо не названахмара вендоразагальний коефіцієнт і кольорові фрагменти
Окремі хмарні детекториGPTZero, Copyleaks, Originality.ai, ZeroGPTу GPTZero та Copyleaks є в офіційних спискаххмара вендоравідсоток, підсвічування
«Хуманайзери»Undetectable.aiзалежить від сервісухмарадетекція + автоматичне переписування
Дослідницькі методиBinoculars, DetectGPTне орієнтовані на неїлокально, якщо є GPU і бажання розбиратисячисло в консолі

Кожна група закриває свою частину задачі, але не всю. StrikePlagiarism чесно пише, що його коефіцієнт «не є мірою частки» ШІ-тексту в документі, і показує ймовірність по фрагментах. Причин, чому фрагмент червоний, не пояснює ніхто. Хуманайзери роблять протилежне: переписують усе, не показуючи, що й навіщо змінили (а журналіст Девід Ґевірц у жовтні 2025 року показав, що детектор Undetectable.ai плутає людський і машинний текст в обидва боки). Binoculars на папері дуже сильний (автори пишуть про понад 90 % виявлення за 0,01 % хибних спрацювань), але це метод на парі мовних моделей, а не програма, яку можна дати викладачеві.

AI Humanizer я будував під чотири вимоги одразу, яких разом не закриває жоден із перелічених: щоб текст не залишав комп’ютер, щоб українська мала свої словники маркерів, а не перекладені англійські, щоб кожна оцінка розкладалася на зрозумілі причини, і щоб від «ось підозріле речення» до «ось виправлений .docx з тим самим оформленням» не треба було перескакувати між трьома сервісами.

Три рівні аналізу

Перший рівень — евристики. Вони працюють миттєво, під час введення, без жодної моделі. Програма ділить текст на речення й абзаци і рахує дев’ять сигналів, кожен зі своєю вагою:

СигналВага
ритм речень (коефіцієнт варіації довжин)2,2
кліше й «модельна» лексика на 100 слів2,4
шаблонні вступні зв’язки1,5
конструкції «не X, а Y»1,3
трійки через кому1,0
довгі тире1,1 для EN, 0,5 для UA
частка речень середньої довжини1,2
однаковість абзаців1,0
людські маркери (1-ша особа, дужки, питання)1,6

Тире для української важить менше навмисно: у нас воно пунктуаційна норма, а не звичка моделі. Словники для двох мов окремі. В українському є «відіграє ключову роль», «у сучасному світі», «невід’ємною частиною», в англійському — delve, tapestry, "it is worth noting". Підсумкову оцінку трохи розтягнуто до країв (0.5 + (score - 0.5) * 1.35), щоб кілька сильних маркерів важили більше, ніж розмазаний шум, а достовірність прив’язано до обсягу: до 80 слів вона низька, до 250 середня.

Другий рівень — схожість стилю із сімействами моделей: ChatGPT, Claude, Gemini, DeepSeek, Grok. У коді чесно написано, що це «hand-picked observations, not a trained classifier», і в інтерфейсі блок має позначку «експериментально» з приміткою, що це не визначення авторства.

Третій — глибокий аналіз локальною моделлю через LM Studio. Він захований за кнопкою і з’являється, лише якщо програма знайшла сервер LM Studio або утиліту lms.

Чому LM Studio викликається з main-процесу

Найпростіше було б робити fetch прямо з рендерера на localhost:1234. Але тоді користувачеві довелося б вмикати CORS у налаштуваннях LM Studio, а це ще один крок, на якому люди відвалюються. Тому всі запити до моделі йдуть із головного процесу Electron, де в Node-шного fetch CORS немає. Рендерер узагалі не отримує ipcRenderer, усе проходить через явний Api у shared/types.ts.

Цікавіша історія вийшла з JSON-схемою відповіді. LM Studio вміє grammar-constrained decoding: модель генерує поля строго в порядку схеми. Спершу ai_probability стояв першим, і малі моделі впевнено писали «0 %», а потім в аргументах доводили, що текст згенерований. Порядок я перевернув:

ts
// Property order matters: grammar-constrained decoding emits fields in this order,
// so the model writes its evidence first and commits to a number last.
export const SCHEMA = {
  type: 'object',
  additionalProperties: false,
  required: ['reasons', 'sentences', 'summary', 'model_guess', 'verdict', 'ai_probability'],
  // …
}

Модель тепер спочатку наводить докази, потім вердикт і лише в кінці число. Якщо число все одно суперечить вердикту, normalize() підтягує його в потрібний діапазон, а інтерфейс про це прямо пише. Окремо довелося писати поблажливий парсер: локальні моделі повертають <think>-блоки, markdown-огорожі, хвостові коми й, найчастіше, об’єкт, обрізаний лімітом токенів. Оскільки докази стоять у схемі першими, навіть обрізана відповідь зазвичай містить аргументи й підозрілі речення.

Правки як рецензування

Детектор, який лише каже «72 %», нічим не допомагає автору, що чесно писав сам і тепер має пояснити комісії, чому його текст «машинний». З версії 0.8.0 програма пропонує правки, а з 0.13.0 робить це навіть без LM Studio.

Офлайн-правила прибирають шаблонні початки («Крім того,», "Moreover,"), замінюють кліше простішими формулюваннями, перетворюють «не лише…, а й…» на звичайне «і», викидають порожні «варто зазначити, що». Це заміни фраз, а не граматика, тож в українській після заміни інколи треба поправити відмінок наступного слова. Довідка про це попереджає прямо.

Якщо LM Studio запущено, модель переписує речення, які сама ж позначила. Промпт жорсткий: зберегти зміст, кожен факт, число, назву, термін і посилання, нічого не додавати, не перекладати, академічний регістр лишити академічним. Модель бачить не весь текст, а речення з сусідами, бо довгий документ інакше не влазить у типовий контекст LM Studio.

Обидва джерела потрапляють в один список «Пропоновані правки», де вилучене закреслено червоним, нове позначено зеленим, і кожну правку можна прийняти, відхилити або повернути. У текст нічого не потрапляє без кліку.

Тут, звісно, напрошується питання про доброчесність. Інструмент, що прибирає маркери, можна використати й для того, щоб приховати використання ШІ. Програма міняє лише стилістичні звороти й нічого не дописує, але питання атрибуції вона не вирішує і вирішувати не повинна: це справа декларації автора і політики закладу.

Після правок Ctrl+S записує текст назад у файл того самого формату. Для .docx читання й запис ідуть через спільну TextMap, тож пласкому тексту в редакторі завжди відповідають ті самі run-и XML; токенний diff чіпає лише змінені фрагменти, а решта пакета перепаковується байт у байт. Стилі, таблиці, колонтитули й зображення лишаються на місці. PDF так не відредагуєш, тому з нього виходить новий .docx.

Звіт і посібник

Звіт експортується в PDF (Ctrl+P). PDF-бібліотеки в проєкті немає: приховане вікно Chromium відкриває сторінку report.html і друкує її через printToPDF. Пастка тут одна: приховане вікно не малює кадрів, тож чекати треба document.fonts.ready, а не requestAnimationFrame. У колофоні звіту написано, що текст оброблено локально й нікуди не надсилався, і для рецензента це, можливо, найважливіший рядок.

Окремим вікном відкриваються методичні рекомендації «Детекція AI-тексту»: як працюють детектори, чому помиляються, як автору захистити свій текст від хибних звинувачень. Усередині є калькулятор водяного знака, симулятор базової частоти й чек-лист автора. Посібник працює без інтернету.

Чого ще немає

  • OCR. Скан PDF без текстового шару дасть порожній результат.
  • Навчених словників. Лексикони стилю зібрано вручну як спостереження, а не натреновано.
  • Ollama. Бекенд поки один, LM Studio; Ollama в планах і має стати одним рядком у shared/capabilities.ts плюс клієнт.
  • Стримінгу відповіді моделі: зараз це один запит, і результат з’являється лише цілком.
  • Підпису коду. Інсталятор не підписаний, SmartScreen попереджатиме.

Глибокий аналіз бере лише перші 160 речень, щоб текст умістився в контекст моделі. Збірки є тільки під Windows (NSIS-інсталятор і zip).

Стек і збірка

Electron 33, React 19, TypeScript 5.7, Vite 6 для рендерера, esbuild для main і preload, SCSS за BEM, pdf.js для читання PDF, fflate для перепакування .docx. Інтерфейс двомовний (UA/EN), і два словники перевіряються на однаковий набір ключів окремим скриптом. Перший коміт датовано 26 вересня 2026 року, поточна версія 0.13.0.

bash
npm install
npm run dev     # Vite + Electron with hot restart
npm run dist    # NSIS installer + zip in ./release

Потрібні Node.js 20+ і Git; нативних модулів немає, Visual Studio Build Tools не знадобляться. npm run dist починається зі smoke-тесту, який рендерить інтерфейс у jsdom. Саме він ловить useEffect, поставлений після раннього return: такий баг уже давав чорне вікно, а TypeScript і Vite на нього мовчали.

Джерела