Python中如何使用Google Dialogflow聊天机器人的fulfillment在Google Actions上集成操作

此页面介绍了如何通过 Google 上的操作将 Dialogflow 聊天机器人连接到您的服务。Fulfillment 允许您将数据库中的动态数据显示给用户。

部署和启用 fulfillment

要启用 fulfillment:

  • 单击左侧菜单中的 Fulfillment。如果看不到导航,请单击左上角的菜单按钮。

  • 单击“内联编辑器”旁边的开关启用内联编辑器。

  • 使用此文件中的代码替换内联编辑器中的代码。 代码

  • 单击页面底部的“部署”。

您需要为创建第一个聊天机器人程序中创建的“ name ”意图启用 fulfillment:

  • 单击左侧菜单中的 Intents,然后单击“ name ”意图。

  • 向下滚动到 Fulfillment 部分,然后单击开关以启用它。

注意:启用 fulfillment 会覆盖在意图的“响应”部分中设置的响应。

  • 单击“保存”按钮。

创建一个处理程序

处理程序是您可以在整个代码中调用的函数。这些处理程序设置为在匹配特定意图时运行。

单击左侧菜单中的 Fulfillment 导航回到 Fulfillment 页面,然后查看代码。

最后一行应如下所示:

exports.dialogflowFirebaseFulfillment = functions.https.onRequest ( app )

这是一个来自 Dialogflow 的处理 HTTP 请求的函数,它使用 Cloud Functions for Firebase。

在以 exports.dialogflowFirebaseFulfillment 开头的最后一行上方添加以下代码:

app.intent('name', conv => {
  conv.ask('My name is Dialogflow!')
})

当 Dialogflow 与“ name ”意图匹配时,上面的代码会响应用户的查询。

要测试它,请单击页面底部的“部署”。完成后,输入“你的名字是什么?”来调用“名字”意图。进入右侧的模拟器。你应该看到你的新消息作为回应!

在 fulfillment 中使用实体和上下文

注意:本节中的任务需要具有 Dialogflow 实体和上下文的经验。确保您知道如何使用实体提取数据并在继续之前使用上下文管理状态。

实体

实体用于从用户的查询中提取参数值。您希望从用户的请求中获取的任何重要数据都必须具有相应的实体。

在“使用实体提取数据”指南中,您创建了“语言”意图来识别语言和编程语言。意图有参数 language 和 ProgrammingLanguages。

要访问这些参数:

  • 单击左侧菜单中的 Intents,然后单击“ Languages ”意图。

  • 在 intent 的 Fulfillment 部分下,单击“为此 intent 启用 webhook 调用”选项的开关。

  • 单击意图页面顶部的“保存”按钮。

  • 单击左侧菜单中的 Fulfillment。

现在,您将编写一些代码来处理 fulfillment 中的“语言”意图。在以 exports.dialogflowFirebaseFulfillment 开头的最后一行上方添加以下代码:

app.intent('Languages', (conv, {language, ProgrammingLanguage}) => {
  if (language) {
    conv.ask(`Wow! I didn't know you knew ${language}`);
  } else if (ProgrammingLanguage) {
    conv.ask(`${ProgrammingLanguage} is cool.`);
  } else {
    conv.ask(`What language do you know?`)
  }
});

在此代码中,您将检索参数 language 和 ProgrammingLanguages。当任一参数从 Dialogflow 发送到您的 fulfillment 中时,您构建与我们的 fulfillment 中相同的响应。如果没有发送参数,您可以使用其他响应来询问用户他们所知道的语言。

要试用它,请单击“部署”并通过说“我知道如何说德语”之类的方式调用“语言”意图。

上下文

上下文表示用户请求的当前上下文。这有助于区分可能含糊不清或具有不同含义的短语,具体取决于用户的偏好,用户的地理位置,应用中的当前页面或对话主题。

在具有上下文的管理状态指南中,您创建了“语言”意图的后续意图。如该页面所述,后续意图通过从父意图设置输出上下文并使用相同的上下文作为子意图的输入来工作。

为了在您的实现中正确模仿相同的行为,您需要设置与 Dialogflow 相同的输出上下文,具有相同的生命周期(在上下文处于活动状态的会话轮次)和参数。 使用 conv.contexts.set 方法修改处理程序以包含上下文:


app.intent('Languages', (conv, {language, ProgrammingLanguage}) => {
  if (language) {
    conv.ask(`Wow! I didn't know you knew ${language}`);
    conv.contexts.set('Languages-followup', 2, {language: language})
  } else if (ProgrammingLanguage) {
    conv.ask(`${ProgrammingLanguage} is cool.`);
    conv.contexts.set('Languages-followup', 2, {ProgrammingLanguage: ProgrammingLanguage})
  } else {
    conv.ask(`What language do you know?`)
  }
});

在此代码中,您将在上下文中添加名为“ languages-followup ”的输出上下文,生命周期为 2 轮,以及参数值( language 或 ProgrammingLanguages )以供以后检索。 单击“部署”以试用它。

要在 fulfillment 中检索上下文,可以使用 conv.contexts.get 方法或使用 app.getContexts 获取所有上下文的列表。 例如,如果要为“ languages-followup ”后续意图创建 fulfillment 处理程序,它将如下所示:

app.intent('Languages - custom', (conv, {duration}) => {
  const langContext = conv.contexts.get('languages-followup')
  const language = langContext.parameters.language || langContext.parameters.ProgrammingLanguage;
  conv.ask(`I can't believe you've know ${language} for ${duration.amount} ${duration.unit}!`);
});

英文原文: https://dialogflow.com/docs/getting-started/integrate-services-actions-on-google

聊天机器人: http://www.panchuangai.com


Python中如何使用Google Dialogflow聊天机器人的fulfillment在Google Actions上集成操作

3 回复

要使用Dialogflow fulfillment在Google Actions上集成操作,你需要设置一个webhook来处理来自Dialogflow的请求。以下是完整的实现步骤和代码示例:

首先安装必要的库:

pip install flask dialogflow-fulfillment

然后创建Flask应用来处理webhook请求:

from flask import Flask, request, jsonify
from dialogflow_fulfillment import WebhookClient, QuickReplies, Card, Text

app = Flask(__name__)

def handle_intent(agent: WebhookClient):
    """处理Dialogflow的意图"""
    intent_name = agent.intent.display_name
    
    if intent_name == 'WelcomeIntent':
        agent.add(Text('你好!我是你的助手,有什么可以帮你的?'))
    
    elif intent_name == 'GetWeather':
        # 这里可以调用天气API
        city = agent.parameters.get('city', '北京')
        agent.add(Text(f'{city}的天气是晴天,温度25度'))
    
    elif intent_name == 'QuickReplyDemo':
        agent.add(QuickReplies('请选择一个选项:', ['选项1', '选项2', '选项3']))
    
    elif intent_name == 'CardDemo':
        agent.add(Card(
            title='示例卡片',
            text='这是一个卡片示例',
            image_url='https://example.com/image.jpg',
            button_text='点击这里',
            button_url='https://example.com'
        ))

@app.route('/webhook', methods=['POST'])
def webhook():
    """处理Dialogflow webhook请求"""
    req = request.get_json(force=True)
    
    # 创建WebhookClient实例
    agent = WebhookClient(req)
    
    # 处理意图
    agent.handle_request(handle_intent)
    
    # 返回响应
    return jsonify(agent.response)

if __name__ == '__main__':
    app.run(debug=True, port=5000)

在Dialogflow控制台中的设置:

  1. 进入Dialogflow控制台,选择你的agent
  2. 点击"Fulfillment"菜单
  3. 启用"Webhook"
  4. 输入你的webhook URL(例如:https://your-domain.com/webhook
  5. 在意图设置中,启用"Enable webhook call for this intent"

对于本地开发,可以使用ngrok进行测试:

ngrok http 5000

在Google Actions控制台中的集成:

  1. 在Dialogflow中点击"Integrations"
  2. 选择"Google Assistant"
  3. 点击"Test"进入Actions on Google模拟器
  4. 配置你的Action名称、调用短语等信息

关键点:确保你的webhook能正确处理Dialogflow的请求格式,并返回正确的响应结构。使用dialogflow-fulfillment库可以简化响应构建过程。

总结:用Flask搭webhook,在Dialogflow里配好意图和调用就行。


前司做过 NLP 方面的工作,当时调研感觉这种类似的开放平台挺多的,还有一些是纯图形化操作,不过大部分的感觉还是很简单
NLP 在聊天方面的应用还是太难,就智能客服,FAQ 可以上。突破感觉还是看 alexa 和小冰吧,他们两个在两个不同的方向都做的挺好的

现在开放平台使用挺简单的了。

回到顶部