Как создать персонализированный ответ с диалогом?

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

# -*- coding:utf-8 -*-
# !/usr/bin/env python
# Copyright 2017 Google Inc. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

from __future__ import print_function

import os
import sys
import json
import yaml
try:
import apiai
except ImportError:
sys.path.append(
    os.path.join(
        os.path.dirname(os.path.realpath(__file__)),
        os.pardir,
        os.pardir
    )
)

import apiai

CLIENT_ACCESS_TOKEN = '197ef97149d449a6962ba5bd5e488607'

def yaml_loader(filepath):
  """Loads a yaml file"""
  with open(filepath, 'r') as file:
     data = yaml.load(file)
  return data
def yaml_dump(filepath, data):
  """Dumps data to a yaml file"""
  with open(filepath, "w") as file:
    yaml.dump(data, file)


def main():
  ai = apiai.ApiAI(CLIENT_ACCESS_TOKEN)
  filepath = "proxy.yaml"
  data = yaml_loader(filepath)

  proxy = data.get('proxy')
  for proxy_protocol, proxy_host in proxy.items():
    os.environ["" + proxy_protocol] = "" + proxy_host

while True:
    print(u"> ", end=u"")
    user_message = input()

    if user_message == u"exit":
        break

    request = ai.text_request()
    request.query = user_message

    response = json.loads(request.getresponse().read())

    result = response['result']
    action = result.get('action')
    actionIncomplete = result.get('actionIncomplete', False)

    print(u"< %s" % response['result']['fulfillment']['speech'])

    if action is not None:
        if action == "search-book":
            parameters = result['parameters']

            text = parameters.get('text')
            Gender = parameters.get('Gender')

            print (
                'text: %s, Gender: %s' %
                (
                    text if text else "null",
                    Gender if Gender else "null",
                )
            )


if __name__ == '__main__':
  main()

Для API книг Google я нашел это, и он работает: https://github.com/hoffmann/googlebooks

Я уже создал сущность под названием "пол" и намерение под названием "поисковая книга"

1 ответ

Решение

Что вам нужно сделать, это реализовать веб- крюк (веб-сервис) для ваших целей.

установите URL для вашего webhook здесь

затем перейдите к своему намерению и включите веб-крюк для намерения

поэтому, когда кто-то запросит ваше намерение, ваш webhook получит запрос на публикацию с текстом ниже josn

{
  "responseId": "ea3d77e8-ae27-41a4-9e1d-174bd461b68c",
  "session": "projects/your-agents-project-id/agent/sessions/88d13aa8-2999-4f71-b233-39cbf3a824a0",
  "queryResult": {
    "queryText": "user's original query to your agent",
    "parameters": {
      "param": "param value"
    },
    "allRequiredParamsPresent": true,
    "fulfillmentText": "Text defined in Dialogflow's console for the intent that was matched",
    "fulfillmentMessages": [
      {
        "text": {
          "text": [
            "Text defined in Dialogflow's console for the intent that was matched"
          ]
        }
      }
    ],
    "outputContexts": [
      {
        "name": "projects/your-agents-project-id/agent/sessions/88d13aa8-2999-4f71-b233-39cbf3a824a0/contexts/generic",
        "lifespanCount": 5,
        "parameters": {
          "param": "param value"
        }
      }
    ],
    "intent": {
      "name": "projects/your-agents-project-id/agent/intents/29bcd7f8-f717-4261-a8fd-2d3e451b8af8",
      "displayName": "Matched Intent Name"
    },
    "intentDetectionConfidence": 1,
    "diagnosticInfo": {},
    "languageCode": "en"
  },
  "originalDetectIntentRequest": {}
}

Вы можете получить имя намерения

body.queryResult.intent.displayName

также вы можете получить параметры

body.queryResult.parameters

так как теперь у вас есть необходимые параметры, вы можете позвонить в API GoogleBooks и отправить результат обратно в диалоговом потоке Google

ответ JSON должен быть что-то вроде этого

{
  "fulfillmentText": "This is a text response",
  "fulfillmentMessages": [
    {
      "card": {
        "title": "card title",
        "subtitle": "card text",
        "imageUri": "https://assistant.google.com/static/images/molecule/Molecule-Formation-stop.png",
        "buttons": [
          {
            "text": "button text",
            "postback": "https://assistant.google.com/"
          }
        ]
      }
    }
  ],
  "source": "example.com",
  "payload": {
    "google": {
      "expectUserResponse": true,
      "richResponse": {
        "items": [
          {
            "simpleResponse": {
              "textToSpeech": "this is a simple response"
            }
          }
        ]
      }
    },
    "facebook": {
      "text": "Hello, Facebook!"
    },
    "slack": {
      "text": "This is a text response for Slack."
    }
  },
  "outputContexts": [
    {
      "name": "projects/${PROJECT_ID}/agent/sessions/${SESSION_ID}/contexts/context name",
      "lifespanCount": 5,
      "parameters": {
        "param": "param value"
      }
    }
  ],
  "followupEventInput": {
    "name": "event name",
    "languageCode": "en-US",
    "parameters": {
      "param": "param value"
    }
  }
}

кое-что я сделал с узлом JS

 'use strict';
 const http = require('http');

 exports.bookWebhook = (req, res) => {

     if (req.body.queryResult.intent.displayName == "search-book") {
         res.json({
             'fulfillmentText': getbookDetails(req.body.queryResult.parameters.gender)
         });
     }
 };


 function getbookDetails(gender) {
     //do you api search for book here

     return "heard this book is gooooood";
 }

в функции getbookDetails вы можете вызвать api, получить книгу, отформатировать строку и вернуть строку. То же самое должно применяться к python, как и мы. только синтаксис будет другим.

Другие вопросы по тегам