Розробка

Створення Штучного Інтелект методом «глокой куздры». Інтелектуальна одіссея

Захотілося мені написати розмовляючу програму. Дуже захотілося, конче.

Звичайно, мені далеко до професійних програмістів, і лінгвістом я теж не є, але системне мислення є, і почуття мови на місці. Тим більше що тематикою ІІ давно цікавлюся, навіть пару-трійку постів накатав в свій час. Чому не реалізувати пізнання в програмному коді? Ну і спробував, наскільки зміг.

Знайомтеся, Ваня Розумний.

Нижче знаходиться опис проблем, які постали переді мною на цьому хоженом-перехоженом шляху, та способів їх подолання.

З приводу результату обмовлюся відразу: метою був не програмний код, а формулювання принципів штучного мислення, функціонуючого НЕ на основі фізичної реальності, як біологічні організми, а на основі СИНТАКСИСУ. Шанувальники тесту Тюрінга, нейронних мереж і машинного навчання можуть не турбуватися.

Увага, матеріал об’ємний.

Цебер холодної води

Щоб не було безпідставних очікувань з наступними єхидними скріншотами в коментарях, відразу продемонструю Ваню Розумного в непрезентабельному вигляді. Ось, закачав початок «Емелі» і спробував розпитати – в точності як на уроках літератури в початкових класах.

Оригінальний текст:
Жив-був старий. У нього було три сини: двоє розумних, а третій – дурник Омелько. Ті брати працюють, а Омелько цілий день лежить на печі, знати нічого не хоче.
Один раз брати поїхали на базар, а баби, невістки, давай посилати його:
— Піди, Омельку, за водою.
А він їм з печі:
— Неохота…
— Піди, Омельку, а брати з базару воротятся, гостинців тобі не дадуть.
— Ну, гаразд.
Сліз Омелько з печі, узувся, одягся, узяв відра та сокиру і пішов на річку. Прорубав лід, зачерпнув відра і поставив їх, а сам дивиться в ополонку. І побачив Омелько в ополонці щуку.

Діалог:

Однак, текст можна адаптувати – так, припустимо:
Старий мав трьох синів. Перший син був розумним. Другий син був розумним. Третій син був дурнем. Омелько – третій син старого. Омелько хороший.
Старші сини працюють цілий день, а Омелько лежить на печі.
Одного разу брати поїхали на базар. Невістки кажуть Омелькові:
— Піди за водою.
Омелько відповідає з печі:
— Не піду за водою.
Невістки кажуть:
— Брати гостинців тобі не дадуть.
— Ну, гаразд.
Омелько зліз з печі, узувся, одягся, узяв відра і сокиру. Потім Омелько пішов на річку.
Омелько прорубав лід і зачерпнув відра. І побачив Омелько в ополонці щуку. Щука – це риба. Омелько зловив щуку.

Після адаптації виходить пристойніше:

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

Переходжу безпосередньо до опису інтелектуальної одіссеї.

Теоретичне обґрунтування

Міркував я наступним чином.

У чому головна проблема ШІ? У тому, що комп’ютер не може розуміти значення слів, відповідно бути «розумним». При цьому вважається, що люди розумні, оскільки розуміють, що вимовлені ним слова.

Насправді ні чорта люди не розумні. Слово саме по собі означає не більше, ніж складові його букви (по суті, криві лінії) або звуки (коливання повітря). Сенс виникає лише в якості відносин між літерами-звуками як елементами членороздільної мови, за рахунок стійких асоціацій, у тому числі за рахунок зв’язків з світом візуальних відчуттів. Наприклад, співрозмовник вказує на предмет і каже: «Це дерево». І ти розумієш, що цей предмет називається деревом.

Чат-боту (під яким домовимося розуміти ІІ, який займається виключно розмовами) можна вказати на предмет і сказати: «Це дерево», – за рахунок відсутності у чат-бота очей, тобто відеокамери. Пояснювати можливо лише на словах, а як поясниш, якщо людської мови він не розуміє?!

На щастя, відносини між елементами мови визначено, і досить жорстко: за них відповідає синтаксис. Отже, будь-який текст, побудований за законами синтаксису, містить у собі певний, закріплений у синтаксисі сенс. Та сама винесена в заголовок «глокая куздра», відома і неперевершена за наочності – яка, як виявилося, давно пристебнута до комп’ютерних досліджень.

Зі спогадів одного товариша про далеких 70-х:
Глокая куздра В липні 2012 р. до мене в Концепт прийшов експерт і сказав «Глокая куздра». Я його зрозумів. Це був знак причетності до спільному колись семантичному полю….
«Глокая куздра штеко будланула бокра і кудлачит бокренка».
В 70-ті роки штучним інтелектом займалися в ОЦ АН СРСР, у ІПУ АН СРСР та кількох ін. інститутах. У тому числі було направлення, яке займалося машинним перекладом. Проблема не вирішувалася роками, семантична неоднозначність не давала перевести сенс без контексту. Було не зрозуміло, як формалізувати контекст в комп’ютерній програмі. І ось Д. А. Поспєлов /мабуть/ поширив приклад, що ілюструє складність цього перекладу. Він узяв фразу, яка складається з безглуздих слів, але разом з тим у строю пропозиції і звучанням слів створює абсолютно ясні однакові асоціації у абсолютно різних людей. Цей ефект розуміння не міг бути досягнутий машиною. Дійсно, Глокая куздра – така собі зла коза – вона, ясна річ, сильно буцнув козла і щось несусвітнє творить з козеням… Семінари по машинному перекладу проходили і у ІПУ, і я зустрічав на дошці такий ось зміст: «Глокая куздра. Семінар відбудеться о 14.00 в 425 ауд.».
Довідка. Автор цієї фрази – відомий мовознавець, академік Лев Володимирович Щерба. Корені входять у слова створені штучно, суфікси і закінчення дозволяють визначити, до яких частин мови належать ці слова і вивести значення фрази. У книзі Ст. Л. Успенського «Слово про слова» наведено її загальний зміст: «Щось жіночого роду в один прийом вчинило щось над якоюсь істотою чоловічого роду, а потім почало щось таке витворяти тривале, поступове з його дитиною».
Джерело kuchkarov.livejournal.com/13035.html

На основі «глокой куздры» можна побудувати повноцінний діалог.
— Хто будланул бокра?
— Куздра.
— Хто кудлачит бокренка?
— Теж куздра.
— Яка вона?
— Глокая.
— Як будланули бокара?
— Штеко.

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

Люди не бачать предметів, а спостерігають панораму кольорових точок – по суті, хаотичну. Предмети утворюються не в зовнішньому світі, а в людському мозку, за рахунок пов’язання кольорових точок воєдино, окремі сукупності. Це означає, що ми існуємо в якомусь ілюзорному світі, який у відомому сенсі нами ж і сконструйований.

Читав, що якесь первісне плем’я не бачить літаків у небі – просто не бачить, і все. Ще читав, що індіанці не помічаючи підійшли до берегів кораблів Колумба, тому що… просто не помічали. А помітили після того, як їм пояснили, як треба дивитися – тобто яким чином пов’язувати кольорові пікселі в конкретні предмети. Я цим псевдогеографічним вірю байкам: такі зорові парадокси представляються мені правдоподібними.

У людини немає підстав вважати, що його мислення влаштовано якимось особливим чином, тому принцип «глокой куздры» – єдина можливість зробити розумним когсь, будь то чат-бот або людина. Можна використовувати різний інструментарій, але принципова схема є безумовною. Я так вважав до початку роботи і не змінив своєї думки по її закінченні.

Бібліотеки

Поставивши завдання, почав гуглити з приводу відповідних бібліотек для C#.

Тут мене чекало перше розчарування: нічого придатного, у всякому разі безкоштовного, не виявлялося. Всілякі готові модулі для реалізації чат-ботів не потрібні, цікавила робота зі словоформами. Здавалося, що простіше:
а) визначати морфологічні ознаки словоформи,
б) повертати словоформу з необхідними морфологічними ознаками?
Лексикон обмежений, кількість ознак теж. І така річ корисна, обігова… Не тут-то було!

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

Перша бібліотека – Solarix. Багато чого дозволяє, але я, в силу малої компетентності та фінансової недостатності (бібліотека безкоштовно лише частково), використовував безумовно безкоштовний парсер, що робить синтаксичний розбір тексту та записує результат у файл.

Приклад синтаксичного розбору парсера Solarix

<?xml version='1.0' encoding='utf-8' ?>
<parsing>
<sentence paragraph_id='-1'>
<text>мама мила брудну раму.</text>
<tokens>
<token>
<word>мама</word>
<position>0</position>
<лемма>мама</лемма>
<part_of_speech>ІМЕННИК</part_of_speech>
<tags>ВІДМІНОК:ЇМ|ЧИСЛО:ОД|РІД:ЖІН|ОДУШ:ОДУШ|ПЕРЕЧИСЛИМОСТЬ:ТАК|ПАДЕЖВАЛ:РІД</tags>
</token>
<token>
<word>мила</word>
<position>1</position>
<лемма>мити</лемма>
<part_of_speech>ДІЄСЛОВО</part_of_speech>
<tags>НАКЛОНЕНИЕ:ИЗЪЯВ|ВРЕМЯ:ПРОШЕДШЕЕ|ЧИСЛО:ЕД|РОД:ЖЕН|МОДАЛЬНЫЙ:0|ПЕРЕХОДНОСТЬ:ПЕРЕХОДНЫЙ|ПАДЕЖ:ВИН|ПАДЕЖ:ТВОР|ПАДЕЖ:ДАТ|ВИД:НЕСОВЕРШ|ВОЗВРАТНОСТЬ:0</tags>
</token>
<token>
<word>брудну</word>
<position>2</position>
<лемма>брудний</лемма>
<part_of_speech>ПРИКМЕТНИК</part_of_speech>
<tags>СТУПІНЬ:АТРІБ|КОРОТКИЙ:0|ВІДМІНОК:ВИН|ЧИСЛО:ОД|РІД:ДРУЖИН</tags>
</token>
<token>
<word>раму</word>
<position>3</position>
<лемма>рама</лемма>
<part_of_speech>ІМЕННИК</part_of_speech>
<tags>ВІДМІНОК:ВИН|ЧИСЛО:ОД|РІД:ЖІН|ОДУШ:НЕОДУШ|ПЕРЕЧИСЛИМОСТЬ:ТАК|ПАДЕЖВАЛ:РІД</tags>
</token>
<token>
<word>.</word>
<position>4</position>
<лемма>.</лемма>
<part_of_speech>ПУНКТУАТОР</part_of_speech>
<tags></tags>
</token>
</tokens>
</sentence>
</parsing>

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

Отримавши бажане, засукав рукави.

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

На початку було слово

Відповідно до реалізованої мною концепцією, як первинного елемента маємо слова з відомими нам морфологічними ознаками.

Морфологічні ознаки слів повертає парсер Solarix – здавалося б, проблем немає. Однак проблеми є у зв’язку з тим, що деякі словосполучення мають загальну нероздільну семантику, у зв’язку з чим повинні сприйматися ІІ в якості єдиного елемента.

Я нарахував чотири види подібних словосполучень:

1. Фразеологічні звороти,
На жаль, парсер їх не повертає.
Слюсар бив байдики.
Для парсера «бити байдики» – два різних слова, хоча семантична основа тут одна, і сприймати словосполучення необхідно так, як його сприймає наш мозок: злито.

2. Власні імена,
Олександр Сергійович Пушкін.
Ясно, що це єдиний вказівник на єдиний предмет, хоча окремі складові його слова можуть бути використані в інших покажчиках.

3. Приказки, прислів’я, афоризми.
Вони, як правило, також являють собою єдине смислове поле.
Старий кінь борозни не псує.

4. Складові службові слова (внаслідок чого, з-за того що, через тощо)
Парсер повертає деякі з них разом, інші – ні.

5. Просто стійкі словосполучення типу «книжкового магазину». Не приставиш будь-прикметник до іменника «магазин», хоча б відповідні вироби в ньому і продавалися. Ніхто не скаже «макаронний магазин», навіть якщо в магазині торгують виключно макаронами.

Складові слова – незалежно від їх типу – необхідно обробляти так, як якщо б вони були єдиної злитої конструкцією… Але як дізнатися, які словосполучення належать до цієї групи?

Найбільш очевидне – за допомогою прямого на те вказівки:

Більш складний, застосовний лише до імен, варіант – визначення фразеологізмів за заголовним буквах:
• деякі власні імена, зокрема ПІБ, мають усі заголовні літери
• інші власні імена лише починаються з великої літери (наприклад, Аральське море).

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

Суб’єкт – Дія – Об’єкт

Слова визначені, їх властивості зафіксовано, що далі? Далі необхідно визначити кістяк фрази: будь-розробник ІІ напевно приходив до того ж висновку.

Ось фраза:
Тесля выстругал дошку.
Що можна про неї сказати, орієнтуючись виключно на синтаксис?

Можна сказати, що:
1. Суб’єкт (іменник називного відмінка), що виконує дію.
2. Об’єкт (іменник не називного відмінка) – те, на що спрямована дія.
3. Сама дія – дієслово.

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

Було:
Тесля выстругал дошку.
Стало:
Дошка выстругана теслею.

Інакше кажучи, застава робить фразу інваріантної.

У деяких випадках інваріантність фрази практично невизначиме, на жаль.

Маємо вислів:
Сірники лежать в коробці.
Його можна переформулювати:
Коробка містить сірники.
Зміст обох фраз ідентично, однак виражаються дієсловами дії формально разнонаправленны (у першому випадку сірники впливають на коробок, в другому випадку – навпаки), при цьому застави обох дієслів активні.

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

Спільне вживання тріади не обов’язково: будь-який з названих елементів у фразі може бути відсутнім.
Бегемот рушив.
Вечір.
Світало.

І навпаки, елементи можуть бути присутніми в реченні у множині, наприклад:
Вася і Петя побилися.

Що стосується множинності, то після довгих роздумів і переробок мною були встановлені наступні правила обробки:

1. Суб’єкт у реченні присутній завжди. При відсутності суб’єкта у вихідний текст вставляється заглушка, що позначає іменник.
Світало.
Перетворимо в:
[Noun] світало. Інакше кажучи: Що-то світало.

2. Дія може бути відсутня при відсутності об’єкта. При наявності об’єкта вставляється заглушка, що позначає дієслово.
Крок у безодню.
Перетворимо в:
Крок [verb] в безодню. Можна трактувати як: Крок [спрямований] в безодню.

3. Об’єкт в реченні може бути відсутнім. Ніякої заглушки при цьому не застосовується.
Він поїхав.
Збільшувати фразу до «Він поїхав [noun]» немає сенсу, адже їдуть не обов’язково кудись: термін може позначати початок руху.

4. Суб’єкт і об’єкт можуть бути множинними. Фраза при цьому не поділяється.
Множинні суб’єкти:
Хлопчик і дівчинка дивилися телевізор.
Численні об’єкти:
Мисливець здобув лося і кабана.

5. Дія допускається тільки поодиноким: при множинності дій фраза розділяється за кількістю дієслів.
Двірник посміхнувся і погрозив пальцем.
Перетворимо в:
Двірник посміхнувся. Двірник погрозив пальцем.
У цьому випадку фраза вимагає поділу.

Властивості елементів

Властивості основних елементів (тобто іменників і дієслів) – це в основному їх морфологічні ознаки: рід, відмінок, особа, число, перехідність, зворотність, модальність та інше – все те, що повертає парсер Solarix. Плюс інші, не розглядаються лінгвістикою. Я використовував характеристики не цілком канонічні: заперечення, закавыченность, знак пунктуації (який вважав властивістю попереднього слова) і т. п.

Деякі з названих властивостей одиничні (наприклад, рід: не буває слів одночасно чоловічого і жіночого родів), інші чисельні. До множинним властивостей відносяться, наприклад, число і дата. Можна сказати «5 конячок», а можна: «Не менше 3 і не більше 7 конячок»: у другому випадку обидва числівників належать до одного слова, тим самим є його численними властивостями.

Важливо, що інші частини мови являють собою властивості основних елементів або якісь допоміжні сутності типу посилань, зокрема:
• прикметник – властивість іменника,
• прислівник – властивість дієслова (як правило),
• привід – властивість іменника,
• союз – маркер множинності елементів (як правило),
• займенник – посилання на попереднє іменник,
• числівник – покажчик на число суб’єктів або об’єктів.

Поділ речень на сектори

Вище був згаданий випадок, який вимагає поділу речень на частини (приклад з двірником). Цей випадок не єдиний – зустрічаються інші.

Найочевидніше: складносурядні та складнопідрядні речення.

Юнак посміхнувся, і дівчина посміхнулася у відповідь.
Плавець плюхнувся у воду, яка була холодна.

Поділяємо на:
Юнак усміхнувся. Дівчина посміхнулася у відповідь.
Плавець плюхнувся у воду. Вода була холодна.

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

Автомобіль, розвернувшись на місці, врізався у відбійник.
Розгорнувся на місці автомобіль врізався у відбійник.

Поділяємо:
Автомобіль розвернувся на місці. Автомобіль врізався у відбійник.

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

Кінцева конструкція у всіх трьох вихідних варіантів прикладу ідентична.

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

Такий приклад:
Добре гуляти по осінньому лісі.
Що тут розділяти, коли всі разом і компактно? Трохи спантеличує відсутність суб’єкта, оскільки, як ми домовилися, суб’єкт повинен виражатися іменником, а тут він… прислівник чи що? Ан ні, поділ необхідно!
[Noun] гуляти по осінньому лісі. Добре. В сенсі: Хтось гуляє по осінньому лісі. Це добре.

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

Котедж – це житло.
Не тільки суб’єкт, але й об’єкт в називному відмінку. Виняток, скажете ви? Можна послатися на виключення, проте логічніше вважати зазначену конструкцію двома фразами, об’єднаними особливою властивістю. Я називаю такі фрази, отримані за допомогою поділу речень на частини, секторами.

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

Тут другий сектор є визначенням першого. І ніяких тобі об’єктів у називному відмінку!

Головне, звичайно, те, що властивостями можуть володіти не тільки окремі елементи, але і сектори.
Крім мети, я використовував такі властивості секторів, як:
• тип повідомлення (твердження, розпорядження, питання),
• тип питання,
• застава (мало місце перетворення страдательного застави в дійсний),
• звернення до співрозмовника по імені: так або ні),
• склейка,
• валідність,
• час,
• ймовірність.

Склейка

Як прийнято іменувати цю сутність у лінгвістів, поняття не маю. Може бути, сполучне слово?

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

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

Склейка може бути відсутнім, тоді виявити її проблематично – практично неможливо.
Вітер подув, і листя зашелестіло.
У фізичній реальності ми орієнтуємося на зір, а якщо спілкування відбувається на вербальному рівні, то на інтонацію і на візуальний досвід, і зазвичай вгадуємо, але тільки не в царстві слів. Як відрізнити наведену фразу, що позначає причину і наслідок, від пересічної послідовності подій?
Вітер подув, і пробіг заєць.
Заєць пробіг-то зовсім не від того, що вітер подув – ми знаємо, – але з синтаксису цього не слід, хоча не слід і зворотного. Хто його знає, як сталося насправді? Може, вітер подув, в результаті чого обламалася гілка, заєць злякався і побіг у цьому випадку подих вітру є причиною того, що заєць побіг.

Названа проблема не вирішується для чат-бота в принципі: фізична реальність – одне, вербальна сфера – інше. Елементна база різна (під елементною базою я розумію спосіб сприйняття реальності: чат-бота це письмова мова).

Валідність

Деякі фрази виявляються некоректними. Ясно, що якщо видати ІІ відверту нісенітницю, він не зрозуміє.

Однак навіть фраза, вибудувана на перший погляд у відповідності з правилами синтаксису, може виявитися бракованою внаслідок різних нюансів, наприклад:

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

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

Очевидно, що інвалідні фрази необхідно нещадно відбраковувати при обробці.

Основні ознаки інвалідних фраз, в моїй інтерпретації:
• відсутність значущих слів (іменників і дієслів),
• занадто велике число слів, не пізнаних парсером як частин мови,
• наявність іменника в називному відмінку при відсутності дієслова (помилка в алгоритмі, оскільки в таких випадках дієслово вставляється примусово),
• занадто велика кількість негативних часток (див. вище),
• занадто велика кількість дат відсутність перерахування (зазвичай в реченні фігурує або одна дата, або, у разі зазначення на період, дві дати),
• наявність двох дієслів (наслідок помилки в алгоритмі),
• одинарність союзу (якщо виявлено, приміром, одне «або», то має місце помилка або у фразі, або в алгоритмі),
• неоднаковість спілок (одночасне використання альтернативних спілок «і», «або»).

Вставка потрібних слів. Заміна посилань

Пропозиція формалізовано, пора записувати? Рано. Потрібно вставити відсутні слова і замінити посилання.

Візьмемо для прикладу діалог:
— Петров, як здоров’я?
— Нормальне.
— А у дружини?
— Теж.

Формалізація вимагає поповнення відсутнього, приблизно так:
— Як здоров’я Петрова?
— Здоров’я Петрова нормальне.
— А як здоров’я дружини Петрова?
— Здоров’я у дружини Петрова теж нормальний.

Після цього – не раніше – можна приступати до обробки тексту з подальшим записом в базу.

Ось і вона – база, з усіма властивостями, також допоміжними і довідковими таблицями.

Ієрархічна структура:
1. Бесіда (сеанс зв’язку з співрозмовником).
2. Повідомлення (текст, який видає співрозмовник зараз).
3. Пропозиція (інформаційна одиниця повідомлення).
4. Сектор (частина пропозиції).
5. Слово.

Спілкування

Після запису репліки співрозмовника в базу можна приступати безпосередньо до спілкування. Проблема – яким чином спілкуватися? Сказати щось ствердне? Задати зустрічне питання? Попросити чого-небудь?

Методом проб і помилок вималювалася схема.

Примусова відповідь – це, наприклад інвалідне повідомленгня, де співрозмовник встановив, що на таку-то фразу потрібно відповідати таким-то чином.

Інформаційна неповнота – коли вдається встановити, що в пропозиції відсутні значущий елемент, як правило об’єкт.

Що сказала? Будь-яка людина, почувши подібне, насамперед уточнить, що мається на увазі.

Достовірність – відповідність того, що записано в пам’яті. Якщо хтось чує «Гагарін не літав в космос», а в його пам’яті записано зворотне, він знову-таки попросить (мушу попросити) роз’яснень.

Природна реакція.

При необхідності відповідати стандартно Ваня Розумний здійснює вибір з типового набору відповідей випадковим чином.

Треба сказати, що з типовими повідомленнями я особливо не морочився з причини того, що домогтися повної схожості з людською реакцією неможливо за визначенням. Припустимо, чат-бот видає стандартне «Я згоден». Можна, підібравши синонімічні повідомлення, повертати їх рандомно:
Точно так.
Ти прав.
Вірно кажеш.
Твоя правда.

і т. п.

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

Так на рівні синтаксису можна навіть відрізнити негативну відповідь від позитивного!
Візьмемо два звичних для нас альтернативних відповіді на один і той же питання:
Ще як!
Ось ще!

Перший з відповідей означає «Так», а другої – «Ні». Визначити значення з синтаксису немає ніякої можливості.

Типи речень

Основну роль в діалозі грають типи пропозицій:
1. Розпорядження.
2. Твердження.
3. Питання.

Найелементарніше з усіх – розпорядження. Ваня Розумний намагається за дії зрозуміти, чого хоче співрозмовник: якщо може виконати, то виконує, в іншому випадку повідомляє про відмову.
Ну що чат-бот може виконати? Сказати про те, виконати команду.

Нічого вартого уваги.

При позитивній висловлення співрозмовника реакція в загальному випадку зводиться до пошуку зустрічного затвердження по темі, де тема – суб’єкт або об’єкт, за бажанням.
Космонавт полетів на Марс.

У відповідь, знайшовши в базі стверджувальне речення зі словом «космонавт», можна видати:
Космонавти хоробрі.

А можна пошукати по об’єкту, повернувши що-небудь начебто:
Марс – це червона планета.

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

Підібрати критерії?.. Але які??? Після довгих роздумів я встановив, що у відповідь затвердження по темі ИИ повинен видати фразу, що позначає особисте ставлення до предмета:
Я не літав на Марс.
Знову-таки, якщо подібна фраза знайдеться в базі.

Замість відповіді затвердження може генеруватися питання: у разі якщо в порушеної теми Ваня чогось недозрозумів.

Питання

Питання підрозділяються на два підтипи, які для себе я визначив як загальні і спеціальні.
Загальні питання – без питального слова, які припускають відповіді «Так» або «Ні».

Спеціальні питання вимагають у кожному випадку індивідуального відповіді, тут простим «Так» чи «Ні» не відбудешся.
Скільки на Землі людей?
Чому слони великі?
Хто такий Наполеон?

Довелося систематизувати питальні слова. Кожному вопросительному речі, яких, на щастя, все ж трохи, – ставився у відповідність тип. Вийшов список виду:
Річ: що?
Ім’я: хто?
Місце: куди? де?
Прикметник: який?
Прислівник: як?
Число: скільки?
Дата: коли?
Причина: чому?
І так далі.

При відсутності питального слова питання загальний.

При загальному питанні Ваня Розумний шукає відповіді не тільки безпосередньо на нього, а в разі негативної відповіді і на всі спеціальні питання, згенеровані за основним загальним. Мета – видати в якості відповіді альтернативний сектор.

Відповіді

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

Встановивши сектор-відповідь, можемо видати співрозмовника «Так», або «Ні», або «А чорт його знає», – але це за загальним питання.

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

Припустимо, запитали:
Хтось вистрілив?
Для «вистрілив» шукаємо «вистрілити» з заданими морфологічними ознаками, а для «хто» – будь-яке слово з заданими морфологічними ознаками. Сектор, в якому присутні обидва слова, і буде відповіддю.

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

Запитуємо:
Який хлопчик?
«Який» – питальне слово для прикметника, тобто в загальному випадку Ваня повинен шукати прикметник. Якщо в базі для даного іменника знаходиться прикметник, видається відповідний відповідь.

В іншій ситуації відповіддю може послужити не тільки прикметник, але і щось інше, наприклад причастя.

Причастя виражає дію, тому, з певної точки зору, будь-яка дія характеризує суб’єкт не менш прикметника і причастя.

Більш складний, пов’язаний з пошуком суб’єкта, варіант підміни шаблону:

Подібних варіантів з пару десятків: це те, що мені вдалося знайти.

Зверніть увагу: один результат може виявитися відповіддю відразу на кілька питальних підтипів.

На останнє запитання відповіді не знаходиться – Ваня відповідно і не відповідає.

Послідовний пошук по пов’язаним секторами

Припустимо, у чат-бота питають:
Куди дурний Петя пішов?

Насправді питання розбивається на два пов’язаних сектора:
Куди Петя пішов? Петя дурний?
При цьому не факт, що обидві відповіді виявляться позитивними або негативними: цілком можна уявити, що Петя пішов у магазин, але при цьому Петя зовсім не дурний.

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

В даному випадку відомості про визначення Петі відсутні, тому відповідати на основне питання немає резону.

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

Я зловив жереха, який погнув ваги?
Після розділення пропозицію перетворюється у сектори:
Я зловив жереха? Жерех погнув ваги?

Так само у всіх інших випадках, що потребують поділу на сектори. Утруднення, хоча переборне.

Суперечливість інформації

Уявімо, що у штучний інтелект запитують, скільки космонавтів літало в космос. Добре, якщо в базі значиться одна фраза:
В космос літало 40 космонавтів.
А якщо там іншо фраза присутня?
В космос літало 45 космонавтів.
40 або 45, кому вірити? Ймовірно, один з джерел бреше, але який? Можна повірити тому або іншому, але критерії віри які? Очевидно, рейтинг джерела. Але яким чином ШІ може визначити рейтинг джерела, якщо всі співрозмовники для нього, строго кажучи, однакові?

Мені здалося логічним, щоб штучний інтелект прагнув до отримання максимального обсягу знань, тобто: співрозмовник, пропонує нову (відсутню в базі) інформацію – хороший, не пропонує – поганий.

В результаті був реалізований наступний механізм:
1. Рейтинг співрозмовника розраховується на підставі відношення виданих нових секторів до загальної їх кількості – відповідно, змінюється з кожною фразою.
2. Сектору присвоюється поточний рейтинг співрозмовника.
3. Якщо сектори різних співрозмовників антагоністичні, довіру викликає той, який володіє найбільшим рейтингом.
4. Якщо антагоністичні сектори одного співрозмовника, останній по часу сектор вважається дійсним (тобто себе можна в будь-який момент поправити, але поправити твердження іншого візаві можливо, якщо маєш великий рейтинг)).
В результаті штучний інтелект здатний визначити, якому з двох висловлювань вірити.

Думаєте, проблема з кількістю космонавтів вирішена? Нічого не вирішена, тому що обидва джерела можуть бути правдивими. Станом на 1 січня значилося 40 космонавтів, протягом року 5 осіб злітало в космос, за станом на 31 грудня числиться 45 космонавтів. Тільки звідки штучному інтелекту про це знати?!

Інваріантність

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

Отже, одне і те ж повідомлення можна сформулювати по-різному:
Я захворів.
Мені неможется.
Мене ламає.
Погано себе почуваю.
Я хвора.
Недомогаю.
Здоров’я ні до біса.

І т. п.

Деякі дрібниці на цьому шляху переборні.

Синоніми – найочевидніше і повсюдно реалізоване рішення.

Ще можна використовувати спільнокореневі слова, наприклад:
Хвороба.
Біль.
Захворіти.
Захворювання.
Боляче.

Ось фрази з ними, що виражають, по суті, єдину думку.
Він підхопив хворобу.
Він відчуває біль.
Він захворів.
У нього захворювання.
Йому боляче.

На жаль, можливо сформулювати і без використання спільнокореневих слів. Наприклад:
Здоров’я похитнулося.
Тому в рамках синтаксису повне і безумовне рішення проблеми інваріантності відсутня. Щоб вирішити проблему інваріантності, потрібен не чат-бот, а ИИ, що володіє повним набором людських відчуттів.

Що таке інтелект

Мова дійшла до інтелекту, на ньому й зупинюся.

Особисто я (хоча у кожного власна думка, розумію) нараховую три пункти, що мисляча істота повинна володіти таким:
1. Зворотній зв’язок.
2. Мислення.
3. Рефлексія.

Зворотній зв’язок – залежність реакції від попереднього досвіду. Реалізується примітивним чином, за рахунок запису інформації в базу даних. Спочатку штучний інтелект чогось не знав, потім почув, запам’ятав і тепер знає – це і є зворотний зв’язок.

Мислення – процес генерування нової інформації, безпосередньо не одержуваної від співрозмовника. Співрозмовник видає повідомлення, ІІ аналізує і приходить до власних висновків.

Ваня Розумний робить висновки, потім записує їх у базу з позначкою «ідея» (властивість сектора). Все мислення, власне.

Так мислимо ми:

Так має мислити ІІ:

Питання не в тому, що таке мислення, а в тому, яким чином штучне мислення повинно бути організовано…

Мислення за допомогою класів

В якості основи мислення я (не сумніваюся, що подібно багаточисленним попередникам) використовував класи. В математиці це називається множинами, у лінгвістиці – гиперонимами, але мені більше подобається дарвинистско-программистское «класи». Бульдог відноситься до класу собак, собаки відносяться до класу тварин, і так далі вгору і вниз по ієрархії.

Правила користування тривіальні:
1. Поняття можуть належати одночасно до кількох класів. Наприклад, Сидоров одночасно відноситься до класу чоловіків і до класу курців.
2. Класи не можуть зациклюватися у своїй ієрархії. Поняття, розташоване на якій-небудь гілці ієрархічної, не може повторитися нижче або вище за своєї ієрархії. Якщо Сидоров відноситься до класу курців, то курець не відноситься до класу Сидорових.

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

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

Якщо собака Жучка і всі собаки гавкають, досить очевидно, що Жучка теж вміє гавкати.
Замінимо у вихідному затвердження «собаку» на «Тузика». Логічно припустити, що якщо собака Тузік вміє гавкати, то і собака Жучка теж вміє?

Не логічно. Якщо замість «гавкати» вставити «народжувати щенят»? Тузик цього не вміє, а Жучка – запросто. З цієї причини пошук видав негативний результат. Разом з тим було виявлено альтернативний сектор (вміння Тузика гавкати), який і став відповіддю – по-моєму, досить пізнавальним.

Інший спосіб виявлення класів – перерахування. Вихідна посилка: слова, пов’язані деякими спілками (і, або, а, крім) або комами в зв’язку з перерахуванням, що належать хоча б одного спільного класу.

Я ні словом не обмовився, що Сірко – собака: Ваня Розумний сам зробив висновок з отриманої інформації. В іншому випадку міг і помилитися: наприклад, якщо б я написав «Тузик – це пес», тому що Жучку до псів ніяк не зарахуєш. Довелося б вносити корективи.

Що я і зробив, власне, а Ваня відповідним чином зреагував, хоча не без огріхів.

Наступний спосіб – деякі питальні прислівники (куди, де, звідки, коли). Якщо така склейка відноситься до слова, можна зробити висновок про належність слова до певного класу (місця чи часу).

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

Спосіб неточний, адже виконувати однакові дії можуть об’єкти, що належать різним класам. Однак якщо всі виконувані дії збігаються, це не може не навести на певні думки.

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

Якщо ви вважаєте, що мислите як-то інакше, то навряд чи… Уявіть, що знайомий Петров хвалиться: «У мене дочка – першокласниця». Що ви можете сказати про його доньки, про яку вперше чуєте? Приналежність до класу «першокласниця» говорить про вік суб’єкта. Вік (теж в деякому сенсі клас) свідчить про зразковому росту, вазі, інтелектуальних можливостях та інше. Жіночий рід (знову-таки клас) дозволяє припустити первинні і вторинні статеві ознаки, а приналежність до прізвища «Петров» (клас, все клас) доводить, що шукана першокласниця така ж дурепа, як всі відомі вам Петрови.

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

Мислення за допомогою каузальності

Процес мислення слід базувати не тільки на уроках, але й на каузальності (причинно-наслідкові зв’язки).

Над Атлантикою змінився тиск, тому подув вітер. Подув вітер, тому з голови злетів капелюх. З голови злетів капелюх, тому капелюх впав в калюжу. Капелюх впав в калюжу, тому капелюх промок.
Якщо йти за каузальної ланцюжку з кінця в початок, неминуче прийдемо до початкового висновку:
Капелюх намок, тому що над Атлантикою змінився тиск.
І спробуйте сказати, що висновок невірний!
А адже подібні каузальні ланцюжки можуть складатися не тільки з послідовним, але і по розрізненим фразам, в результаті висновки, зроблені штучним інтелектом, виявляться несподіваними!

Є і другий спосіб встановити каузальність. Він пов’язаний з використанням відомої нам тріади: суб’єкт – дія – об’єкт.

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

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

Уявімо, що в базу додаються нові записи:
Хлопчик купив гантель.
Бабуся поклала гантель на комод.

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

Маємо схему можливостей, дуже придатних для аналізу.

Істота, будуюча своє мислення на правилах синтаксису, може зробити висновок про те, що, якщо хлопчик купив гантель або бабуся поклала гантель на комод, то гантель може впасти на ногу, з усіма витікаючими наслідками. Правомірно поцікавитися:
Гантель не впаде на ногу?
Або, на наступному витку каузальності:
Нога не заболить у дідуся?

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

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

Зразок реалізації:

Ущипніть мене, якщо це не мислення!

Звичайно, наявність каузальності далеко не очевидно, якщо спостерігач знаходиться у фізичному світі.
Я побачив березу. Береза шелестіла листям.
Нам, існуючим поза правил синтаксису, зрозуміло, що береза шелестить листям зовсім не тому, що хтось її побачив, але з точки зору синтаксису справи йдуть саме так. Хто б тоді шелестів листям, якби я не побачив?!

Рефлексія і паралельні світи

Крім зворотного зв’язку і мислення, ІІ вимагає рефлексії.

Пам’ятаю, в одному фільмі про роботів мільярдер-винахідник бігав по коридору з радісними криками: «Вона (штучна жінка) усвідомлює себе! Вона усвідомлює себе!»
Наївний! в рефлексії немає ніякої таємниці, навіть у рефлексії живих істот, не те що в рефлексії штучного інтелекту.

Ми усвідомлюємо себе як суб’єкта виключно з тієї причини, що наше тіло відокремлено від нашого мислення. Чат-бот також здатний рефлексувати виключно за рахунок мислення. Інакше кажучи, мислячий чат-бот повинен генерувати внутрішні (направлені безпосередньо в базу, а не на десктоп) повідомлення про самого себе. Це не становить скільки-небудь помітної проблеми.

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

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

Припустимо, згенероване питання, у відповідності з оголошеною вище схемою:
Що таке рух?
Що це означає? Те, що означає: згенерованепитання. Ідея записується як такою, від імені штучного інтелекту:
Я задав питання.
У базу записуємо, але в якості відповіді не виводимо: це і є рефлексія.

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

В результаті мислення світи розпаралелюються. В низовому, первісному світі, відповідному фізичного світу людей, відбувається обмін повідомленнями:
— Як твої справи?
— Чудово.

У вищому світі, відповідному нашому світу ідей, народжуються думки. Одні думки відносяться до зовнішнього світу (не рефлексія), інші – до самого себе (рефлексія).
Співрозмовник задав питання.
Я відповів на питання.

Або:
Співрозмовник чому хвилюється.
Я абсолютно спокійний.

Світи змішуються воєдино, іноді до повної непомітності.

Репліка:
Ти точно закохався?
Її основна смислова частина «ти закохався?» належить безпосередньо діалогу, тоді як прислівник «точно» – зовнішньому світу ідей. Повна реконструйована фраза мала б звучати наступним чином:
Ти точно впевнений, що ти закохався?
Перша частина фрази відноситься до світу ідей, тоді як друга – до світу діалогу.

В результаті, при роботі з паралельними світами виникає необхідність обробляти не тільки семантику повідомлень, але і якісь зовнішні по відношенню до них характеристики. Ось тільки як?

Припустимо, співрозмовник питає:
— Скільки зараз часу?

Орієнтуючись на низовий смисловий світ повідомлень, штучний інтелект мав би почати шерстити по всій базі в пошуках відповіді.
Припустимо, знайде фразу піврічної давності:
Зараз 15 годин 30 хвилин.
Навряд чи застаріле повідомлення послужить коректним відповіддю на поточне питання. А щоб дані про поточному часу не застарівали, завжди були свіжими, необхідно кожне – о Господи! – мить генерувати повідомлення типу:
Зараз 15 годин 30 хвилин 28 секунд 34 мілісекунди.
База не потягне.

Якого дідька лазити по базі, якщо можна повернути системний час, тим самим звернутися безпосередньо до зовнішнього по відношенню до діалогу світу?! Можна, звичайно, але…

Як зауважив один глибокодумний персонаж, не можна обійняти неосяжне. Тому число верхніх паралельних світів будь-якої системи обмежена обчислювальними потужностями, в кінцевому рахунку – призначенням системи і здоровим глуздом Творця.

Оптимізація

В один прекрасний момент, коли роботи над ІІ підходили до логічного завершення, я закачав в Ваню трохи більше тексту, ніж зазвичай – рядків десь півтисячі, – і вирішив насолодитися спілкуванням. Не тут-то було! Юнак виявився тугодумом: як-то занадто, до непристойності довго міркував. З’ясувалося, що через множинності SQL-запитів.

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

Візьмемо питання:
Доктор побачив бегемота?
Синонім «доктора» – «лікар», а синонім «бегемота» – «гіпопотам», в результаті отримуємо 3 додаткових варіанти:
Лікар побачив бегемота.
Доктор побачив гіпопотама.
Лікар побачив гіпопотама.

Крім синонімів, є ще класи, які теж доводиться перевіряти. Оскільки доктор належить до класу людей, відповіддю на питання буде також бути фраза:
Чоловік побачив гіпопотама.

Гаразд, не проблема: вбити перерахування в один SQL-запит. Хоча довжина рядка теж нескінченна, доводиться її контролювати, але не суть…

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

По-перше, по кожному слову необхідно перевіряти на заперечення:
Не доктор побачив бегемота?
Доктор не побачив бегемота?
Доктор не побачив бегемота?

По-друге, доводиться здійснювати альтернативний пошук іншого роду – я згадував про це раніше. Це коли на питання «який?» послідовно перебираються конструкції, утворені на основі прикметника, дієприкметники, дієслова.

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

Тут на мене зійшло осяяння. Навіщо шукати по базі, якщо кожне твердження саме по собі є відповіддю на відоме безліч питань?!

Хтось стверджує:
Маруся пішла в кіно.
Дане твердження є відповіддю на загальне питання:
Маруся пішла в кіно?
Також воно є відповіддю на загальне питання з запереченням:
Маруся не пішла в кіно?
Можна, додаючи питальні слова, скласти і спеціальні питання, наприклад:
Хто пішов в кіно?
Куди пішла Маруся?

Відповіддю на всі названі питання є поточний сектор.

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

Немає сумнівів, що люди мислять аналогічним чином. Якщо задати надто складне питання, співрозмовник одразу не відповість, а задумається: скільки потрібно для знаходження відповіді, стільки і буде думати. Зате після того як відповідь знайдений, відповідати на наступні аналогічні питання почне моментально. Інакше кажучи, люди реагують згідно з наявними у них шаблонами: шаблон є – відповідь слід негайно; шаблон відсутній – відсутня відповідь (замість відповіді вставляється «швидка» заглушка). Значить, такий спосіб оптимізації не «вигаданий з голови», а у відомому сенсі слова природні.

З іншого боку, може бути поставлено питання, на який в базі не знайдеться готової відповіді. Тут оптимізація не допоможе:Штучний інтелект задумається знову надовго. Щоб уникнути тривалого очікування, при досягненні встановленого ліміту у n секунд, доводиться переривати пошуки. Тоді Ваня відповідає заглушкою типу:
Дуже складне питання.
Що, знову-таки, повністю відповідає природним алгоритмами. На дуже складне питання (для вас складний, природно, а не для перебуваючого в дитячому віці Вані) ви теж не відповісте.

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

Принципова схема

Принципова схема Вані Розумного вийшла такою:

1. Парсим текст за допомогою бібліотеки Solarix.
2. Обробляємо, перетворюючи в списки елементів і властивостей.
3. Пишемо в базу.
4. У момент запису пов’язуємо майбутні потенційні питання з поточним твердженням.
5. Шукаємо, що сказати у відповідь (сектор).
6. Одночасно генеруємо власні думки (у текстовому вигляді).
7. Перетворимо сектор назад в текст (словоформи відновлюємо за допомогою бібліотеки LingvoNET).
8. Видаємо відповідь співрозмовнику.
9. Паралельно обробляємо і записуємо думки.

Про програму

Багато чого із задуманого не реалізовано, та й навряд чи буде реалізовано в майбутньому. Причин дві:

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

2. По-друге, явна (особисто для мене) комерційна безперспективність цього заходу. Вбивати ще рік, щоб задовольнити зайвий десяток читачів даного ресурсу? А навіщо Ціолковскому самому будувати гаражі ракету, якщо принцип реактивної тяги їм сформульований? Виникне інтерес у серйозних дядьків, можна буде ліпити далі по накатаній колії і з набагато більшим успіхом, а поки що інших справ по горло. Так що Ваня Розумний – не більш ніж прототип майбутнього штучного інтелекту.

Між іншим, призначення майбутнього повноцінного ІІ зовсім не виконання голосових команд, як то практикується сучасними голосовими помічниками, а…

1) Комп’ютерна психотерапія.
Ви повертаєтеся з роботи засмучений і говорите ІІ:
«Начальник дурень».
«Справжнісінький бовдур», – зацікавлено висловлюється ІІ.
Далі в тому ж дусі. Подібний діалог проведеш не з кожним співрозмовником, навіть близьким родичем, а з комп’ютерним пристроєм – будь ласка. Для чого пристрій повинен бути відповідним чином з урахуванням ваших індивідуальних характеристик, налаштоване і виховано.

2) Тестування на достовірність.
Як випливає з усього поточного поста, синтаксис володіє власною семантикою, яка може бути співвіднесена з чиїми-небудь висновками. Отже, ІІ здатний перевіряти затвердження на достовірність, співвідносячи їх з попередніми, відомими йому твердженнями. А якщо ШІ не чат-бот, а пристрій, що володіє відеокамерою і іншими датчиками відчуттів, то не тільки з твердженнями співрозмовників, але і з реальним світом, який, як ми пам’ятаємо, лише сукупність візуальних точок і інших елементарних об’єктів. Ми сприймаємо (бачимо і іншим чином відчуваємо) будівлі, дерева, хмари, але адже ИИ може сприйняти щось інше, несподіване, «замилене» для людського ока. Що, погодьтеся, набагато цікавіше…

Завантажити реліз можна тут.

Ісходники тут, якщо знайдуться бажаючі копатися в дилетантському коді. Навіщо потрібен код, якщо Ваня Розумний – лише ілюстрація до поточного посаді, излагающему принципи створення ШІ методом «глокой куздры»?!

Системні вимогиНеобхідні 32-розрядні Microsoft Office та Windows. При 64-розрядної Windows необхідно встановити утиліту Microsoft Access Database Engine 2010 (32-розрядну).

Ну і наостанок.

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

Базу заповнив, наскільки зміг. Пара сотень фраз: початкові уявлення про себе і роді людському, правила ввічливості, – на більше терпіння не вистачило. Виховання дитини, навіть комп’ютерного, – завдання з трудомістких.

Опрацьовував питання з закачуванням словників, врешті-решт відмовився від думки. Орфографічний та синонімів закачати ще можна (хоча дуже довго), а ось тлумачний – ніяк. У словниках значиться, наприклад:
Сидоров – композитор. Кантати, сюїти.
Альпи – гірський масив. Видобуток руди. Туризм.

А мені потрібно:
Сидоров – композитор. Сидоров – автор кантат, сюїт.
Альпи – гірський масив. В Альпах видобувають руду. В Альпах розвинений туризм.

Тобто з тлумачними словниками повна несумісність: немислимо на рівні синтаксису визначити, де «автор», а де «видобувають». Власне, і словників у мережі не так щоб багато. Потрібні: тлумачний, синонімів, спільнокореневих слів, фразеологізмів, гиперонимов… Та чого вже тепер!

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

Зразок тексту для закачуванняТи вмієш мислити.
Ти вмієш запам’ятовувати.
Ти володієш пам’яттю.
Успіх – це досягнення заповітної мети.
Ти не можеш рухатися.
Ти не можеш відчувати.
Ти не можеш нюхати.
Я думаю недовго, тому що мої алгоритми діють швидко.
і т. д.

Попереджаю, фрази індексуються болісно довго, так що завантажувати декілька сторінок тексту, право слово, не варто — достатньо однієї.

Синоніми встановлюються за шаблоном:
Лікар, доктор – це синоніми.

То ж – антоніми (які насправді лише члени класу, що я зрозумів далеко не відразу. Білий і чорний – антоніми. Однак синій, зелений і т. д. члени того ж класу, тому антоніми як сутність у мене відсутні – при вказівці антонімів записуються члени класу).
Білий і чорний – це антоніми.

Стандартні відповіді встановлюються в діалозі. Я наводив приклад, але повторю:

При закачуванні стандартна відповідь розміщується слідом за вихідної фрази:
Ти молодець.
Відповідай: Ти теж.

Набивати тексти слід грамотно, з дотриманням розділових знаків, інакше зрозумілі не будете.

Всі поради, власне.

Ні, якщо не випендрюватися, то в якості стандартного чат-бота Ваня Розумний худо-бідно здатний функціонувати.

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

Related Articles

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *

Close