扩展Dialogflow聊天机器人的能力:连接到OpenAI GPT API

Dialogflow来自谷歌的是一个聊天机器人开发框架,可以帮助您快速开始开发一个机器人,而无需依赖复杂的代码或机器学习模型。在本文中,我将概述使用Dialogflow构建聊天机器人并使用Python建立webhook连接的逐步过程。

ChatGPT中文站

Webhooks使不同平台之间实现无缝集成,并允许我们在机器人上添加一层。与外部平台集成允许聊天机器人进行复杂操作,获取实时信息,并从各种来源访问数据。

我们在建造什么?

在这篇文章中,我们将创建一个聊天机器人,通过我们的webhook连接到OpenAI,并将响应发送给用户。通过阅读本文,您将了解如何将第三方平台与您的Dialogflow聊天机器人无缝集成。

ChatGPT中文站

我们将使用Python编写我们的Webhook功能,并使用Replit托管代码。Replit是一个集成开发环境,可以用来托管我们的功能逻辑。

Replit 可以是设置和尝试 Webhook 连接的有效选择。这将为我们提供一个 URL,我们可以将其连接到 Dialogflow。但是请记住,Replit 通常不推荐用于生产目的。

使用Dialogflow入门

要开始,请在Dialogflow中创建一个账户。代理程序负责与最终用户/客户进行对话。它会分析用户的输入/查询,并使用预建的回复进行回应。

创建一个代理: 在Dialogflow屏幕上,点击“+ 创建代理”按钮,然后您应该给代理取一个名字并保存。现在,您的代理已创建成功。

ChatGPT中文站
Dialogflow Homepage

使用意图进行工作

意图用于将用户的意图分为不同的类别。Dialogflow的默认意图有两个。

  • 默认欢迎意图:默认欢迎意图通常用于发送欢迎消息或介绍。
  • 默认的回退意图:当代理程序无法将用户的输入与指定的意图匹配时,将触发此意图。它为意外查询提供一个通用的响应。

点击“创建意图”以创建您的第一个意图。

ChatGPT中文站
Create your first intent

在那里,您需要提供

  • 意图名称
  • 训练短语:一组可能被聊天机器人最终用户提问的短语。
  • 操作:操作是与意图匹配时可以执行的任务或操作,与履行或网络钩子功能相关联。
  • 参数:参数用于从用户的输入中提取特定信息,并将其与意图匹配。允许聊天机器人只收集完成用户请求所必需的重要细节。

尽管动作和参数是可选组件,但它们在提高机器人的性能方面扮演着关键角色。

ChatGPT中文站

跟进意图:这些意图会自动设置上下文,继承自父意图的上下文。

使用OpenAPI和GPT API进行工作

让我们看看如何将这个聊天机器人与OpenAI集成起来。为此,您应该拥有一个OpenAI API密钥。要生成OpenAI API密钥,请按照以下步骤操作:

  1. 去OpenAI的网站注册一个账号,如果你还没有的话。
  2. 一旦您登录,您需要在“应用”页面上选择API。
  3. 在主页上,单击右上角的个人资料图标。从下拉菜单中选择“查看 API 密钥”。您可以在那里找到您的 API 密钥。

在Replit中设置逻辑

现在您已经获得了您的OpenAI API密钥,是时候设置开发环境了。

1. 创建一个新的Repl

去Replit并创建一个新的repl。选择Python作为模板语言,并给你的repl起一个名字。

ChatGPT中文站

2. 创建OpenAI助手

创建一个名为“helper”的文件夹,并添加一个名为openai_api.py的文件。我们需要以下库来使用OpenAI。

  • 开放AI - 访问OpenAI SDK的库
  • dotenv — 从环境文件中访问变量的库

创建一个名为text_completion的函数,该函数接收提示字符串并调用OpenAI API来使用openai.Completion.create方法。

import os
import openai
from dotenv import load_dotenv

load_dotenv()

openai.api_key = os.environ['OPENAI_KEY']

def text_completion(prompt: str) -> dict:
'''
Call Openai API for text completion
Parameters:
- prompt: user query (str)
Returns:
- dict
'''
try:
response = openai.Completion.create(model='text-davinci-003',
prompt=f'Human: {prompt}\nAI: ',
temperature=0.9,
max_tokens=150,
top_p=1,
frequency_penalty=0,
presence_penalty=0.6,
stop=['Human:', 'AI:'])
return {'status': 1, 'response': response['choices'][0]['text']}
except:
return {'status': 0, 'response': ''}

这个代码块使用了必要的模块 'os'、'openai' 和 'dotenv',从环境变量获取 API 密钥,与 OpenAI 进行交互并将返回值作为文本返回。

3. 设置 Webhook 的路由

创建一个名为"src"的新文件夹。在该文件夹中,创建一个名为app.py的文件。这个文件将包含与OpenAI API进行文本补全交互的路由。

  • “/” - 此路由定义了Flask应用的主页路由。当访问时,返回字符串“OK”。
@app.route('/')
def home():
return 'OK'
  • “/dialogflow/es/receiveMessage”是主要路由,用于处理来自Dialogflow的POST请求。它接收请求中的JSON数据,使用query_text调用text_completion函数,并打印结果。根据结果状态,它返回一个带有履行文本的JSON响应。
  • @app.route('/dialogflow/es/receiveMessage', methods=['POST'])
    def esReceiveMessage():
    try:
    data = request.get_json()
    result = text_completion(query_text)

    if result['status'] == 1:
    return jsonify(
    {
    'fulfillmentText': result['response']
    }
    )
    else:
    return jsonify(
    {
    'fulfillmentText': "Couldn't fetch response for query: " + query_text
    }
    )
    except:
    print("an error occurred")
    pass
    return jsonify(
    {
    'fulfillmentText': 'Something went wrong.'
    }
    )

    这是app.py的完整代码。


    from flask import Flask, request,jsonify
    from helper.openai_api import text_completion

    app = Flask(__name__)

    @app.route('/')
    def home():
    return 'OK'

    @app.route('/dialogflow/es/receiveMessage', methods=['POST'])
    def esReceiveMessage():
    try:
    data = request.get_json()

    result = text_completion(query_text)
    print(result)

    if result['status'] == 1:
    return jsonify(
    {
    'fulfillmentText': result['response']
    }
    )
    else:
    return jsonify(
    {
    'fulfillmentText': "Couldn't fetch response for query: " + query_text
    }
    )
    except:
    print("an error occurred")
    pass
    return jsonify(
    {
    'fulfillmentText': 'Something went wrong.'
    }
    )

    4. 设置环境变量

    现在,您需要将API密钥添加到秘密中。这样,它就不会被滥用。

    • 在左侧边栏中,在“工具”栏下方,点击“秘密”图标以打开“秘密”页面。
    • 从那里,选择 '新密码' 并在 '密钥' 字段中输入 API 名称(OPENAI_KEY),在 '值' 字段中输入相应的 API 密钥。

    4. 运行Flask应用程序

    创建一个main.py文件。在这里初始化一个简单的Flask应用并在端口5000上运行它。

    from src.app import app

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

    上面的代码在指定的端口和主机上运行Flask应用程序,并启用调试模式用于开发。运行此代码后,所需的包将自动安装。

    你会得到这样的回答。

    ChatGPT中文站

    在您的浏览器中打开此链接。然后,复制URL。

    ChatGPT中文站

    将URL粘贴到Dialogflow履行中,后面跟着"/dialogflow/es/receiveMessage"作为路径。

    启用Fallback Intent上的Webhook。因此,当用户发送一条机器人无法理解的消息时,将触发Fallback Intent,并向Webhook发送一个请求。

    ChatGPT中文站
    Enable fulfillment on Fallback Intent

    现在,让我们检查它是否工作。在这里,用户说“你好”,响应将从默认欢迎意图触发。

    ChatGPT中文站
    Default Welcome Intent

    当用户提出像“什么是人工智能?”这样不符合任何特定意图的问题时,它将落入回退意图,并触发 webhook 从 OpenAI 返回响应。

    ChatGPT中文站
    IIustration: User Query and OpenAI Response
    ChatGPT中文站
    Fulfillment Status

    当Webhook成功执行时,您点击履行状态下的诊断信息,会出现如下情况。

    我希望你现在已经对Webhook履行和聊天机器人如何与OpenAI集成有了扎实的理解。

    2023-10-20 17:18:41 AI中文站翻译自原文