Познакомьтесь с криптоботом Сато, который может получить любую цену за криптовалюту из внешнего API!

У чат-ботов невероятный потенциал. Тем не менее, чтобы боты были эффективными, они должны интегрировать и обмениваться данными с существующими сервисами и процессами.

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

Например, Sato - криптобот, который мы создадим сегодня, - способен распознавать все криптовалюты, даже те, которые еще даже не перечислены. Мне не нужно было ничего делать для него, чтобы он мог обрабатывать запросы о криптовалюте, которые появятся даже спустя годы, потому что Сато в глубине души понял, что такое символ криптовалюты (после того, как получил тысячи из них).

Что мы строим сегодня?

К концу этого руководства у нас будет бот, способный извлекать данные из стороннего API в зависимости от того, что вводят наши пользователи, и отвечать им полученным значением. Вот конечный результат того, что мы создадим сегодня: криптобота, иначе говоря, чат-бота, способного получать любую цену за криптовалюту.

В спешке? Вот все, что вам нужно для создания собственного:

Нужно увидеть это, чтобы поверить в это? Это мудро! Кликните сюда"!

Или, если вы хотите понять, как это было сделано, прочтите руководство.

1. Создайте базу своего чат-бота: выберите свой путь

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

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

Познакомьтесь с Сато, криптоботом

Sato - это бот, созданный, чтобы отвечать на основные вопросы о криптовалютах и ​​узнавать их цены. Вот обзор того, что он умеет:

  1. Получение цен на криптовалюты (то, что мы построим сегодня): Sato распознает символы криптовалют (ETH, BTC) и получает их цену в API криптосравнения, чтобы, наконец, вернуть пользователю значения BTC и USD.
  2. Отвечайте на вопросы пользователей о кошельках - онлайн-кошельках, обменных кошельках, холодных кошельках и аппаратных кошельках.
  3. Ответьте на вопросы о закрытых и открытых ключах, а также о безопасности криптовалют.
  4. Кратко представьте основные криптовалюты, в настоящее время BTC, ETH, BCH и LTC.

Внутри Сато

Сегодня мы сосредоточимся на навыке получения цен на криптовалюту, поскольку для этого требуется внешний вызов API. По сути, Sato нужны три вещи, чтобы определить вопрос о цене криптовалюты и вернуть запрошенное значение:

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

Во-вторых, чтобы Сато мог распознавать все криптовалюты, ему понадобится самый большой список, который вы можете найти. Я нашел 1200+ на CoinMarketCap, что для начала достаточно. Я создал бюллетень криптовалютных имен, чтобы улучшить его понимание.

В-третьих, нам нужно создать навык, который срабатывает при распознавании намерения @ask_price или #crypto_name:

Вы также можете добавить #crypto_name в качестве требования, чтобы убедиться, что ни один вызываемый API не запускается без параметров:

Этот навык также должен вызывать ваш веб-перехватчик, который мы настроим ниже:

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

Наконец, мы протестируем нашего бота прямо в Messenger, поэтому вам нужно будет создать страницу и приложение и связать их. Все задокументировано на вкладке CONNECT и в Руководстве по началу работы.

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

Чтобы встретить меня там, у вас есть два варианта:

  • Вариант A: создайте собственного бота (который не обязательно должен быть криптоботом), следуя руководству по началу работы и создав учетную запись в SAP Conversational AI.
  • Вариант Б: вилка Сато и начало отсюда. Вот почему SAP Conversational AI - это платформа для совместной работы чат-ботов. Он работает почти так же, как GitHub!

2. Базовый код сервера и требования

Поскольку мы хотим взаимодействовать с нашим ботом, нам понадобится сервер, чтобы иметь возможность получать результаты НЛП, выполненные SAP Conversational AI, и отправлять наши ответы обратно.

В конструкторе ботов перейдите на вкладку CODE, чтобы найти пример базового кода, необходимого для запуска вашего API. Мы приводим примеры на Node.JS, PHP, Python и Ruby. Этот учебник будет только на Python.

Вот базовый код Python:

from flask import Flask, request, jsonify 
import json 

app = Flask(__name__) 
port = '5000' 

@app.route('/', methods=['POST']) 
def index(): 
  print(json.loads(request.get_data())) 
  return jsonify( 
    status=200, 
    replies=[{ 
      'type': 'text', 
      'content': 'Roger that', 
    }]
  ) 
 
@app.route('/errors', methods=['POST']) 
def errors(): 
  print(json.loads(request.get_data())) 
  return jsonify(status=200) 
 
app.run(port=port)

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

Требования

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

Для вызова API мы также будем использовать Запросы. Давайте продолжим и установим оба:

pip install Flask
pip install requests

3. Протестируйте сервер: NGROK.

Теперь, когда у нас есть базовый сервер, давайте запустим его и протестируем. Это позволит нам быть более инкрементными в процессе, так что отладка (если таковая имеется) упростится.

Чтобы подключить наш локальный сервер к Интернету, нам понадобится ngrok.

Примечание: если вы используете Windows, как я, есть отличный менеджер пакетов Chocolatey, который работает почти так же, как apt-get в UNIX. С его помощью вы сможете установить ngrok в одну строку choco install ngrok_portable. Более того, Chocolatey добавляет ngrok в ваш PATH, позволяя запускать ngrok с любого терминала, просто набрав ngrok.

Пришло время запустить наш сервер и протестировать его, это подразумевает:

  1. Установите триггер веб-перехватчика в своем боте (подробно описано в шаге 1)
  2. Запустите свой скрипт python
  3. Откройте порт 5000 в Интернет с помощью ngrok: ngrok http 5000
  4. Скопируйте URL-адрес пересылки из формы ngrok и вставьте его в качестве базового URL-адреса бота в SAP Conversational AI.

4. Подготовка внешнего вызова API.

Пора начинать строить! Давайте посмотрим на вызов API, который мы будем делать, чтобы узнать цену любой криптовалюты. Для этой цели доступно несколько API, поэтому я просто выбрал один: Cryptocompare API.

Cryptocompare API предлагает тысячи возможностей, но для простоты мы будем придерживаться основ. Нам нужна цена согласованной криптовалюты в BTC, долларах США и евро.

Вот как структурирован звонок (здесь для ETH):

https://min-api.cryptocompare.com/data/price?fsym="ETH"&tsyms=BTC,USD,EUR"

У вас есть два параметра:

  • fsym: символ криптовалюты, здесь нам нужно получить имя crypto_name, распознанное в сущности #crypto_name.
  • tsyms: валюта, в которой будет возвращена цена. Здесь мы выбрали BTC, USD и EUR.

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

5. Адаптируйте вызов API, включив в него символ, распознанный пользователем.

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

  • Знайте #crypto_name, распознаваемое SAP Conversational AI.
  • Выполните вызов API для Cryptocompare, используя #crypto_name.

Давайте начнем!

Шаг 1. Поиск данных в SAP Conversational AI JSON

Давайте посмотрим на данные, возвращаемые SAP Conversational AI при вводе пользователем. Для этого вы нажимаете кнопку CHAT WITH YOUR BOT на всех страницах в правом нижнем углу. Затем вы можете переключаться между беседой и представлением JSON, щелкнув оранжевый информационный кружок, как показано ниже:

Здесь наш символ доступен с ['conversation']['memory']['crypto']['raw']. Поскольку значения и сырые и идентичные в данном случае, можно использовать и то, и другое.

На нашем сервере JSON, возвращаемый тестовой панелью веб-сайта, инкапсулирован в data словарь (см. Код сервера). Поэтому нам нужен дополнительный шаг, чтобы получить его на нашем сервере:

# FETCH THE CRYPTO NAME
crypto_name = data['conversation']['memory']['crypto']['value']

Шаг 2. Выполните вызов API, используя распознанный объект.

import requests
r = requests.get("https://min-api.cryptocompare.com/data/price?fsym="+crypto_name+"&tsyms=BTC,USD,EUR")

Распечатайте его, но вы можете быть разочарованы:

В самом деле, если вы хотите получить значения, возвращаемые вызовом, вам нужно вывести r.json(). Хорошая новость заключается в том, что JSON, возвращаемый Cryptocompare, действительно настолько прост, насколько это возможно:

Большой! Теперь нам осталось разобраться с одним последним шагом: вернуть цены пользователю.

Шаг 3. Возврат полученных данных пользователю

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

return jsonify( 
    status=200, 
    replies=[{ 
      'type': 'text', 
      'content': 'Roger that', 
    }],

Мы будем редактировать только ответы, чтобы включить полученные нами цены:

replies=[{
      'type': 'text',
      'content': 'The price of %s is %f BTC and %f USD' % (crypto_name, r.json()['BTC'], r.json()['USD'])
    }],

Поскольку ответ представляет собой строку, мы должны использовать оператор по модулю (%), чтобы включить наши цены в строку. Здесь первый% s указывает Python искать строку, а два следующих% f указывают на число с плавающей запятой.

Наш обновленный сервер готов, вот весь код:

from flask import Flask, request, jsonify
import json
import requests

app = Flask(__name__)
port = '5000'

@app.route('/', methods=['POST'])
def index():
  data = json.loads(request.get_data())

  # FETCH THE CRYPTO NAME
  crypto_name = data['conversation']['memory']['crypto']['raw']

  # FETCH BTC/USD/EUR PRICES
  r = requests.get("https://min-api.cryptocompare.com/data/price?fsym="+crypto_name+"&tsyms=BTC,USD,EUR")

  return jsonify(
    status=200,
    replies=[{
      'type': 'text',
      'content': 'The price of %s is %f BTC and %f USD' % (crypto_name, r.json()['BTC'], r.json()['USD'])
    }]
  )

@app.route('/errors', methods=['POST'])
def errors():
  print(json.loads(request.get_data()))
  return jsonify(status=200)

app.run(port=port)

Когда наш новый сервер готов, у нас есть все части нашей головоломки. Соберем:

  1. Запустите свой скрипт python,
  2. Выставьте порт 5000 в Интернет с помощью ngrok: ngrok http 5000,
  3. Скопируйте URL-адрес пересылки из формы ngrok и вставьте его в качестве базового URL-адреса бота в SAP Conversational AI.

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

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

Первоначально опубликовано в блоге SAP Conversational AI.