Обучение инфа

 

КАК НАУЧИТЬ ИНФА ОТВЕЧАТЬ НА ЛЮБУЮ ФРАЗУ, СОДЕРЖАЩУЮ ЗАДАННОЕ СЛОВО ИЛИ СЛОВА

КАК НАУЧИТЬ ИНФА ПОНИМАТЬ ЗАДАННОЕ СЛОВО В ЛЮБЫХ ФОРМАХ

КАК НАУЧИТЬ ИНФА РАЗЛИЧАТЬ ПОЛ СОБЕСЕДНИКА, ОПРЕДЕЛЯТЬ ВРЕМЯ, ЛИЦО И ДРУГИЕ ГРАММАТИЧЕСКИЕ КАТЕГОРИИ В ЕГО РЕПЛИКАХ 

КАК ПРИ ПОМОЩИ ИНЛАЙН-СЛОВАРЕЙ РАЗНООБРАЗИТЬ ОТВЕТЫ ИНФА

КАК СДЕЛАТЬ, ЧТОБЫ ОТВЕТЫ ИНФА НЕ ПОВТОРЯЛИСЬ ИЛИ ПОВТОРЯЛИСЬ РЕДКО

КАК ПРИ ПОМОЩИ ИНЛАЙН-СЛОВАРЕЙ ПРЕДУСМОТРЕТЬ НАИБОЛЬШЕЕ ЧИСЛО ВАРИАНТОВ РЕПЛИК СОБЕСЕДНИКА

КАК ИСПОЛЬЗОВАТЬ ПРИ РАЗРАБОТКЕ ШАБЛОНОВ УЖЕ ГОТОВЫЕ СЛОВАРИ

КАК ИСПОЛЬЗОВАТЬ В ОТВЕТАХ ИНФА ОТКРЫВАЮЩИЕ КВАДРАТНЫЕ И ФИГУРНЫЕ СКОБКИ В КАЧЕСТВЕ ОБЫЧНЫХ СИМВОЛОВ

КАК НАЧИНАТЬ НОВУЮ ФРАЗУ ВНУТРИ ОТВЕТА С КРАСНОЙ СТРОКИ

КАК НАУЧИТЬ ИНФА ЗАПОМИНАТЬ ТЕМУ РАЗГОВОРА С ПОМОЩЬЮ ЯКОРЯ

КАК ЗАПОМИНАТЬ ИНФОРМАЦИЮ О СОБЕСЕДНИКЕ И ИСПОЛЬЗОВАТЬ ЕЕ В ОТВЕТАХ С ПОМОЩЬЮ ПЕРЕМЕННЫХ

КАК ПРОВЕРИТЬ ЗНАЧЕНИЕ ПЕРЕМЕННОЙ И ВЫБРАТЬ ОТВЕТ ПРИ ПОМОЩИ УСЛОВНОГО ОПЕРАТОРА

КАК ВСТАВИТЬ ЧАСТЬ ЗАПРОСА СОБЕСЕДНИКА В ОТВЕТ ИНФА

КАК СРАВНИТЬ НОВЫЕ ДАННЫЕ ИЗ ЗАПРОСА СОБЕСЕДНИКА С УЖЕ ИМЕЮЩИМИСЯ ДАННЫМИ

КАК В ОТВЕТЕ ИНФА ПОКАЗАТЬ ТОЧНОЕ ВРЕМЯ, ДАТУ ИЛИ ДЕНЬ НЕДЕЛИ

КАК ОПРЕДЕЛИТЬ, КАКОЙ ИЗ ШАБЛОНОВ СРАБОТАЕТ В ОТВЕТ НА ТОТ ИЛИ ИНОЙ ЗАПРОС

КАК УЧЕСТЬ В ШАБЛОНЕ ВОЗМОЖНЫЕ ОШИБКИ И ОПЕЧАТКИ СОБЕСЕДНИКА

 

КАК НАУЧИТЬ ИНФА ОТВЕЧАТЬ НА ЛЮБУЮ ФРАЗУ, СОДЕРЖАЩУЮ ЗАДАННОЕ СЛОВО ИЛИ СЛОВА

Допустим, вы хотите, чтобы на любой вопрос или фразу, содержащую слово «самолет», инф отвечал: «Только в полете живет человек».

Для этого проставляете символ «*» в тех местах шаблона, где могут стоять любые произвольные слова собеседника. Например:

 

Инфу говорят:

$ * самолет *

Инф отвечает:

# Только в полете живет человек.

 

Такой шаблон сработает на фразах «самолет», «Отличная фотка: самолет и ты», «Классный самолет у тебя на сайте выставлен» и даже «Надоел твой самолет, блин». В ответ на каждую из этих фраз инф скажет: «Только в полете живет человек».

 

 

КАК НАУЧИТЬ ИНФА ПОНИМАТЬ ЗАДАННОЕ СЛОВО В ЛЮБЫХ ФОРМАХ

Вы можете заменить окончание слова тильдой – символом ~. Например: «самолет~». Такая запись будет эквивалентна записям «самолета», «самолеты», «самолету» и т.д. Выглядеть это будет так:

 

Инфу говорят:

$ * самолет~ *

Инф отвечает:

# Только в полете живет человек.

 

Теперь инф будет выдавать ответ «Только в полете живет человек» не только на все фразы из предыдущего примера, но и на реплики «Обожаю самолеты», «А где твоя фотка с самолетом?» и т.п.

Важно помнить, что тильда – сильный инструмент, с которым надо быть осторожным. В реплике собеседника она сработает не только на грамматических окончаниях слова, но и на любой части слова после заданной в шаблоне основы. Тильда из нашего примера (самолет~) сработает не только на всевозможных формах слова «самолет», но и на родственных словах: «самолетный», «самолетик», «самолетостроение»… Встречаются и такие слова, начала которых совпадают, но это не делает их однокоренными. Например, «стол~» может означать не только различные формы слова «стол», но и «столовая», «столица», «столько» и т.д.

 

КАК НАУЧИТЬ ИНФА РАЗЛИЧАТЬ ПОЛ СОБЕСЕДНИКА, ОПРЕДЕЛЯТЬ ВРЕМЯ, ЛИЦО И ДРУГИЕ ГРАММАТИЧЕСКИЕ КАТЕГОРИИ В ЕГО РЕПЛИКАХ

Можно использовать тильду не только в конце, но и в начале слова.

 

Например:

~вый/~ный

 

Такая запись будет эквивалентна записям «толковый», «умный», «ученый», «красивый», «задорный»… Это поможет определить пол собеседника, чтобы потом использовать эту информацию в ответах инфа:

 

$ я {~вый/~ный}

# Да, ты такой. [%user_gender=»1″]

 

$ я {~вая/~ная}

# Да, ты такая. [%user_gender=»2″]

 

$ {ну/—} как я тебе?

# [if(%user_gender=»1″)]{Ты клевый!}

# [if(%user_gender=»2″)]{Ты клевая!}

# [if(!%user_gender)]{Ну ничего так.}

 

В диалоге это будет выглядеть так:

 

Собеседник: Я красивый.

Инф: Да, ты такой.

Собеседник: Как я тебе?

Инф: Ты клевый!

 

То же самое с глаголами. Скажем, можно заменить тильдой начало глагола: «~ишься». Такая запись будет эквивалентна словоформам «боишься», «стремишься», «учишься»…

Следует очень осторожно использовать тильду в начале. Ведь у такого шаблона:

 

$ я {~ный/~вый}

 

будет одинаковый приоритет, например, с шаблоном

 

$ я умный

 

потому что они одинаковой длины и без звездочек. А значит, ответ на фразу собеседника «Я умный» будет выбираться случайным образом из этих двух шаблонов.

 

Ограничения:

 

В одном слове нельзя одновременно использовать тильду в начале и в конце. Такой шаблон (например, «~а~») не сработает.

 

 

КАК ПРИ ПОМОЩИ ИНЛАЙН-СЛОВАРЕЙ РАЗНООБРАЗИТЬ ОТВЕТЫ ИНФА

Сделать реплики инфа разнообразными можно за счет использования синонимов, то есть слов или целых фраз с равноценным, эквивалентным значением.

Эквивалентные слова или фразы надо записать в фигурных скобках, разделив варианты символом «. Такая запись называется инлайн-словарем.

Вот как будет выглядеть такой шаблон:

 

Инфу говорят:

$ Сколько тебе лет?

Инф отвечает:

# {Увы/К сожалению/Извините}, но {дам о возрасте не спрашивают/это секретная информация/я и сама не помню}.

 

В ответ на реплику «Сколько тебе лет?» инф случайным образом соберет один из девяти возможных здесь вариантов ответа. Вы можете использовать в ответе несколько наборов синонимов и довести количество возможных вариантов ответа до многих тысяч.

Можно добавить в инлайн-словарь и пустой вариант ответа. Для этого в нужном месте поставьте два дефиса: «—».

 

Инфу говорят:

$ Сколько тебе лет?

Инф отвечает:

# {Увы/К сожалению/Извините}, но {дам о возрасте не спрашивают/это секретная информация/я и сама не помню}. {Спросите меня в другой раз./—}

 

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

 

Возможности:

Ответы инфа будут выглядеть более разнообразными, если у них разное начало и разные схемы высказывания: простая подстановка синонимов в одну и ту же фразу рано или поздно становится заметна. Поэтому лучше сразу подготовить несколько разных вариантов ответов, а синонимы варьировать с самого начала фразы.

 

Ограничения:

  1. В Предустановленных темах инлайн-словари не работают.
  2. В инлайн-словарях нельзя использовать переменные (см. раздел «Как запоминать информацию о собеседнике и использовать ее в ответах с помощью переменных»).

 

 

КАК СДЕЛАТЬ, ЧТОБЫ ОТВЕТЫ ИНФА НЕ ПОВТОРЯЛИСЬ ИЛИ ПОВТОРЯЛИСЬ РЕДКО

В одном шаблоне может быть несколько ответов, и выбор между ними будет произвольным. А что если собеседник скажет одну и ту же или похожую фразу несколько раз?

Например, у нас есть шаблон следующего содержания:

 

$ * ты {хорош~/мил~/славн~/умн~/молодец} {!/—}

# Я польщен.

# Хвалите меня, хвалите!

# Я тоже так думаю.

 

Из-за свободного выбора между ответами мы можем получить такой диалог:

 

Собеседник: Ты милый!

Инф: Я польщен.

Собеседник: Ты славный!

Инф: Я польщен.

Собеседник: Ты молодец!

Инф: Я польщен.

 

Чтобы этого избежать, нужно использовать модификаторы.

Ответ с модификатором uniq (сокращенно u) будет сгенерирован только один раз за все общение инфа с данным гостем.

 

$ * повторяешься *

#:u: Не всегда. Смотри, этот ответ ты увидишь только один раз за все наше общение с тобой. Можешь проверить

 

Получаем:

Собеседник: Ты повторяешься.

Инф: Не всегда. Смотри, этот ответ ты увидишь только один раз за все наше общение с тобой. Можешь проверить.

 

Ответ с модификатором luniq (сокращенно lu) будет использован повторно только после того, как в его шаблоне будут использованы по одному разу все остальные ответы, отмеченные модификаторами uniq или luniq. Добавим его в пример, приведенный в начале:

$ * ты {хорош~/мил~/славн~/умн~/молодец} {!/—}

#:lu:  Я польщен.

#:lu:  Хвалите меня, хвалите!

#:lu:   Я тоже так думаю.

 

Получим примерно следующее:

 

Собеседник: Ты милый!

Инф: Я тоже так думаю.

Собеседник: Ты славный!

Инф: Я польщен.

Собеседник: Ты молодец!

Инф: Хвалите меня, хвалите!

 

Кроме того, ответам с модификатором luniq может быть присвоен частичный вес – тогда они будут выбираться не в произвольном порядке, а в том, который будет им задан.

Частичный вес ответа представляется числом от -500 до +500 и по умолчанию равен нулю. При построении ответа среди шаблонов с одинаковым весом ответы выбираются по порядку, заданному частичным весом – от большего к меньшему. Ответы могут иметь и одинаковый частичный вес, тогда выбор между ними будет производиться произвольно.

 

Например:

$ * загадай * загадку *

# :lu: Без окон, без дверей – полна горница людей.

# :lu: Не лает, не кусает – а в дом не пускает.

# :lu:-1: Все, я больше не знаю загадок.

# :lu:-2: Я честно-честно кроме тех двух больше ни одной не знаю.

 

Получаем диалог:

 

Собеседник: Загадай мне загадку!

Инф: Без окон, без дверей – полна горница людей.

Собеседник: Это огурец. Загадай еще одну загадку.

Инф: Не лает, не кусает – а в дом не пускает.

Собеседник: Это я не знаю, что такое, – загадай другую загадку.

Инф: Все, я больше не знаю загадок.

Собеседник: Да ладно тебе, загадай загадку.

Инф: Я честно-честно кроме тех двух больше ни одной не знаю.

Собеседник: И все-таки загадай загадку.

Инф: Не лает, не кусает – а в дом не пускает.

И так далее.

Ответ с модификатором :last: будет сгенерирован, только если не получилось сгенерировать ответ без такого модификатора во всех равновесных шаблонах.

Например, шаблон про загадки можно модифицировать так:

$ * загадай * загадку *

# :u: Без окон, без дверей – полна горница людей.

# :u: Не лает, не кусает – а в дом не пускает.

# :last: Все, я больше не знаю загадок.

# :last: Давай оставим в покое загадки и поговорим о чем-нибудь другом.

 

Теперь получится, что инф, загадав две загадки, на третью и все последующие просьбы загадать загадку будет выдавать ответы с last.

Другой пример:

 

$ что * знаешь обо мне *

# [if(%user_name)] {Я знаю, что тебя зовут [%user_name].}

# [if(%user_age)] {Я знаю, что тебе [%user_age].}

# :last: Я пока ничего о тебе не знаю. Расскажи о себе немного.

 

Можем получить следующие диалоги:

 

1.Собеседник: меня зовут Вася.

   Инф: Приятно познакомиться, Вася.

Собеседник: Что ты знаешь обо мне?

Инф: Я знаю, что тебя зовут Вася.

 

  1. Собеседник: Мне 15 лет.

   Инф: А я моложе тебя.

Собеседник: Что ты знаешь обо мне?

Инф: Я знаю, что тебе 15 лет.

 

  1. Собеседник: Что ты знаешь обо мне?

   Инф: Я пока ничего о тебе не знаю. Расскажи о себе немного.

 

Ограничения:

  • Модификаторы работают только в разделе Шаблоны. Они не работают в разделе Темы.
  • Одновременное использование в одном шаблоне-ответе модификаторов last и luniq не допускается.

 

КАК ПРИ ПОМОЩИ ИНЛАЙН-СЛОВАРЕЙ ПРЕДУСМОТРЕТЬ НАИБОЛЬШЕЕ ЧИСЛО ВАРИАНТОВ РЕПЛИК СОБЕСЕДНИКА

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

Например, собеседник может похвалить инфа разными способами:

 

Ты хороший.

Сегодня ты милый.

Ты славный.

А ты умный.

Ты молодец.

 

На все эти реплики инф может отвечать одной фразой: «Спасибо, люблю комплименты».

Оформить такой шаблон можно двумя способами.

 

  1. Все варианты реплики, обращенной к инфу, записываются в одной строчке раздела Инфу говорят и разделяются двумя вертикальными чертами (||)

Например:

 

Инфу говорят:

$ Ты хороший.||Сегодня ты милый.||Ты славный.||А ты умный.||Ты молодец.

Инф отвечает:

# {Спасибо/Благодарю/Спасибо на добром слове}! {Люблю комплименты!/Я смущаюсь…/Я и правда такой.}

 

Допустимо использовать в вопросе символ любого слова «*» и тильду, заменяющую окончание (~):

 

Инфу говорят:

$ * ты хорош~|| * ты мил~||*ты славн~||*ты умн~||* ты молодец

 

  1. Для записи вариантов реплики собеседника используются инлайн-словари:

 

Инфу говорят:

$ * ты {хорош~/мил~/славн~/умн~/молодец} {!/—}

 

Запись с пустым вариантом ответа предусматривает запрос как с восклицательным знаком в конце, так и без него.

Можно использовать инлайн-словари и в записи вариантов шаблона через «||»:

 

Инфу говорят:

$ * ты {хорош~/мил~/славн~/умн~/молодец}<!> || {умнич~/умниц~/молодчин~/молодец} <!>

 

Ограничения:

В предустановленных темах инлайн-словари не работают.

 

КАК ИСПОЛЬЗОВАТЬ ПРИ РАЗРАБОТКЕ ШАБЛОНОВ УЖЕ ГОТОВЫЕ СЛОВАРИ

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

Предустановленные словари представляют собой списки слов, которые могут быть объединены тематикой, функцией в предложении/диалоге и т.п. Свойства в них заложены такие же, как и в уже существующих инлайн-словарях. Разница в том, что инлайн-словарь в шаблоне автор инфа должен придумать сам, а предустановленный словарь уже составлен, выверен лингвистами и готов к использованию.

Пока что для использования открыты восемь предустановленных словарей:

 

Название словаря Описание словаря
da Содержит варианты выражения согласия: «да», «ага», «точно», «согласен», «согласна» и т.п.
net Содержит варианты выражения согласия: «нет», «не-а», «ни за что»…
chto В этом словаре собраны разные варианты написания слова «что»: «что», «чо», «шо», «че», «чё», «чего», «чиво»…
grubo Словарь включает в себя различные грубые слова: «придурок», «идиот», «козел» и т.д.
mat В этот словарь входит матерная лексика. Извините, примеров не будет.
masha В этот словарь входят женские имена в именительном падеже. Например: «Мария», «Маша», «Машенька» и т.п.
pasha В этот словарь входят мужские имена в именительном падеже. Например: «Алексей», «Леша», «Леха» и т.д.
sasha В этот словарь входят имена в именительном падеже, которые могут быть как мужскими, так и женскими. Например: «Саша», «Сашка», «Шура»…

 

Вот так выглядит шаблон, в котором используется словарь:

 

$ * [dict(chto)]?

# Уже неважно.

 

В тексте шаблона команда обращения к словарю [dict(имя_словаря)] обрамляется квадратными скобками, а имя словаря – в нашем примере это chto – заключается в круглые.

Предустановленные словари позволяют ускорить написание шаблонов. Они рассчитаны на типовые ситуации и экономят время авторам инфов.

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

Допустим, мы хотим поддержать диалог про чай матэ. Создаем исходный шаблон дерева:

 

$ *

# Ты любишь мате?

 

Приписываем к нему якорь «любишь мате?»

Дальше мы начинаем прописывать все ветки этого дерева:

 

Якорь: Ты любишь мате?

$ *[dict(da)]*

# Я тоже люблю.

 

Якорь: Ты любишь мате?

$ *[dict(net)]*

# Ну и зря. Отличный чай.

 

Якорь: Ты любишь мате?

$ *[dict(chto)] это *

# Это такой чай. Его пьют из специальных круглых сосудов – калабасов.

 

Якорь: Ты любишь мате?

$ * мате [dict(mat)] *

# Не обзывай чай, он этого не заслужил.

 

Или, например, пользователь называет инфу свое имя. С помощью словарей имен это имя легко запомнить.

Допустим, у инфа есть такие шаблоны:

 

$ * я [-[dict(masha)]-]*

#Приятно познакомиться, [&1]. [%user_name=»[&1]»]

 

$ * как * {меня/миня} * {зовут/завут/звать} *

#[if(%user_name)]{Тебя зовут [%user_name].}

 

Вот как эти шаблоны могут сработать в разговоре:

 

Собеседник: А я Лена.

Инф: Приятно познакомиться, Лена.

Собеседник: Как меня зовут?

Инф: Тебя зовут Лена.

 

 

КАК ИСПОЛЬЗОВАТЬ В ОТВЕТАХ ИНФА ОТКРЫВАЮЩИЕ КВАДРАТНЫЕ И ФИГУРНЫЕ СКОБКИ В КАЧЕСТВЕ ОБЫЧНЫХ СИМВОЛОВ

Мы уже знаем, что при оформлении словарей активно используются квадратные и фигурные скобки. Но что если мы, работая в разделе Шаблоны, хотим воспользоваться квадратными или фигурными скобками как обычными знаками препинания?

В этом случае, чтобы не сбить с толку программу, нужно предварять открывающие квадратные и фигурные скобки символом «\».

Мы ставим его всегда перед следующими тремя символами:

 

[

{

\

 

Например, вы хотите, чтобы ответ инфа при запросе собеседника «знаки препинания» выглядел вот так:

Люблю {фигурные} и [квадратные] скобки и ненавижу символ \

 

Тогда в шаблоне вы должны написать следующее:

 

$ * знаки препинания *

# Люблю \{фигурные} и \[квадратные] скобки и ненавижу символ \\

 

Перед символами (, ), }, ], /, >, %, &, $, #, @, ‘, *, +, =, » и др. символ \ в ответах вставлять не нужно.

 

Ограничения:

 

Символ «<», а значит и угловые скобки, в ответе использовать нельзя – ни в разделе Шаблоны, ни в разделе Темы).

 

 

КАК НАЧИНАТЬ НОВУЮ ФРАЗУ ВНУТРИ ОТВЕТА С КРАСНОЙ СТРОКИ

Чтобы внутри ответа в шаблоне новая фраза начиналась с красной строки, просто нажмите перед этой фразой Enter. Либо, если вам так удобней, используйте тег <br>. Например, шаблон может выглядеть так:

 

$ Расскажи анекдот

# Про рассеянных профессоров: <br>– Профессор, почему вы ходите с дырявым зонтиком? <br>– О, это мое последнее изобретение. Я специально проделал дырки в зонтике, чтобы сразу определить, когда дождь кончился.

 

Ответ инфа будет разбит на отдельные строки в тех местах, где вы поставили тег <br>.

Таким образом, собеседник увидит следующее:

 

Про рассеянных профессоров:

– Профессор, почему вы ходите с дырявым зонтиком?

– О, это мое последнее изобретение. Я специально проделал дырки в зонтике, чтобы сразу определить, когда дождь кончился.

 

 

КАК НАУЧИТЬ ИНФА ЗАПОМИНАТЬ ТЕМУ РАЗГОВОРА С ПОМОЩЬЮ ЯКОРЯ

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

Пока что мы в обучении инфа ограничивались одной парой «вопрос-ответ». Но этого мало, так как не получается предусмотреть более или менее связный диалог на несколько шагов вперед.

Представим такой диалог:

 

Собеседник: У тебя там телевизор есть?

Инф: Да я, считай, в нем живу :). Любишь телик смотреть?

 

Далее последует реакция собеседника. Он может ответить «Да, люблю» или «Нет, не люблю», и каждая из этих ситуаций предполагает разные реакции инфа.

Вот одно возможное продолжение диалога:

 

Собеседник: Да, люблю.

Инф: Ага. Особенно комедии на ТНТ мне нравятся. Они там идут каждый вечер.

 

А вот другое возможное продолжение:

 

Собеседник: Нет, не люблю.

Инф: Ну и правильно. Сплошная жвачка для мозгов. Хотя комедии иногда смотрю.

 

Обычные шаблоны типа:

 

Инфу говорят:

$ *да *

Инф отвечает:

# Ага. Особенно комедии на ТНТ мне нравятся. Они там идут каждый вечер.

 

здесь не помогут, так как «да» может быть сказано собеседником в совершенно разных речевых ситуациях и каждый раз отвечать про комедии на ТНТ будет неправильно.

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

Как это можно сделать?

 

  1. Назначаем якорь.

 

Вначале нужен шаблон, который будет исходным в связанном диалоге:

 

Инфу говорят:

* У тебя * телевизор есть <?>

Инф отвечает:

Да я, считай, в нем живу:) . Любишь телик смотреть?

 

Вы можете создать новый шаблон, а можете использовать какой-то из старых как исходную точку для работы с якорями. В процессе создания и редактирования шаблона вам нужно завести якорь и назначить его этому шаблону. Это можно сделать с помощью ниспадающего меню рядом с изображением якоря. По умолчанию якорь отсутствует (в меню выбран пункт Без якоря). Для создания якоря надо выбрать в меню пункт Новый якорь.

pic1

Тогда откроется новое окошко, в котором вам будет предложено ввести название этого якоря. В нашем примере его можно назвать телевизор.

pic2

Теперь в списке Шаблоны у этого шаблона рядом с ответом отображается значок якоря и рядом с этим значком – название якоря. Вот как это выглядит:

pic3

  1. Создаем шаблоны, привязанные к якорю.

 

Теперь нужно создать шаблоны, привязанные к реплике, которой был назначен якорь «телевизор». Для этого нажимаем на значок «+» рядом с названием якоря в ответе инфа. Создаем шаблон для первого варианта продолжения разговора:

 

Инфу говорят:

$ * да *

Инф отвечает:

# Ага. Особенно комедии на ТНТ мне нравятся. Они там идут каждый вечер.

pic4

В этом шаблоне указано, что он связан с якорем телевизор. Об этом говорит значок и название якоря в начале формы шаблона.

pic5

 

Точно таким же способом добавляем шаблон для второго варианта продолжения разговора про телевидение:

 

Инфу говорят:

$ * нет *

Инф отвечает:

# Ну и правильно. Сплошная жвачка для мозгов. Хотя комедии иногда смотрю.

 

После сохранения у каждого из этих шаблонов появляется метка в виде значка якоря и названия этого якоря. Если вы хотите увидеть все свои шаблоны, в которых задействован тот или иной якорь, вам надо найти это название в списке Фильтров по якорям справа от шаблонов и нажать на него.

pic6

 

Оснащенный якорями инф сможет поддерживать связные диалоги.

Попробуйте построить несколько веток диалога с использованием якорей – и увидите, как интеллект вашего инфа растет буквально на глазах!

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

Чтобы удержать собеседника в диалоге, прицепляйте к якорю шаблон «*», ведь создать шаблоны на все возможные варианты ответов собеседника практически невозможно. Пример работы такого шаблона для якоря «телевизор»:

 

Инфу говорят:

$ *

Инф отвечает:

# Телевизор – это зло.

 

Сработает это так:

 

Собеседник: У тебя там телевизор есть?

Инф: Да я, считай, в нем живу :) Любишь телик смотреть?

Собеседник: Там вообще ничего стоящего не показывают.

Инф: Телевизор – это зло.

 

Минус использования шаблона «*», привязанного к якорю: собеседник может задать вопрос по какой-нибудь другой теме, но из-за этого шаблона ответ будет относиться к предыдущей теме.

Пример такого неудачного диалога:

 

Собеседник: У тебя там телевизор есть?

Инф: Да я, считай, в нем живу :) Любишь телик смотреть?

Собеседник: Как тебя зовут?

Инф: Телевизор – это зло.

 

Возможности:

 

Якоря можно применять в разделах Шаблоны и Темы.

 

Ограничения:

 

В разделе Реакции якорем пользоваться нельзя.

 

 

КАК ЗАПОМИНАТЬ ИНФОРМАЦИЮ О СОБЕСЕДНИКЕ И ИСПОЛЬЗОВАТЬ ЕЕ В ОТВЕТАХ С ПОМОЩЬЮ ПЕРЕМЕННЫХ

 

Вы можете обучить своего инфа запоминать различную информацию и потом использовать ее в разговоре.

Например, инф может запомнить имя собеседника и впоследствии обращаться к нему по имени. Для этого предназначены переменные.

С помощью переменных можно хранить знания о собеседниках или любую другую текстовую информацию. При написании шаблонов можно использовать 13 переменных с заранее заданным целевым назначением и 100 свободных переменных, которые автор инфа может использовать по своему усмотрению.

Срок жизни переменных с заданным целевым назначением не ограничен – их значения запоминаются и хранятся между отдельными разговорами.

К переменным с заданным назначением относятся:

 

%user_name – предназначена для хранения имени собеседника;

%user_gender – предназначена для хранения информации о поле собеседника;

%user_zodiac – предназначена для хранения информации о знаке зодиака собеседника;

%user_age – предназначена для хранения информации о возрасте собеседника;

переменные вида user_X (предназначены для хранения любых других сведений о собеседнике):

 

%user_1

%user_2

%user_3

%user_9

 

Свободные переменные применяются для записи любой текстовой информации:

 

%var1;

%var2;

%var3

%var100.

 

Но эта информация хранится только в текущем диалоге, а по его окончании удаляется.

Существует и третий вид переменных – переменные с автоматически заполняемым значением. Этим переменным невозможно присвоить какое-либо другое значение:

 

%auto_date – переменная, несущая информацию об актуальной дате в формате год-месяц-день (например, 2015-05-08);

%auto_time – переменная, несущая информацию об актуальном времени (по московскому часовому поясу).

 

Все переменные имеют текстовой формат. Даже если вы зададите значение переменной «2» или «22», система все равно будет воспринимать это значение как текст, а не как число.

Символ «%» в начале имени переменной должен стоять обязательно.

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

 

1) вывести переменную в ответ инфа;

2) выбрать ответ инфа в зависимости от значения переменной.

 

Если переменная больше не нужна в диалоге, то ее можно обнулить, т.е. удалить записанную в ней информацию.

Например, вы хотите запомнить имя собеседника, в некоторых случаях выводить его в ответ инфа (т.е. показать, что ваш инф помнит собеседника), а в других случаях выбрать ответ в зависимости от того, известен инфу этот собеседник или нет.

Вот так будут выглядеть шаблоны.

 

Запоминание имени:

 

Как оформляется шаблон Как выглядит диалог
$ Меня зовут *# Рад познакомиться. [%user_name=»[*1]»] Собеседник:  Меня зовут ВасяИнф: Рад познакомиться.

 

Вывод имени собеседника в ответ инфа:

 

Как оформляется шаблон Как выглядит диалог
$ Пока, инф.# До свидания, [%user_name]. Собеседник: Пока, инф.Инф: До свидания, Вася.

 

Выбор ответа в зависимости от значения переменной %user_name:

 

Как оформляется шаблон Как выглядит диалог
$ Ты помнишь, как меня зовут?# [if (%user_name)] {Конечно. Ты [%user_name].}# [if (!%user_name)] {Нет. Ты свое имя мне не называл.} Собеседник: Ты помнишь, как меня зовут?
Инф: Конечно. Ты Вася.илиСобеседник:  Ты помнишь, как меня зовут?
Инф: Нет. Ты свое имя мне не называл.

 

Удаление из памяти имени собеседника (обнуление переменной):

 

Как оформляется шаблон Как выглядит диалог
$ Ты дурак.# Все, я с тобой больше не дружу, и забыл, как тебя зовут. [%user_name=»»] Собеседник: Ты дурак.Инф: Все, я с тобой больше не дружу, и забыл, как тебя зовут.

 

Команду присвоения значения переменной всегда берут в квадратные скобки. Значение переменной заключается в кавычки:

 

[%переменная = «значение»]

 

Например:

 

$ Я рок-н-ролл танцую.

# Завидую. Инфы танцевать не могут. [%var1=»танцы»]

 

$ * ненавижу * танцевать *

$ * танцевать * ненавижу *

$ * не танцую *

# Жаль. Будь я человеком, обязательно бы танцевала. [%var1=»не любит танцы»]

 

$ Мне ** лет.

# Классный возраст! [%user_age=»[*1]»]

 

Так же можно обнулить переменную:

 

$ Не хочу, чтобы ты говорил про мой возраст.

# Как скажешь. [%user_age=»»]

 

Для того, чтобы инф «озвучил» значение переменной в ответе, надо просто прописать в ответе эту переменную.

Например:

 

$ Пока, робот!

# До свидания, [%user_name]!

 

Ограничения:

 

  1. Переменные можно использовать только в разделе Шаблоны. В разделах Темы и Реакции их применять нельзя.
  2. Нельзя вставлять переменные в инлайн-словари.

 

 

КАК ПРОВЕРИТЬ ЗНАЧЕНИЕ ПЕРЕМЕННОЙ И ВЫБРАТЬ ОТВЕТ ПРИ ПОМОЩИ УСЛОВНОГО ОПЕРАТОРА

 

Инф может давать разные ответы в зависимости от значения переменной или от наличия либо отсутствия запомненной переменной. Для этого используется условный оператор IF…ELSE. Альтернативная часть, начинающаяся с ELSE, не обязательна. Проверка осуществляется в ответах инфа.

Проверка на существование значения у переменной происходит по такому принципу:

 

[if(%переменная)]{Ответ1 инфа.}[else]{Ответ2 инфа}

 

Пример шаблона:

 

[if(%user_name)]{Ну что, [%user_name], как дела?}[else]{Как дела, незнакомец?}

 

Проверка на отсутствие значения у переменной происходит так:

 

[if(!%переменная)]{Ответ1 инфа.}[else]{Ответ2 инфа.}

 

Символ «!» выступает здесь в качестве служебного и означает отрицание.

 

Пример шаблона:

 

$* я *

#[if(!%user_name)]{Вот ты все о себе. А я даже не знаю, как тебя зовут.}[else]{[%user_name], я тебя узнал.}

 

Можно оформить этот шаблони без использования части с else:

 

$* я *

#[if(!%user_name)]{Вот ты все о себе. А я даже не знаю, как тебя зовут.}

#[if(%user_name)] {[%user_name], я тебя узнал.}

 

$ * потанцуем *

# [if(%var1=»не любит танцы»)]{Ты же не любишь танцевать…}[else]{Конечно, потанцуем! Ты же любишь танцевать!}

 

Без использования части с else:

 

$ * потанцуем *

# [if(%var1=»не любит танцы»)]{Ты же не любишь танцевать…}

# [if(%var1=»любит танцы»)]{Конечно, потанцуем! Ты же любишь танцевать!}

# [if(!%var1)]{А ты любишь танцевать?}

 

Вы можете задать проверку и на совпадение с конкретным значением:

 

[if(%переменная = «значение»)]{Ответ1 инфа.}[else]{Ответ2 инфа.}

 

Пример шаблона:

 

$ * дай ссылку на * летние фотки *

# [if(%user_name=»Твой Вася»)]{Там же, где всегда они лежат.}[else]{Извини, эта ссылка только для Васи.}

 

Ограничения:

 

Оператор IF…ELSE можно использовать только в разделе Шаблоны. В разделах Темы и Реакции его применять нельзя.

 

 

КАК ВСТАВИТЬ ЧАСТЬ ЗАПРОСА СОБЕСЕДНИКА В ОТВЕТ ИНФА

 

Сделать это можно таким образом:

 

$ меня зовут **

# Ага, тебя зовут [*1].

 

Т.е. в ответе инфа в квадратных скобках надо поставить звездочку и указать ее номер в вопросе.

 

В диалоге это сработает так:

 

Собеседник: Меня зовут Вася.

Инф: Ага, тебя зовут Вася.

 

В шаблонах-ответах можно ссылаться не только на звездочку, но и на слова (в т.ч. с тильдой) и инлайн-словари. Для этого в шаблоне-вопросе ту часть запроса, которую мы хотим использовать в ответе инфа, обрамляем квадратными скобками и тире:

 

[-{a/b/c}-]

[-a-]

[-*-]

[-**-]

 

В шаблоне-ответе мы ссылаемся на эту часть запроса следующим образом:

 

[&X],

 

где X – цифра от 1 до 9.

 

Номер той части запроса собеседника, к которой идет отсылка в шаблоне-ответе, считается слева направо по открывающей квадратной скобке в шаблоне-вопросе. Таких отсылок к запросу пользователя в одном шаблоне-ответе может быть не более 9.

 

Например:

 

$ меня зовут [-{вася/васил~/петя/петр/коля/никол~/дима/дмитр~}-]

# Ок, запоминаю: тебя зовут [&1] [%user_name=»[&1]»]

$ как меня зовут?

# [if(%user_name)]{Тебя зовут [%user_name].}[else]{Я еще не знаю, как тебя зовут.}

 

В диалоге это будет выглядеть так:

 

Собеседник: Меня зовут Николай.

Инф: Ок, запоминаю: тебя зовут Николай.

Собеседник: Как меня зовут?

Инф: Тебя зовут Николай.

 

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

 

Например:

 

$ меня зовут [-[-{вася/васил~/петя/петр/коля/никол~/дима/дмитр~}-] [-**-]-] {!/!!/!!!/—}

# Запоминаю: тебя зовут [&1]. Твое имя – [&2]. Твоя фамилия – [&3].[%user_name=»[&1]»]

$ как меня зовут?

# [if(%user_name)]{Тебя зовут [%user_name].}[else]{Я еще не знаю, как тебя зовут.}

 

В диалоге:

 

Собеседник: Меня зовут Вася Ершов

Инф: Запоминаю: тебя зовут Вася Ершов. Твое имя – Вася. Твоя фамилия – Ершов.

Собеседник: Как меня зовут?

Инф: Тебя зовут Вася Ершов.

 

 

КАК СРАВНИТЬ НОВЫЕ ДАННЫЕ ИЗ ЗАПРОСА СОБЕСЕДНИКА С УЖЕ ИМЕЮЩИМИСЯ ДАННЫМИ

 

Функция  IsEqual( » Аргумент1″, » Аргумент2″ ) – возвращает истинное значение, если значение первого аргумента совпадает со значением второго аргумента. В качестве Аргумент1 и Аргумент2 могут выступать текст, звездочки, референции, значения переменных, функции.

Сокращенное имя функции – «=».

 

Например:

 

$ мой любимый цвет *

# Да, это красивый цвет [%user_1=»[*1]»]

$ * твой любимый цвет *

# [if ( [@IsEqual( «[%user_1]», «синий» )] )] {Не поверишь, такой же, как у тебя – синий!} [else] {Мне больше всего нравится синий.}

Или:

 

$ мой любимый цвет *

# Да, это красивый цвет [%user_1=»[*1]»]

$ * твой любимый цвет *

# [if ( [@=( «[%user_1]», «синий» )] )] {Не поверишь, такой же, как у тебя – синий!} [else] {Мне больше всего нравится синий.}

 

Получаем диалоги:

 

Собеседник:  Мой любимый цвет зеленый.

Инф:  Да, это красивый цвет.

Собеседник:  А какой твой любимый цвет?

Инф:  Мне больше всего нравится синий

 

Собеседник:  Мой любимый цвет синий.

Инф:  Да, это красивый цвет.

Собеседник:  А какой твой любимый цвет?

Инф:  Не поверишь, такой же, как у тебя – синий!

 

Функция  IsNotEqual( «Аргумент1″, «Аргумент2″ ) – возвращает истинное значение, если значение переменной, переданной в первом аргументе, не совпадает со значением второго аргумента.

Сокращенное имя функции – «!=».

 

К примеру:

 

$ меня зовут *

# Очень приятно, [@ProperName( «[*1]» )] [%user_name=»[*1]»]

$ * моего друга зовут *

# [if ([@IsNotEqual( «[%user_name]», «[*1]» )] )] {Красивое имя у твоего друга.} [else] {О, здорово, вы тезки!}

 

Или:

 

$ меня зовут *

# Очень приятно, [*1] [%user_name=»[*1]»]

$ * моего друга зовут *

# [if ([@!=( «[%user_name]», «[*1]» )] )] {Красивое имя у твоего друга.} [else] {О, здорово, вы тезки!}

 

Получаем диалоги:

 

Собеседник:  Меня зовут Вася.

Инф:  Очень приятно, Вася.

Собеседник:  Моего друга зовут Петя.

Инф:  Красивое имя у твоего друга.

 

Собеседник:  Меня зовут Вася.

Инф:  Очень приятно, Вася.

Собеседник:  И моего друга зовут Вася.

Инф:  О, здорово, вы тезки!

 

 

КАК В ОТВЕТЕ ИНФА ПОКАЗАТЬ ТОЧНОЕ ВРЕМЯ, ДАТУ ИЛИ ДЕНЬ НЕДЕЛИ

 

Функция Time( «Аргумент1″ ) подставляет на свое место время в формате ЧЧразделительММ, где разделитель – это аргумент функции. По умолчанию разделитель равен «:». Аргумент1:  текст

Например:

 

$ Сколько времени?

# Судя по моим атомным часам, нынче [@Time()].

$ Мне больше нравится формат с разделителем.

# Ну хорошо, пусть будет так: [@Time(«/»)].

 

Получаем диалог:

 

Собеседник: Сколько времени?

Инф: Судя по моим атомным часам, нынче 15:16.

Собеседник: Мне больше нравится формат с разделителем.

Инф: Ну хорошо, пусть будет так: 15/16.

 

Функция Date() подставляет на свое место дату в формате ДД.ММ.ГГГГ.

Сокращенное имя функции – Dt.

Например:

 

$ Какое сегодня число?

# Насколько я знаю, сегодня [@Date()].

Или

$ Какое сегодня число?

# Насколько я знаю, сегодня [@Dt()].

 

Получаем диалог (например, он произошел 15 мая 2015 г.):

 

Собеседник: Какое сегодня число?

Инф: Насколько я знаю, сегодня 15.05.2015.

 

Функция DayOfWeek( «Аргумент1″ ) подставляет на свое место текущий день недели. В качестве аргумента принимается одно из двух значений: «ru» или «en» – язык, на котором будет написан день недели.

Сокращенное имя функции – DoW.

Например:

 

$ Какой сегодня день недели?

# [@DayOfWeek( «ru» )]!

 

Или:

 

$ Какой сегодня день недели?

# Вроде [@DoW( «ru» )]!

 

Получаем диалог:

 

Собеседник: Какой сегодня день недели?

Инф: Вроде пятница!

 

Функция Extract( «Аргумент1″, «Аргумент2″, «Аргумент3″ ) форматирует переданную в качестве первого аргумента дату в соответствии с форматом, указанным во втором аргументе. Третий аргумент может принимать значения «ru» и «en» и определяет язык, который будет использован в результате функции. По умолчанию третий аргумент функции Extract имеет значение «ru» и может быть опущен. Формат задается в виде строки. Результатом функции является эта строка, в которой специальные символы заменены на некоторые значения согласно следующему правилу:

 

%% – символ %;

%d – номер дня в месяце, например 08;

%u – номер дня в неделе, например 6;

%D – название дня недели, например суббота;

%m – номер месяца в году, например 02;

%M – название месяца в именительном падеже, например декабрь;

%S – название месяца в родительном падеже, например, декабря;

%g – последние две цифры года, например 15;

%y – год целиком, например 2015.

Сокращенное имя функции – dext.

 

Например:

 

$ Какое сегодня число?

# Сегодня [@Extract( «[@Dt()]», «%D, это %u день недели и %d день в текущем месяце, а текущий месяц – %M» )]. Я удовлетворил твое любопытство?

 

Или:

 

$ Какое сегодня число?

# Сегодня [@dext( «[@Dt()]», «%D, это %u день недели и %d день в текущем месяце, а текущий месяц – %M» )]. Я удовлетворил твое любопытство?

 

Получаем диалог (например, он происходит 15 мая в пятницу):

 

Собеседник: Какое сегодня число?

Инф: Сегодня пятница, это пятый день недели и 15-й день в текущем месяце, а текущий месяц – май. Я удовлетворил твое любопытство?

 

 

КАК ОПРЕДЕЛИТЬ, КАКОЙ ИЗ ШАБЛОНОВ СРАБОТАЕТ В ОТВЕТ НА ТОТ ИЛИ ИНОЙ ЗАПРОС

 

Чтобы определить, какой из шаблонов сработает в той или иной ситуации диалога, нужно знать приоритет шаблона.

Шаблоны из Шаблонов всегда имеют более высокий приоритет, чем предустановленные шаблоны инфа.

Поэтому, например, шаблон

 

$ * где *,

 

созданный в разделе Шаблоны, «перебьет» предустановленный шаблон для вопроса «Где ты живешь?» из темы «География».

В этом случае, чтобы инф правильно отвечал на вопрос «Где ты живешь?», нужно создать соответствующий шаблон в Шаблонах.

Допустим, вот такой:

 

$ * где * живеш~ *

 

Внутри Шаблонов среди подходящих шаблонов приоритетным считается тот, который «прицеплен» к якорю.

Т.е., предположим, у нас есть три шаблона:

 

$ тест

# Тест работает (якорь «тест»)

 

(якорь «тест»)

$ * тест2 *

# Якорь – это замечательно.

 

$ * тест2 *

# Тест – это хорошо.

 

Тогда если у нас будет вот такой диалог:

 

Собеседник: тест

Инф: Тест работает.

Собеседник: тест2

 

то после реплики собеседника«тест2» инф ответит:

 

Инф: Якорь – это замечательно.

 

А в остальных случаях на запрос «тест2» будет выдаваться ответ: «Тест – это хорошо».

При прочих равных условиях приоритетным считается шаблон, в котором нет звездочек (*).

Иными словами, если у нас есть шаблоны:

 

$ а где {?/—}

# Нигде.

 

и

 

$ * а где {?/—}

# Где-то

 

то на вопрос «а где?» пользователь всегда получит ответ «Нигде».

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

При этом важно помнить, что знаки «?» и «!» считаются отдельными словами. Суперзвездочка (**) считается за 0,5 слова, звездочка (*) при подсчете длины шаблона не учитывается.

Например, длина вот этого шаблона:

 

$ меня зовут **

 

будет равна 2,5, а длина этого:

 

$ меня зовут *

 

будет 2.

 

Из двух шаблонов, одинаковых по всем показателям, шаблон выбирается случайным образом. Это означает, что шаблоны типа

 

$ * где *

 

и

 

$ *?

 

для запроса «где?» считаются шаблонами с одинаковым приоритетом, так как оба со звездочками и одинаковой длины – 1 (в каждом из них по одному слову). Соответственно, инф каждый раз будет случайным образом выбирать один из ответов на эти шаблоны. Чтобы избежать этого, нужно к шаблонам вида

 

$ * X *

 

и

 

$ X *

 

где X – одно слово, приписывать дополнительные шаблоны-вопросы с суперзвездочкой вот такого вида:

 

$ * X **

$ X **

 

В полном виде шаблон-вопрос будет выглядеть так:

 

$ * X *

$ * X **

$ X *

$ X **

 

 

КАК УЧЕСТЬ В ШАБЛОНЕ ВОЗМОЖНЫЕ ОШИБКИ И ОПЕЧАТКИ СОБЕСЕДНИКА

 

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

Например, шаблон на фразу собеседника «не знаю» должен выглядеть не так:

 

$ * не знаю *

 

а вот так:

 

$ * {не знаю/ни знаю/незнаю/низнаю/не наю/ни наю/ненаю/нинаю} *