DialogFlow CX вычисляет значения

Я собираю данные, введенные пользователем, и в завершение хочу вычислить значение на основе этого ввода.

Например, я собираю вес человека, а затем рост, чтобы вычислить ИМТ человека, общий поток. Как я могу рассчитать ИМТ на последнем этапе и показать результат пользователю?

2 ответа

В дополнение к сообщению jess, вот еще один подход, который вы можете попробовать, чтобы рассчитать ИМТ на основе вводимых пользователем данных. Вот отличия от первого представленного подхода:

  • Составные настраиваемые объекты

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

  • Параметры формы

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

Вот пошаговая процедура для реализации этих функций.

  1. Создавайте составные настраиваемые сущности, чтобы собирать параметры формы от конечного пользователя для страницы. Вы можете создавать собственные объекты следующим образом:

    а. Создавайте настраиваемые объекты для названий единиц роста и веса.

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

  2. Создайте намерение, которое будет использоваться для запуска потока. Обратите внимание на добавление достаточного количества обучающих фраз для того, что конечные пользователи могут напечатать или сказать.

  3. Создайте страницу, на которой вы можете перейти со своей стартовой страницы по умолчанию при срабатывании намерения Intent.BMI. Эта страница также будет использоваться для сбора параметров формы, которые вы можете использовать для расчета ИМТ.

  4. Создайте поток, добавив маршрут намерения для намерения Intent.BMI, где переходом является страница BMI. Поток будет выглядеть так.

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

    а. Страница BMI может выглядеть так.

    б. Что касается параметров, вот пример того, как добавить эти параметры.

    c. Для маршрутов условий я добавил условие для возврата ответа после выполнения параметров формы. Если еще не выполнено, агент будет продолжать запрашивать у пользователя допустимый ввод. Я использовал веб-перехватчик, чтобы вернуть ответы, в которых этот веб-перехватчик извлекал значение для каждого параметра и мог вычислить ИМТ.

  6. В своем веб-перехватчике создайте функцию, которая будет извлекать параметры формы и вычислять ИМТ на основе этих значений. Вот еще один пример использования Node.js.

index.js

       'use strict';

const express = require('express');
const bodyParser = require('body-parser');
const app = express();

var port = process.env.PORT || 8080;

app.use(
    bodyParser.urlencoded({
      extended: true
    })
);
  
app.use(bodyParser.json());

app.post('/BMI', (req, res) => processWebhook4(req, res));

var processWebhook4 = function(request, response ){

    const params = request.body.sessionInfo.parameters;
    
    var heightnumber = params["height.number"];
    var weightnumber = params["weight.number"];
    var heightunit = params["height.unit-height"]
    var weightunit = params["weight.unit-weight"]
    var computedBMI;

    if (heightunit == "cm" && weightunit == "kg") { //using metric units
        computedBMI = ((weightnumber/heightnumber/heightnumber )) * 10000;
    } else if (heightunit == "in" && weightunit == "lb") { //using standard metrics
        computedBMI = ((weightnumber/heightnumber/heightnumber )) * 703;
    }

    const replyBMI = {
        'fulfillmentResponse': {
            'messages': [
                {
                    'text': {
                        'text': [
                            'This is a response from webhook! BMI is ' + computedBMI
                        ]
                    }
                }
            ]
        }
    }
    response.send(replyBMI);
}

app.listen(port, function() {
    console.log('Our app is running on http://localhost:' + port);
});

package.json

       {
   "name": "cx-test-functions",
   "version": "0.0.1",
   "author": "Google Inc.",
   "main": "index.js",
   "engines": {
       "node": "8.9.4"
   },
   "scripts": {
       "start": "node index.js"
   },
   "dependencies": {
       "body-parser": "^1.18.2",
       "express": "^4.16.2"
   }
}
  1. Вот результат.

Чтобы рассчитать значения входных данных, полученных от бота, вам необходимо настроить код с использованием веб-перехватчика для расчета ИМТ и подключения URL-адреса веб-перехватчика в консоли Dialogflow CX. Вот простой алгоритм, который вы можете попробовать:

  1. Во-первых, создайте составные настраиваемые сущности, которые можно использовать для сопоставления значений в обучающих фразах в намерении, например вес и рост. https://cloud.google.com/dialogflow/cx/docs/concept/entity#custom.

  1. Затем создайте намерение с помощью обучающих фраз, которые соответствуют значениям созданных вами сущностей.

  1. Есть два способа установить значение параметров: Intent параметры и параметры формы. В моем примере я использовал параметры Intent для получения значений параметров, которые сохраняются, когда вы запрашиваете поток беседы из раздела "Test Agent":

  1. Затем подготовьте свой код в веб-перехватчике для обработки значений для расчета ИМТ: https://cloud.google.com/dialogflow/cx/docs/concept/webhook. Вот пример кода с использованием NodeJS:

index.js

       const express = require('express') // will use this later to send requests 
const http = require('http') // import env variables 
require('dotenv').config()
const app = express();
const port = process.env.PORT || 3000

/// Google Sheet 
const fs = require('fs');
const readline = require('readline');

app.use(express.json())
app.use(express.urlencoded({ extended: true }))
app.get('/', (req, res) => { res.status(200).send('Server is working.') })
app.listen(port, () => { console.log(` Server is running at http://localhost:${port}`) })

app.post('/bmi', (request, response) => {
    let params = request.body.sessionInfo.parameters;
    let height = getNumbers(params.height); // 170 cm from the example
    let weight = getNumbers(params.weight); // 60 kg from the example

    let bmi = (weight/(height/100*height/100));

    let fulfillmentResponse = {
        "fulfillmentResponse": {
            "messages": [{
                "text": {
                    "text": [
                        bmi 
                    ]
                }
            }]
        }
    };
    response.json(fulfillmentResponse);
});

// Extract number from string
function getNumbers(string) {
  string = string.split(" ");
  var int = ""; 
  for(var i=0;i<string.length;i++){
    if(isNaN(string[i])==false){
    int+=string[i];
    }
  }
 return parseInt(int);
}

package.json

       {
  "name": "server",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "start": "node index.js",
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {
    "dotenv": "^8.2.0",
    "express": "^4.17.1"
  }
}
  1. Разверните свой веб-перехватчик
  2. Добавьте URL-адрес веб-перехватчика в консоли Dialogflow CX

  1. Используйте веб-перехватчик на странице Dialogflow CX, где вам нужно будет установить ответ для вывода BMI:

Вот результат:

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