Коли ШІ — не найкраще рішення: чому я обрав хеш-таблиці для автоматичного перемикання розкладок

💡 Усі статті, обговорення, новини про AI — в одному місці. Приєднуйтесь до AI спільноти!

Привіт!

Я розробляю невеликий macOS-застосунок, який автоматично перемикає розкладку клавіатури під час набору тексту, щоб користувачу не доводилося постійно робити це вручну.

Наприклад, можна писати українською, потім природно вставити MacBook Pro, команду терміналу або назву бібліотеки англійською — і застосунок сам перемкне розкладку в потрібний момент, а після цього поверне її назад.

Коли я починав цей проєкт, моя перша думка була очевидною.

Зараз усі використовують AI, тож логічно було припустити, що визначення мови теж варто побудувати на основі AI.

Але після кількох експериментів я повністю відмовився від цієї ідеї.

Причин було кілька.

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

По-друге, я не хотів залежати від інтернет-з’єднання, зовнішніх API чи сторонніх сервісів.

І найголовніше — поведінка має бути абсолютно передбачуваною. Якщо застосунок хоча б іноді перемикає мову неправильно, користувач дуже швидко перестає йому довіряти.

Тому замість AI я побудував систему навколо великих словників і хеш-мап.

Насправді застосунку не потрібно «розуміти» мову так, як це робить LLM.

Йому потрібно відповісти лише на одне запитання:

Чи відповідають останні введені символи поточній розкладці клавіатури, чи користувач, імовірно, вже пише іншою мовою?

Наприклад, якщо користувач пише:

Я працюю на MacBook Pro вже кілька років.

Він не повинен натискати комбінацію клавіш лише для того, щоб написати MacBook Pro, а потім перемикатися назад.

Або якщо він пише англійською і раптом вставляє українське слово — усе має відбутися автоматично.

Застосунок аналізує введений текст у реальному часі, перевіряє можливі варіанти в інших розкладках і визначає, чи настав момент автоматично змінити мову.

Для цього не потрібна генеративна модель.

Пошук у хеш-мапі виконується в середньому за O(1), тому перевірка відбувається практично миттєво. Один і той самий ввід завжди дає однаковий результат.

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

Цей підхід має кілька практичних переваг:

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

Звісно, словників недостатньо.

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

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

Але навіть ця логіка залишається локальною, швидкою та повністю детермінованою.

Цей проєкт ще раз нагадав мені просту річ.

AI — надзвичайно потужний інструмент, але не кожна задача потребує AI.

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

У моєму випадку саме так і сталося.

Мені цікаво почути думку спільноти.

Чи траплялися вам задачі, де AI здавався очевидним вибором, але простіший алгоритм у підсумку виявився кращим?

P.S. Я не українець, тому писав цей допис англійською, а потім використав AI для перекладу та редагування української версії. Якщо помітите неточності або неприродні формулювання — буду вдячний за виправлення.

P.P.S. Якщо комусь цікаво побачити реалізацію на практиці — застосунок називається Unfumble: unfumble.app. Буду радий будь-якому фідбеку.

👍ПодобаєтьсяСподобалось3
До обраногоВ обраному0
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

Дуже слушний кейс про вибір інструменту під задачу. Те, що описано — класичний приклад, коли інженери тягнуться до ML через хайп, хоча детерміністичне рішення і швидше, і передбачуваніше. Я стикався з аналогічним у продакшні: команда хотіла інтегрувати модель для класифікації тегів, але в підсумку dictionary lookup з нормалізацією дав точність 98%+ і не потребував жодного inference-сервера. Latency впала з ~200мс до <1мс. Стаття нагадує, що ’реальна автономність AI’ — це не завжди про нейромережі, і перед тим як довіряти моделі будь-який процес, варто чесно виміряти її переваги над простим алгоритмом.

Дякую!
Так, саме це я й намагався донести. AI зараз настільки легко доступний, що іноді ми починаємо використовувати його ще до того, як чітко сформулюємо саму задачу.

Цікавий підхід, я б спробував. Але в мене Windows — а я чомусь гадав, що на Mac такого болю взагалі немає. Проблема набору двома-трьома мовами цікавить мене давно, нещодавно навіть сам зробив собі утиліту — щоправда, пішов протилежним шляхом: нічого не перемикаю автоматично, лише підсвічую поточну розкладку рамкою по периметру екрана, щоб помилка не встигала статися.

Дякую! Це теж дуже цікавий підхід. Запобігти помилці ще до того, як вона станеться, — цілком логічне рішення.

Я теж спочатку думав у цьому напрямку: зробити поточну розкладку помітнішою. Але зрозумів, що з часом просто перестаю звертати увагу на такі індикатори й усе одно встигаю набрати кілька слів не тією мовою.

Саме тому ідея Unfumble полягає в тому, щоб взагалі прибрати необхідність думати про поточну розкладку й дозволити просто друкувати.

І так, як не дивно, на macOS ця проблема теж досить поширена, особливо якщо протягом дня постійно перемикаєшся між кількома мовами.

я ось навайбкодив для вінди таку утиліту github.com/stokrattt/EN-UA_Switcher

Чи не має десктопної версіїї для Віндоус? Форкнув би.

Поки що версії для Windows немає, а сам додаток має закритий код. Проте я планую розробити версію для Windows у найближчому майбутньому. Дякую за відгук!

Підписатись на коментарі