使用DialogFlow将聊天机器人集成到您的nodejs api中
#javascript #网络开发人员 #ai #google

简介
欢迎。本教程将指导您使用Dialogogflow将聊天机器人集成到node.js api中。随着对话AI的快速发展,聊天机器人已成为为用户提供交互式和个性化体验的重要组成部分。通过将聊天机器人集成到您的node.js api中,您可以增强应用程序的功能和参与度,从而使用户可以与自动对话代理无缝交互。

由Google Cloud提供支持的DialogFlow是一个强大的自然语言处理(NLP)平台,使开发人员能够构建智能的聊天机器人和虚拟助手。它提供了广泛的功能,包括语言理解,上下文管理和意图识别,使其成为创建对话界面的理想选择。通过将DialogFlow与Node.js API相结合,您可以利用其能力来了解用户查询,提供准确的响应并提供平稳的对话体验。

在本教程中,我们将探索将对话流程集成到您的node.js api中的分步过程。我们将介绍必要的设置,配置和实现步骤,使您可以与API端点无缝连接聊天机器人。无论您是建立客户支持系统,电子商务平台还是任何需要交互式通信的其他应用程序,本教程都将为您提供有效整合聊天机器人的知识和工具。

在本教程结束时,您将对如何将对话流程集成到node.js api,允许您的应用程序来处理用户查询,提供智能响应并提供更具吸引力和动态的用户体验。因此,让我们潜入并踏上这一激动人心的旅程。

创建代理
在使用DialogFlow之前,我们需要创建一个代理。因此,请访问Dialog flow开始。

接下来,创建一个代理并为其分配一个名称,例如我的第一聊天。

在菜单中显示,查找并单击齿轮图标 - (设置)。

在“一般菜单”下,向下滚动到项目ID字段,然后单击您的项目ID。

project ID

此操作将您将您重定向到Google-cloud的Google Cloud Console。

接下来,导航到IAM&Admin菜单并找到服务帐户子菜单。如果您尚未注册服务帐户,则需要创建一个新的帐户。

Creating a service account

要创建一个新的服务帐户,请为您的帐户输入合适的名称。默认情况下,将自动为您生成服务ID,但是您可以选择在需要时修改它。输入必要的详细信息后,单击“创建”按钮继续进行。创建服务帐户后,下一步是为其分配角色。此步骤对于授予必要的权限至关重要。在角色选择过程中,在“对话流”部分下搜索“ DialogFlow API客户端”,然后选择它。选择适当的角色后,单击“继续”进行。最后,单击“完成”以完成过程。

请注意,本教程中提供的图像可作为视觉参考,以帮助您找到正确的菜单和子菜单选项。接口的实际外观和布置可能会根据您使用的平台的版本或配置而有所不同。

成功创建了一个服务帐户后,下一步是获取您的配置键以进行进一步集成。

Manage keys

要下载配置密钥,请单击“管理密钥”选项。从下拉菜单中,选择“创建新键”。选择JSON格式,然后单击“创建”按钮。此操作将启动下载JSON文件,其中包含集成过程所需的所有必要配置属性。

configuration file

至关重要的是要注意,下载的JSON文件用作您的配置文件,保留成功集成所需的必要信息。因此,至关重要的是要确保该文件安全而不与任何人共享其内容。保护此敏感数据可确保您的聊天机器人集成的完整性和安全性。

太好了!现在让我们跳入我们的代码。

创建一个软件包。

npm init -y

安装以下软件包

npm i express dotenv uuid dialogflow

导入您之前下载的配置文件。现在您的项目设置应该看起来像这样:

Project set up

接下来,我们设置服务器并导入必要的依赖项。

const dotenv = require("dotenv").config()

const express = require("express")

const dialogflow = require("dialogflow")

const uuid = require('uuid');

const PORT = process.env.PORT || 7000


const projectId = process.env.PROJECT_ID || "small-talk-2-2-2-2"
const credentialsPath = process.env.CREDENTIALS_PATH || "./small-talk-2-2-2-2-5b3b3b3b3b3b.json"

process.env.GOOGLE_APPLICATION_CREDENTIALS = credentialsPath

const start = async () => {
    try {
        app.listen(PORT, () => {
            console.log(`Server has been started on port ${PORT}`)
        })
    } catch (error) {
      console.log(error)  
    }
}

start()

现在,让我们解释一下这里发生的事情:

如果未定义变量,则将变量设置为process.env.PROJECT_ID环境变量的值或“ small-talk-2-2-2-2”。

recredentialspath 变量正在设置为process.env.CREDENTIALS_PATH环境变量的值或“ ./ small-talk-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-2-3B3B3B3B3B.JSON”定义。

google_application_credentials 环境变量正在设置为凭证索索的值。该变量用于指定我们下载和导入的Google Cloud Service帐户凭据JSON文件的路径。

现在,由于我们正在加载.env文件的凭据,因此将凭据从JSON文件复制并粘贴到.env文件中很重要,并确保将所有凭据属性传播到一个变量中。

在.env文件中将凭据属性传播到一个变量(例如凭据)上,可确保将凭据分配给单个环境变量。这种方法简化了代码并增强了可读性。它还允许应用程序通过引用凭据环境变量来轻松访问凭据,而不是单独处理每个凭据属性。

您的.env文件现在应该看起来像:

env file

现在,我们将通过创建函数并配置处理传入请求和响应的路由来建立与DialogFlow的连接。

async function runSample() {
  // A unique identifier for the given session
  const sessionId = uuid.v4();

  // Create a new session
  const sessionClient = new dialogflow.SessionsClient();
  const sessionPath = sessionClient.sessionPath(projectId, sessionId);

  // The text query request.
  const request = {
    session: sessionPath,
    queryInput: {
      text: {
        // The query to send to the dialogflow agent
        text: 'Who are you?',
        // The language used by the client (en-US)
        languageCode: 'en-US',
      },
    },
  };

  // Send request and log result
  const responses = await sessionClient.detectIntent(request);
  const result = responses[0].queryResult.fulfillmentText;
  const queryText = responses[0].queryResult.queryText;

  if (result) {
        return {
            user: queryText,
            bot: result
        }
} else {
    return Error("No intent matched")
  }
}

const app = express()

app.get("/", async (req, res) => {
    try {
        const result = await runSample()
        return res.status(200).json({message: "Success", result})
    } catch (error) {
        console.log(error)
        return res.status(500).json({message: "Server error", error})
    }
})

在上面的代码中,正在采取以下操作:

定义了一个名为runSample()的异步函数。它执行以下任务:

  • 为会话生成一个唯一的标识符,sessionID。

  • 使用dialogflow.sessionsclient()。

  • 创建一个新的会话
  • 使用ProjectID和SessionID构建会话路径。

  • 定义一个文本查询请求,该请求包含要发送到
    的查询 对话流代理和语言代码。

  • 使用sessionclient.detectintent()将请求发送到对话流,并等待响应。

  • 从响应中提取履行文本和查询文本。
    如果存在履行文本,则使用用户查询返回对象和机器人的响应。否则,它返回一个错误,表明没有意图与查询相匹配。

  • 使用express()创建一个express.js应用程序,并存储在app variable中。

  • 使用app.get()为root URL(“/”)设置了一个路由。该路由被配置为执行以下任务的异步功能:

  • 调用 runsample()

  • 如果成功, runsample()功能的结果返回JSON响应,如果成功。

  • 记录过程中发生的任何错误,并在有错误消息的情况下返回带有错误消息的JSON响应。

总的来说,此代码在Express.js应用程序中设置了一条路由,该路由连接到对话流,发送查询并检索响应。然后将结果作为对客户端的JSON响应返回。在此过程中发生的任何错误都会记录并返回为错误消息。

我们的app.js文件现在应该看起来像这样:

const dotenv = require("dotenv").config()

const express = require("express")

const dialogflow = require("dialogflow")

const uuid = require('uuid');

const PORT = process.env.PORT || 7000

const projectId = process.env.PROJECT_ID || "small-talk-2-2-2-2"
const credentialsPath = process.env.CREDENTIALS_PATH || "./small-talk-2-2-2-2-5b3b3b3b3b3b.json"

process.env.GOOGLE_APPLICATION_CREDENTIALS = credentialsPath

async function runSample() {
  // A unique identifier for the given session
  const sessionId = uuid.v4();

  // Create a new session
  const sessionClient = new dialogflow.SessionsClient();
  const sessionPath = sessionClient.sessionPath(projectId, sessionId);

  // The text query request.
  const request = {
    session: sessionPath,
    queryInput: {
      text: {
        // The query to send to the dialogflow agent
        text: 'Who are you?',
        // The language used by the client (en-US)
        languageCode: 'en-US',
      },
    },
  };

  // Send request and log result
  const responses = await sessionClient.detectIntent(request);
  const result = responses[0].queryResult.fulfillmentText;
  const queryText = responses[0].queryResult.queryText;

  if (result) {
        return {
            user: queryText,
            bot: result
        }
} else {
    return Error("No intent matched")
  }
}

const app = express()

app.get("/", async (req, res) => {
    try {
        const result = await runSample()
        return res.status(200).json({message: "Success", result})
    } catch (error) {
        console.log(error)
        return res.status(500).json({message: "Server error", error})
    }
})

const start = async () => {
    try {
        app.listen(PORT, () => {
            console.log(`Server has been started on port ${PORT}`)
        })
    } catch (error) {
      console.log(error)  
    }
}

start()

现在让我们启动服务器并进行测试。如果一切都正确设置,我们将得到此响应:

API RESPONSE

响应是一个带有两个键值对的JSON对象:

消息”:“成功” - 这表明对Dialogflow的请求成功并收到了响应。

result ”:此键与两个键值对保持另一个JSON对象:

用户”:“你是谁?” - 这表示用户的查询或输入发送到DialogFlow。在这种情况下,用户问:“你是谁?”
bot ”:“你可以叫我索非亚。今天我该如何帮助您?” - 这是DialogFlow的自然语言处理产生的响应。它表明该机器人的名称是索非亚,并询问如何为用户提供帮助。

总的来说,响应证明了与DialogFlow的成功交互,在该dialogflow处理了用户的查询,并且该机器人以适当的答案做出了响应。

此时,我们的API功能齐全,可以与用户界面集成。但是,要优化我们的聊天机器人的性能,持续培训至关重要。这涉及在对话流仪表板中添加新的意图和响应,从而使聊天机器人可以处理更广泛的查询和交互范围。

让我们更改用户请求,看看我们将从代理商那里收到什么响应。

请求
request changed

响应

new response

当用户问一个我们的代理商不了解的问题时会发生什么?
好吧,有这样的预定义回答:

unknown

DialogFlow为自定义和集成提供了广泛的可能性。我们可以灵活地将聊天机器人纳入各种平台,例如Facebook,WhatsApp等。通过利用这些集成,我们可以通过不同的渠道吸引用户,并为他们提供个性化的对话体验。

此外,DialogFlow支持多语言功能,使我们能够以其首选的语言为用户提供服务。激活多语言支持可确保我们的聊天机器人可以与不同语言背景的用户有效地通信。

至关重要的是要强调我们聊天机器人的有效性取决于我们提供的信息质量。定期更新和完善培训数据,意图和响应有助于我们的代理商提高其在提供有意义且有用的互动方面的理解和准确性。

总而言之,通过不断训练我们的代理商并探索对话流的广泛特征,我们可以解锁许多可能性,以增强聊天机器人的功能和触及范围。利用不同的集成选项,例如社交媒体平台和多语言支持,使我们能够创建引人入胜的用户体验并有效地满足不同用户群的需求。请记住,我们聊天机器人的成功在于我们提供的知识和信息,因此持续的改进和适应是关键。