Google Dialogflow это платформа которая позволяет разрабатывать и интегрировать диалоговые интерфейсы в ваши приложения, веб страницы, чат боты и т.д. Пользование платформой бесплатной при условии, что количество запросов не превысит определенный месячный лимит. Я покажу как интегрировать Dialogflow в телеграм чат бота. Это можно сделать двумя способами:
- Средствами самого Dialogflow, для этого достаточно ввести токен на панели управления Dialogflow, и у вас сразу появится готовый телеграм бот.
- Используя API Dialogflow.
Я использую второй вариант, т.к. мой бот является интерфейсом у Умному дому и Dialogflow не единственный обработчик пользовательских запросов. За основу возьмём наш эхо бот.
Установим в нашей виртуальной среде пакет So:
pip install google-cloud-dialogflow
Пойдём на https://dialogflow.cloud.google.com/. И создадим нового агента. После этого можно импортировать одного из готовых агентов от гугла, например болталку. Делается это в разделе Prebuilt Agents. Выберем Small talk.
Теперь получим ключ для нашего агента в виде файла json согласно инструкции. https://cloud.google.com/dialogflow/es/docs/quick/setup.
Теперь, когда у нас есть новый агент и ключ к нему можно запускать бота. Код под спойлером.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
import settings from telegram.ext import * from telegram import * from google.cloud import dialogflow from google.api_core.exceptions import InvalidArgument import os DIALOGFLOW_PROJECT_ID = 'your dialogflow project id' DIALOGFLOW_LANGUAGE_CODE = 'en' SESSION_ID = 'current-user-id' os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = os.getcwd()+"/your json key.json" def start(update, context): update.message.reply_text("Hi! I am a bot with Google Dialogflow") def echo(update, context): text_to_be_analyzed = update.message.text session_client = dialogflow.SessionsClient() session = session_client.session_path(DIALOGFLOW_PROJECT_ID, SESSION_ID) text_input = dialogflow.TextInput(text=text_to_be_analyzed, language_code=DIALOGFLOW_LANGUAGE_CODE) query_input = dialogflow.QueryInput(text=text_input) try: try: response = session_client.detect_intent(session=session, query_input=query_input) except InvalidArgument: update.message.reply_text('Something went wrong') return update.message.reply_text (response.query_result.fulfillment_text) except Exception as err: update.message.reply_text(err) def main(): updater = Updater(settings.TELEGRAM_API_KEY, use_context=True) dp = updater.dispatcher dp.add_handler(CommandHandler("start", start)) dp.add_handler(MessageHandler(Filters.text, echo)) # Start the Bot updater.start_polling() updater.idle() if __name__ == '__main__': main() |
Бот будет отвечать одним из готовых сообщений если увидит похожий на один из знакомых запросов. Можете добавить или отредактировать вопросы и ответы под свои задачи. Можно настроить степень близости запроса пользователя и ответа системы. Это насколько могут быть похожи запросы пользователя на запросы в базе агента. По умолчанию в системе установлено значение 0.7. Я использую 0.38.
Так же Dialogflow удобно использовать для “вытаскивания” именованных сущностей из запросов . Таких как имена, географические объекты и т.д. Так же ответ от Dialogflow может содержать данные для синтезатора голоса. В моем проекте с умной колонкой для синтеза голоса и детектирования намерений используется Dialogflow.
494