Artificial Intelligence Markup Language

 

 

AIML (Artificial Intelligence Markup Language) — язык разметки для искусственного интеллекта.

AIML — диалект XML для создания виртуальных собеседников.

Файл AIML — содержит набор категорий (category).

Категория открывается тегом <category> и закрывается тегом </category>.

Каждому тегу открытия должен соответствовать тег закрытия.

Категория(category) включает паттерны (pattern, обращения) и темплейты (template, ответные реплики).

Паттерн пишется ЗАГЛАВНЫМИ буквами.

Для определения произвольного слова или группы слов используется знак *

Примеры паттернов:

<pattern> ПРИВЕТ</pattern> 

<pattern> ПРИВЕТ *</pattern> 

<pattern> * ПРИВЕТ *</pattern> 

<pattern> * ПРИВЕТ</pattern> 

Паттерн 1 подойдет только для входящей реплики содержащей единственное слово «Привет» — и ни для какой другой.

Паттерн 2 подойдет только для входящей реплики, начинающейся со слова «Привет» и содержащей еще какие-нибудь слова после слова «Привет», например, «Привет Бот!».
Паттерн 3 подойдет только для входящей реплики, начинающейся с 1 или нескольких слов, за которым следует слово «Привет» и содержащей еще какие-нибудь слова после слова «Привет», например, «Эй ты привет красавчик!».

Паттерн 4 подойдет только для входящей реплики, начинающейся с 1 или нескольких слов, за которым следует слово «Привет», например, «Бот, привет!».

Темплейт может включать одну реплику, например:

<template> Добрый день!</template> 

Или несколько реплик. В этом случае необходимо использовать дополнительный тег <random>. Пример:

<template> 
<random> 
<li> Добрый день! </li> 
<li> Здравствуйте </li> 
<li> Приветик… </li> 
</random> 
</template> 

В этом случае в качестве ответной реплики будет произвольно выбрана одна из реплик, находящаяся между тегами <li> </li>.

Рандом можно комбинировать с обычной репликой. Например:

<template> 
<random> 
<li> Добрый день! </li> 
<li> Здравствуйте </li> 
<li> Приветик… </li> 
</random> 
Как дела?
</template> 

В этом случае бот ответит «Добрый день! Как дела?» или «Здравствуйте Как дела?» или «Приветик… Как дела?»
Итак, давай сделаем тупого бота который на любое предложение будет отвечать :" привет":

<category> 
<pattern> *</pattern> 
<template> привет</template> 
</category> 

 

 

Простые примеры

Самый простой пример:

<?xml version="1.0" encoding="UTF-8"?>
<aiml>
<category>
 <pattern>ПРИВЕТ</pattern>
 <template>
 <random>
 <li>приветик ...</li>
 <li>Здравствуйте!</li>
 </random>
 </template>
</category>
</aiml>

Бот сможет отвечать на слово "Привет" (независимо от регистра), произвольно выбирая в качестве варианта ответа либо "приветик ...", либо "Здравствуйте!".

На реплику "Привет, бот!" наш бот уже не ответит, так как в нашем примере паттерн определен только для слова "Привет". 

Для того, чтобы бот реагировал на любую реплику, которая начинается со слова "Привет", дополним наш пример следующей конструкцией:

<?xml version="1.0" encoding="UTF-8"?>
<aiml>
<category>
 <pattern>ПРИВЕТ</pattern>
 <template>
 <random>
 <li>приветик ...</li>
 <li>Здравствуйте!</li>
 </random>
 </template>
</category>

<category>
 <pattern>ПРИВЕТ *</pattern>
 <template><srai>ПРИВЕТ</srai></template>
</category>

</aiml>

Вторая категория (<pattern>ПРИВЕТ *</pattern>) соответствует любой строке, которая начинается со слова "привет" и отправляет бота к категории "ПРИВЕТ" с помощью конструкции <srai>ПРИВЕТ</srai>.

Таким образом, теперь, на реплику "Привет, бот!" наш бот ответит либо "приветик ...", либо "Здравствуйте!".

 

 

 

Обрезаем слова - паразиты

Разговорная речь, как правило, содержит некоторое количество т.н. слов-паразитов, которые человеческий мозг воспринимает без проблем, в то время как для мозга бота, написанного на AIML, такие слова могут стать серьезной проблемой.

Рассмотрим следующий пример.

Собеседник интересуется возрастом бота и задает вопрос: Сколько тебе лет? Для ответа на этот вопрос мы используем следующую конструкцию:

<category>
<pattern>СКОЛЬКО ТЕБЕ ЛЕТ</pattern>
<template> Больше, чем ты думаешь! </template>
</category>

Теперь если собеседник спросит: Сколько тебе лет? наш бот непринужденно ответит: Больше, чем ты думаешь!
Но что будет если собеседник решит показаться более общительным и начнет свой вопрос с многозначительного И, вот так:
И сколько тебе лет?
или, еще красноречивее:
Ну, и сколько тебе лет?

Для нашего AIML-бота такой вопрос станет проблемой и он не сможет на него ответить, т.к. паттерн определен точно для фразы "СКОЛЬКО ТЕБЕ ЛЕТ".
Выходом из данной ситуации может стать добавление конструкции:

<category>
<pattern>_ СКОЛЬКО ТЕБЕ ЛЕТ</pattern>
<template><srai>СКОЛЬКО ТЕБЕ ЛЕТ</srai></template>
</category>

В этом случае, на любой вопрос, который заканчивается словами "СКОЛЬКО ТЕБЕ ЛЕТ", в том числе и "Ну, и сколько тебе лет?" бот будет исправно отвечать "Больше, чем ты думаешь!".
Казалось бы, на этом можно остановиться. Но проблема в том, что наши общительные собеседники слишком часто начинают свои реплики с многозначительного "Ну", "И", или, еще хуже "Ну и ...". Дополнять каждую конструкцию дополнительным паттерном для отсечения этих слов-паразитов слишком трудоемко. Поэтому гораздо проще сразу "обрезать" эти слова, как будто их просто не было:

<category>
<pattern>НУ *</pattern>
<template><sr/></template>
</category>

<category>
<pattern>И *</pattern>
<template><sr/></template>
</category>

<category>
<pattern>СКОЛЬКО ТЕБЕ ЛЕТ</pattern>
<template> Больше, чем ты думаешь! </template>
</category>

Теперь, даже если фраза собеседника начинается с "Ну", "И", "Ну и" бот не будет обращать на это внимания, сосредотачиваясь непосредственно на самой фразе.
Рассмотренный способ подходит и для обрезания имени бота. Предположим, нашего бота зовут Алиса. Многие собеседники предпочитают обращаться к боту по имени: Алиса, сколько тебе лет? или Алиса, как твои дела?. Для корректной обработки данных паттернов используем уже знакомую конструкцию:

<category>
<pattern>АЛИСА *</pattern>
<template><sr/></template>
</category>

<category>
<pattern>НУ *</pattern>
<template><sr/></template>
</category>

<category>
<pattern>И *</pattern>
<template><sr/></template>
</category>

<category>
<pattern>СКОЛЬКО ТЕБЕ ЛЕТ</pattern>
<template> Больше, чем ты думаешь! </template>
</category>

<category>
<pattern>КАК ДЕЛА</pattern>
<template> Все ок! </template>
</category>

 

 

Особенности русского языка

В английском языке фиксированный порядок слов, сначала подлежащее, потом сказумемое и т.д. 
Все возможные варианты фразы "Мама мыла раму" умещаются в 2 шаблона (или мама раму или рама маму):

A mother washed a (by/that/this) frame
A frame washed a (by/that/this) mother

т.е. так: 
 


CODE: SELECT ALL
<category>
 <pattern>* mother washed * frame</pattern>
 <template>A cleanness brings a health</template>
</category>

<category>
 <pattern>* frame washed * mother </pattern>
 <template>A cleanness brings a health</template>
</category>

 

Сказать эту фразу по-другому никому в голову не придет.


Ну к русскому языку это ж принципиально не подходит! У нас какой хошь порядок слов, причем слова могут иметь какие угодно префиксы и флексии. 


Допустим имеется фразы: 
"Мама мыла раму"
"Мама раму мыла"
"Мыла раму мама"
"Мыла мама раму"
"Раму мыла мама"
"Раму мама мыла"
А можно еще "Мамочка мыла рамочку" и тогда вообще вариантов становится .... много.

И мы хотим обучить бота отвечать на них: 
"Чистота - залог здоровья"
 

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

В AIML средства, позволяющие обрабатывать такие конструкции, очень неудобны и  делать бота на этом языке трудоемко и сложно.

 

 

Игорь Ашманов про AIML

Игорь Ашманов:

«Речь и текст станут основным каналом общения с компьютерами и бытовыми устройствами»

29 Июля 2013

 

В 2001 году был довольно популярен «Элис» (A.L.I.C.E.), созданный американским профессором Ричардом Уоллесом (и названный, очевидно, в честь Элизы Вейценбаума).

A.L.I.C.E. была open-source-проектом и написана на специальном диалекте XML – языке диалогов AIML (Artificial Intelligence Markup Language). Поскольку A.L.I.C.E. находился в открытом доступе, я попросил ребят-лингвистов из своей команды попытаться построить своих виртуальных собеседников на нём.

Мы не стали использовать программное обеспечение «Алисы», разработали наскоро своё.

Кроме того, нам крайне не понравился язык AIML, потому что он был неочевиден, сложен, перегружен синтаксисом тегов XML и служил источником трудностей для лингвистов и генератором трудноуловимых ошибок.

Мы сделали некий свой более простой и прозрачный диалект с трансляцией в AIML, а потом просто придумали новый язык диалогов без наследия XML и AIML.

В итоге меньше чем за два месяца наши разработчики сделали несколько виртуальных собеседников – в том числе малообразованную, но активную девушку лет 16, которая могла бойко поддерживать разговор, в основном на темы в рамках повседневного общения. Эффект «очеловечивания» программы сработал и здесь – люди легко принимали правила игры и общались с нашей героиней, как с живой.

 


 

У "инфов" Наносемантики Игоря Ашманова (http://help.iii.ru/) есть язык шаблонов.

Знак ~ обозначает любое окончание или начало слова, * любое слово, {///} словарь синонимов, а <////> наличие или отсутствие слов. 

Все варианты с мамой и рамой можно так же записать парой шаблонов:
* мам~ * {мыл~/чист~/терл~} * рам~ * <!/?/.>
и
* мам~ * {мыл~/чист~/терл~} * рам~ * <!/?/.>

И тогда на как не склоняй эту фразу, например: "
Стиснув зубы, кряхтя и надрываясь, - моя милая мамочка продолжала тереть эту ужасную раму, а между тем - пот тек с её лба" - бот все равно поймет правильно