В части I и части II мы рассмотрели некоторые из лучших практик при разработке модуля для Converse.AI, а затем закодировали довольно надежный блокировщик в Node.js.

Сегодня мы собираемся закончить все это и использовать наш модуль для запуска нескольких крутых автоматических разговоров 🤖.

Дизайн разговора

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

Давайте создадим новый шаблон с именем «imdb_title» и добавим наш новый модуль Scrape в «начальное состояние». В «начальном состоянии» запросите у пользователя URL-адрес заголовка IMDb и добавьте sys-any в контекст. Это предложит пользователю ввести URL-адрес и использовать весь ответ в качестве этого URL-адреса. Это не лучший разговорный опыт, но мы рассмотрим это позже.

Если вы посмотрите на Scrape Module, мы увидим два параметра, созданных ранее через CLI. Мы хотим использовать ответ пользователя на вопрос о состоянии в качестве URL-адреса, который мы можем легко сделать с помощью встроенных рулей Converse.AI.

Поэтому добавьте {{states.startstate.value}} во ввод URL/HTML.

Затем мы хотим найти информацию на IMDb, которую мы хотим очистить. Мы можем сделать это, посетив любую титульную страницу на IMDb и используя инспектор элементов Chrome, чтобы выбрать правильный элемент для каждой части информации, которую мы хотим. Я использую фильм Люси, но это будет одна и та же структура HTML для любой титульной страницы IMDb.

Это может занять немного проб и ошибок, но не волнуйтесь, я знаю, что вы заняты, и у вас есть дела, поэтому вот мой список селекторов, чтобы сэкономить ваше время:

KEY : VALUE
------- ------------------------------------------------------------
 title : div.title_wrapper > h1[itemprop="name"]
  year : div.title_wrapper > h1[itemprop="name"] > span > a
actors : table.cast_list td[itemprop="actor"] span[itemprop="name"]

Мы запросили URL-адрес, мы собрали информацию, теперь нам нужно завершить ее, предоставив в беседе удобочитаемую информацию.

В разделе «Ответ» «начального состояния» мы хотим напечатать что-то похожее на следующее:

{{<Title>}} was released in {{<Year>}} starring {{<Actor 1>}}, {{<Actor 2>}}, and {{<Actor 3>}}.

Каждый элемент между < и > нужно будет заменить значением ‘Output’ нашего модуля Scrape плюс имя свойства, которое мы определили в нашей карте селекторов.

Значение «Вывод» равно объекту JSON, который мы установили в части II этой серии, response.setValue(...);, и его можно найти в параметрах селектора, которые выглядят примерно так:

states.startstate.example123_web_scraper.scrape_module

В нашем случае просмотр IMDb для фильма «Люси» дает нам следующий результат:

{
  title: ["Lucy"],
  year: [
    {
      href: "/title/tt2872732",
      text: "2014"
    }
  ],
  actors: [
    "Scarlett Johansson",
    ...
  ]
}

Поэтому замените <Title> на <output>.title.0 , <Year> на <output>.year.0.text и <Actor X> на <output>.actors.X , где <output> — значение вашего модуля «Вывод» сверху. Каждый элемент представляет собой массив, поэтому важно использовать .0 для получения первого экземпляра в массиве.

Посмотрим, работает ли это. Сохраните этот шаблон, откройте чат на боковой панели и запустите разговор с помощью кнопки «Воспроизвести» внизу (рядом с кнопкой «Стоп»).

Работает хорошо, а также с несколькими названиями фильмов… но это немного громоздко. Как упоминалось ранее, для пользователя это не лучший опыт общения — необходимость вставлять URL-адрес заголовка IMDb для получения информации об этом заголовке не лучше, чем интернет-браузер (до Google). Поэтому в нынешнем состоянии этот чат-бот — мусор. 👎

Легко исправить!

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

Создайте новый шаблон с именем «imdb_search» и добавьте наш модуль Scrape в «начальное состояние». В «начальном состоянии» спросите у пользователя название фильма и снова добавьте sys-any к вводу контекста.

В нашем модуле Scrape установите для параметра URL/HTML значение:

http://www.imdb.com/find?s=tt&q={{states.startstate.value}}

И наш список выбора для:

KEY : VALUE
------- ------------------------------------------------------------titles : table.findList td.result_text > a

Оставьте ответ «startstate» пустым и вместо этого добавьте модуль «Запустить дочерний шаблон» после модуля Scrape. Установите «Имя дочернего шаблона» в качестве нашего предыдущего шаблона («imd_title») и установите «Значения дочерних объектов» как:

KEY : VALUE
----------- --------------------------------------------------------startstate : http://www.imdb.com{{<output>.titles.0.href}}

Где, как и прежде, <output> — это выходное значение модуля Scrape.

Это очищает страницу поиска IMDb с помощью пользовательского ввода и получает значение href первой ссылки в результатах. Он запускает наш предыдущий шаблон с начальным значением startstate, равным значению href, которое мы только что очистили.

Сохраните шаблон и запустите его в действие.

Следующие шаги

  • Как мы видели, вполне возможно, что дизайнер шаблонов может предоставить {{handlebar}} в качестве входных данных для одного из наших параметров. Это обеспечивает большую гибкость внутри платформы Converse AI, но эти выражения руля могут разрешаться в неожиданный тип данных. Поэтому всегда рекомендуется проверять свои переменные, прежде чем продолжить.
  • Какую еще информацию мы можем извлечь с титульного листа? Можем ли мы показать более подходящую информацию для телесериала и т. д.
  • Попробуй сам!

Несколько слов о скрейпинге

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

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

Взгляните на код этого модуля (и многих других) на странице converseai-extensions github. Или погрузитесь в Документацию Converse.AI Extensions, чтобы создать несколько собственных уникальных модулей — не стесняйтесь поделиться ими со мной.