网站建设与规划实训报告,企业网站策划建设方案,wordpress主题 直接拖拽式建站,wordpress 同步phpcms1. 背景介绍 这个实验室的目标是让你了解并使用Google的Dialogflow服务。Dialogflow是一个可以让你创建聊天机器人的服务#xff0c;这个过程不需要或者只需要很少的编程技能。
1.1 账号的创建 为了完成这个实验室#xff0c;你需要在以下网站上创建账号#xff1a…1. 背景介绍 这个实验室的目标是让你了解并使用Google的Dialogflow服务。Dialogflow是一个可以让你创建聊天机器人的服务这个过程不需要或者只需要很少的编程技能。
1.1 账号的创建 为了完成这个实验室你需要在以下网站上创建账号
1.1 Dialogflow Dialogflow: www.dialogflow.com 如果你有Google账号可以直接使用它登录
1.2 ngrok ngrok: www.ngrok.com 同样如果你有Google账号可以使用它登录。 完成ngrok的账号创建后下载与你的操作系统相对应的安装程序并在你的电脑上安装它。接着访问网址https://dashboard.ngrok.com/get-started/setup/macos找到“tab AuthenticationYour Authtoken”标签页并复制命令行。 苹果系统 使用以下命令通过 Homebrew 安装 ngrok brew install ngrok/ngrok/ngrok 运行以下命令将您的 authtoken 添加到默认的ngrok.yml配置文件中。
ngrok config add-authtoken 2biVXhWVYnruFK4jVDsdEc6Eutp_3JcWjV6eQMvL32TtTf5VN
记录ngrok 下载地址 /usr/local/bin 如果你打算在本地服务器上使用Python编程那么你还需要安装Flask包 pip3 install Flask --user 要在Dialogflow下创建一个聊天机器人你需要完成以下四个步骤 1. 在纸上设计对话流程 2. 在Dialogflow中创建一个代理agent添加意图intentions、动作actions、参数parameters、实体entities、上下文contexts 3. 设置与你机器上的服务器的通讯 4. 在服务器层面编写代码以便与聊天机器人对话并为其提供信息。 我已经为一个旅行预订聊天机器人准备了一些数据你可以使用这些数据或者创建另一个难度相当的聊天机器人。 2. 设计对话 设计对话的第一步是在纸上绘制出所有可能的交互图谱展示在所需对话中两个参与者之间的所有可能互动。首先记录标准情况即信息顺利提供交流顺畅的情况然后预测可能由人类给出错误答案的情况以及人类对其决策进行反悔的情况等。 一旦考虑了所有的分支情况就需要用不同颜色标记两个参与者的意图以及交换的信息即对应不同类型值的“实体”如日期、数量、产品等。 只要人类的回答有所不同我们就可以编写一个简单的对话在这个对话中分析回答并检测意图。但是一旦在对话的两个不同位置发现相同的潜在回答例如“是”我们就需要定义上下文。因此意图的检测将在给定的上下文中进行并导致转移到另一个上下文。 当你的对话在纸上用回答、意图、实体和上下文标记完整后就可以开始实施了。在实施过程中保持这张纸张在身边并在图谱上进行测试看看Dialogflow如何跟随所绘制的图谱。尝试让聊天机器人陷入困境。 在语言学课上我们会看到Grice的会话原则支配着人类的对话理想情况下聊天机器人也应遵循这些原则。 我们的项目是建立一个旅行社预订对话 • Human: Hi, • Machine: What can I do for you? • Human: I need to travel • Machine: How would you like to travel? • Human: By (plane|train|bus|...) • Machine: Where are you leaving from? • Human: From (Brest|...) • Machine: What is your destination? • Human: Honolulu • Machine: When do you wish to travel? • Human: Next Friday • Machine, once all information has been gathered: So you wish to travel from [...] to [...] on [...], via [...], is that correct? • Human: (Yes|No) • Machine, if yes: Thank you very much for your booking. (Data are sent to the server.) • Machine, if no: Sorry you changed your mind. 我们的目标是实现这种行为以及更好的功能如果关于方式、起点、目的地和日期的信息同时给出那么这些信息也会被收集。 3. 具体流程 在Dialogflow的网页上我们访问 https://dialogflow.cloud.google.com/#/getStarted 来开始创建一个代理。我们为其选择一个名称、一种语言以及一个时区。 创建完成后我们需要提供
3.1 实体Entities 实体在Dialogflow中用于识别用户对话中的关键信息。在这个例子中涉及两个主要实体出行方式和二元答案是或否。 步骤如下 1. 创建名为travelmode的实体我们首先点击“实体(Entities)”按钮然后点击右侧的“”号输入实体名称“travelmode”。在接下来的空白行中我们将输入所有可能的出行方式类型并在右侧填写它们的同义词。例如飞行flight的同义词包括飞机plane、飞机aeroplane和航班airflight火车train的同义词包括铁路railways公交车bus的同义词包括道路交通road transportation船ship的同义词包括海sea和小船boat。 2. 保存实体完成实体及其同义词的输入后不要忘记点击“保存(Save)”以保存这些信息。 3. 创建二元答案实体我们还需要创建一个名为“choice”的实体用于识别用户的是或否回答。点击“创建实体(CREATE ENTITY)”并为其添加值“yes”和“no”以及它们的同义词比如“绝对是(absolutely)”、“绝对不(definitely not)”、“好的(ok)”、“当然(sure)”等。 通过这样的设置Dialogflow代理能够理解和处理用户关于出行方式的查询以及接收用户的确认或否认回答。这对于创建流畅的对话体验至关重要。
3.2 意图Intents 这段文字描述的是在Dialogflow中创建和配置意图Intents的过程特别是默认欢迎意图Default Welcome Intent和默认后备意图Default Fallback Intent。意图包含一个或多个训练短语、一个动作名称、参数和响应
3.2.1 默认欢迎意图Default Welcome Intent 这是当用户开始与代理交互时触发的意图。它通常包含一系列的预定义问候语。在Dialogflow中设置这个意图时选择the Default Welcome intent 勾选这个复选框并双击相应的行然后可以看到并编辑一系列预定义的问候语比如“What can I do for you?”设置完成后记得保存。
3.2.2 默认后备意图Default Fallback Intent 当代理不能匹配到用户说话中的任何其他意图时将触发这个后备意图。它通常用于告诉用户代理没有理解他们的意图并可以提示用户重新表述他们的请求。
3.2.3 创建新的意图 在设置了默认欢迎意图之后你需要创建具体的意图来处理用户的特定请求。例如你可能会创建一个名为“Travel”的意图来处理与旅行相关的请求。要创建这样一个意图你需要到“Intents”菜单点击“创建意图Create Intent”并给它命名。 接下来你需要提供该意图的特征性句子并确保其中的实体能被正确识别。这可以通过点击“添加用户表达Add user expression”来完成并添加如“I have to go to Berlin”或“I need to travel from Nantes to Strasbourg”这样的句子。 这个过程是为了让Dialogflow代理能够理解用户的意图并做出适当的响应。训练短语是教导代理如何识别特定用户请求的示例。动作名称、参数和响应则用于定义代理在识别到意图后应当执行的动作和给出的答复。通过这种方式你可以为代理配置一系列不同的意图以处理各种用户可能提出的请求。 当你在Dialogflow中输入示例句子时如果系统识别出了城市名称它会自动将这些名称标记为内置系统实体sys.geo-city的值。对于这些自动识别的值你需要创建参数 对于第一个城市名称起点你需要创建一个参数并命名为“origin”通常会用粉红色来标记。 对于第二个城市名称目的地创建另一个参数并命名为“destination”通常会用紫色来标记。 你还需要为旅行方式和日期创建参数这些参数的类型分别是travelmode和sys.date并将它们分别命名为travelmode和date。 在你将这些参数标记为“必需REQUIRED”之后如果用户在对话中没有提供这些信息系统就会询问用户这些问题来获取这些值。你设置的参数顺序将决定系统询问这些问题的顺序。 此外你还需要为用户提供一个响应。这个响应会在所有必要信息被收集完毕后给出。例如“So you wish to travel from $origin to $destination on $date, via $travelmode, is that correct?”这里的带有美元符号的变量代表着收集到的参数值。 3.2.4 第二个意图 接下来你需要构建一个名为“确认Confirmation”的第二个意图。当用户回复确认所提供的信息是正确的时用户的回复将是二元的即是或否系统必须能够识别出这个“是”或“否”是对预订信息的确认。为了实现这一点你需要使用上下文Context。上下文可以帮助系统理解这个简单的“是”或“否”回复是在确认预订的特定环境中给出的。
3.3 上下文Contexts 在Dialogflow中上下文Contexts是用来保存用户与代理之间对话的状态信息的。上下文分为输入上下文Input Contexts和输出上下文Output Contexts两种
3.3.1 输出上下文Output Context 可以附加到一个意图Intent上。 当一个意图被触发后它可以设置一个或多个输出上下文这些上下文会影响接下来哪个意图可能会被激活。 输出上下文相当于告诉Dialogflow“在这个对话的下一个回合中如果用户说了某些话你应该考虑这个上下文信息来理解他们的意图”。
3.3.2 输入上下文Input Context 在创建或编辑一个意图时可以指定一个或多个输入上下文这些输入上下文必须已经在之前的对话中被设置为输出上下文。 输入上下文相当于一个先决条件只有当这个上下文存在时意图才能被触发。 通过使用上下文Dialogflow可以处理更复杂的对话流程使得即使是非常通用的用户表达如“是”或“否”也能在对话的特定点得到正确的理解。例如如果用户在预订流程的确认步骤中说“是”Dialogflow可以理解这是对预订确认的肯定回答而如果用户在被问及是否需要帮助时说“是”Dialogflow则会理解这是在请求帮助。 Dialogflow中的上下文有一个持续时间的概念最长可以持续20分钟。如果在这段时间内没有被更新那么上下文会自动清除Dialogflow就会“忘记”这些上下文信息。这意味着代理不会永久记住对话的每个环节除非开发者通过编程方式去维护和更新上下文的状态。
3.4 Fulfillment 在Dialogflow中Fulfillment是一个功能它允许每个意图在被触发时与一个外部的服务器进行交云。这通常用于处理复杂的逻辑、与外部API交互、访问数据库或执行一些不适合直接在Dialogflow中处理的任务。
3.4.1 启用Fulfillment 对于一个特定的意图你可以选择是否启用Fulfillment。如果启用当这个意图被触发时Dialogflow会向你指定的URL发送一个webhook请求。
3.4.2 设置Fulfillment 在Dialogflow的左侧面板中找到并点击“Fulfillment”部分。 在这里你需要启用“Webhook”选项并且输入你的服务器端点URL。
3.4.3 发送JSON数据 当一个意图触发Fulfillment时Dialogflow会使用POST方法向你的服务器发送JSON格式的数据。 这个数据包含了触发意图的用户的原始输入、解析出的参数、意图的信心分数等信息。
3.4.4 Webhook响应 你的服务器在接收到Dialogflow的请求后需要对其进行处理并返回一个JSON格式的响应。 这个响应可以包含返回给用户的文本消息也可以包含其他复杂的指令如设置上下文、触发事件等。 例如用户说“是的”触发了名为“Confirmation”的意图Dialogflow会发送一个包含所有必要预订参数的JSON数据到你的服务器。这个数据中包含了用户的确认信息、预订的起始地、目的地、旅行方式、日期等信息。 然后你的webhook服务器简洁地回复了一条消息
{fulfillmentText: Thank you very much for your booking.
} 这条消息随后会被Dialogflow处理并显示给用户作为回答。这样Fulfillment就连接了Dialogflow代理和你的服务逻辑实现了代理的扩展和集成。 如下是一个事例
{
responseId: ac201302-9fe4-4ba2-b83d-50de537ab5f8-59c3eb0f,
queryResult: {
queryText: Yes,
parameters: {
choice: yes
},
allRequiredParamsPresent: true,
fulfillmentText: Thank you very much for your booking.,
fulfillmentMessages: [
{
text: {
text: [
Thank you very much for your booking.
]
}
}
],
outputContexts: [
{
name: projects/travel-lcky/agent/sessions/846564dc-8fc3-eae6-9349-8347e4a95b30/contexts/confirmation,
lifespanCount: 5,
parameters: {
origin: Caracas,
origin.original: Caracas,
destination: York,
destination.original: York,
travelmode: train,
travelmode.original: Train,
date: 2021-02-03T12:00:0001:00,
date.original: Tomorrow,
choice: yes,
choice.original: Yes
}
},
{
name: projects/travel-lcky/agent/sessions/846564dc-8fc3-eae6-9349-8347e4a95b30/contexts/__system_counters__,
parameters: {
no-input: 0,
no-match: 0,
5
choice: yes,
choice.original: Yes
}
}
],
intent: {
name: projects/travel-lcky/agent/intents/c718acfb-e050-4dda-8c9b-e7e0c940baf9,
displayName: Confirmation2,
endInteraction: true
},
intentDetectionConfidence: 1,
languageCode: en
},
originalDetectIntentRequest: {
source: DIALOGFLOW_CONSOLE,
payload: {}
},
session: projects/travel-lcky/agent/sessions/846564dc-8fc3-eae6-9349-8347e4a95b30
}
To this, our webhook (see Section 3 for the code) has answered very laconically by
{
fulfillmentText: Thank you very much for your booking.
} 4. 与本地服务器的通信 本节讲述了如何与本地服务器进行通信我们使用Python设置本地服务器。当然你也可以选择其他编程语言主要任务是读取JSON数据分析它并以JSON格式响应。例如除了本地Python服务器还可以使用学校的PHP平台并通过ngrok进行重定向。 我们开始搭建一个能够处理Dialogflow webhook请求的本地服务器环境。通过这样的服务器你可以对Dialogflow从用户那里收集到的数据进行更复杂的处理并根据分析结果返回响应。这对于创建更加动态和交互性强的对话体验非常有帮助。 使用Python是因为它的简洁性和广泛的应用但核心概念和流程对于使用其他语言如PHP的服务器设置同样适用。关键在于正确处理进来的JSON格式的请求数据并返回一个符合Dialogflow webhook格式要求的JSON响应。
具体步骤
4.1 选择工作目录 首先你需要去到一个用于存放文件的目录。需要注意的是出于安全考虑不应选择存放个人数据的目录。
4.2 创建Python文件 在选定的目录中创建一个名为app.py的Python文件。如下
# import flask dependencies
from flask import Flask, request, make_response, jsonify# initialize the flask app
app Flask(__name__)# default route
app.route(/)
def hello_world():return Hello World!# function for responses
def results():# build a request objectreq request.get_json(forceTrue)# fetch action from jsonaction req.get(queryResult).get(parameters).get(pizza)# return a fulfillment responsereturn {fulfillmentText: uLa pizza qui vous intéresse est : str(action)}# create a route for webhook
app.route(/webhook, methods[POST, GET])
def webhook():# return responsereturn make_response(jsonify(results()))# run the app
if __name__ __main__:app.run(debugTrue)
4.3 设置Flask应用 在控制台中导航到你放置app.py文件的目录。 通过输入以下命令来设置Flask环境变量
export FLASK_APPapp.py 指定Flask应用的入口文件。
export FLASK_ENVdevelopment 设置Flask运行在开发环境启用调试模式。 输入flask run来启动Flask服务器。如果提示找不到flask命令可能是因为Flask安装在系统路径之外的目录中。你可能需要找到Flask的安装位置并相应地调整系统路径。 例如
/usr/local/Cellar/python3.9/3.9.1/Frameworks/Python.framework/Versions/3.9/bin/flask
4.4 Flask服务器运行情况 控制台将显示服务器运行的信息包括环境设置、调试模式状态和服务运行的本地地址默认是http://127.0.0.1:5000。 * Serving Flask app app.py (lazy loading)* Environment: development* Debug mode: on* Running on http://127.0.0.1:5000/ (Press CTRLC to quit)* Restarting with watchdog (fsevents)* Debugger is active!* Debugger PIN: 496-665-426 保持这个控制台窗口开启不要关闭。
4.5 使用ngrok进行外部访问转发 在另一个终端窗口中导航到你解压ngrok的位置。
./ngrok http http://127.0.0.1:5000 输入上方命令来启动ngrok它会创建一个公网可访问的URL并将请求转发到你的本地服务器。 ngrok会提供一个HTTPS格式的公网URL例如https://27f95cd2.ngrok.io这是用于外部访问你的本地服务器的地址。例如
ngrok (CtrlC to quit)Build better APIs with ngrok. Early access: ngrok.com/early-access Session Status online
Account liujingze888888gmail.com (Plan: Free)
Version 3.5.0
Region Europe (eu)
Latency 41ms
Web Interface http://127.0.0.1:4040
Forwarding https://269d-89-234-160-214.ngrok-free.app - http://127.0.0.1:5000 Connections ttl opn rt1 rt5 p50 p90 0 0 0.00 0.00 0.00 0.00
4.6 在Dialogflow中配置Fulfillment 将ngrok提供的HTTPS URL加上/webhook后缀非常重要不要遗忘/webhook复制到Dialogflow的Fulfillment页面中的URL字段。 点击“保存”完成配置。
4.7 开始修改代码吧 现在你的本地服务器就可以接收来自Dialogflow的请求并返回响应了。我们拥有了完全的自由来编写Python代码分析传入的请求并做出适当的响应.这为你提供了极大的自由度来编写Python代码分析传入的请求并做出适当的响应你可以在https://cloud.google.com/dialogflow/docs/fulfillment-how 上找到更多信息包括本地服务器的响应也可以改变上下文使用output_contexts[]键、发送一个将触发另一个意图的“事件”等。响应必须在64kb以下并且在收到请求后的10秒内到达Dialogflow对响应时间有要求。
主要基于Dialogflow的使用只需要很少的本地编程或者使用Dialogflow作为仅识别意图的外壳并且所有其他的处理都在本地完成 5. 分析python代码 这段代码是一个简单的Flask应用的示例用于创建一个本地服务器。以下是该Python代码的详细解释
5.1 导入Flask依赖 使用from flask import Flask, request, make_response, jsonify来导入Flask框架所需的依赖项。
5.2 初始化Flask应用 app Flask(__name__)初始化一个Flask应用实例。
5.3 默认路由 使用app.route(/)装饰器定义一个路由。当访问http://127.0.0.1:5000/时这个路由会被触发。 def hello_world(): return Hello World!定义了一个函数当访问根路径(/)时返回Hello World!字符串。
5.4 路由装饰器 app.route 是一个Python装饰器用于修改紧随其后的函数。它的参数是查询中请求的路径。在这里它指的是Flask执行的“目录”的根路径。当我们看到以/webhook结尾的URL时我们可能会误以为我们将进入一个名为webhook的目录实际上并非如此Flask拦截我们向服务器请求的URL并使用它来执行紧随装饰器之后的函数这里是hello_world函数名可以是任意的。
5.5 响应函数 定义了一个results函数该函数用于检索附加到请求的JSON数据并将其存储在req中。然后它遵循JSON结构来获取键值choice并将其存储在resu中。注意当变量resu接收其值时其类型为None使用它之前必须将其转换为字符串。最后我们创建一个字典条目其键是fulfillmentText其值是我们想要发送的字符串最后我们将这个字典作为函数的输出返回。
5.6 为webhook创建路由 使用app.route(/webhook, methods[POST, GET])装饰器定义一个webhook路由并激活POST和GET方法。我们给它的函数是make_response并向其提供results函数如上定义的json化输出。
5.7 运行应用 if __name__ __main__: app.run(debugTrue)这段代码表明如果应用作为主程序执行而不是作为另一个应用的模块则名称将是__main__因此我们将启动应用。这三行代码对我们来说并不重要。 总的来说这段代码展示了如何使用Flask创建一个简单的Web服务器以及如何定义路由来处理不同的HTTP请求并根据请求返回相应的响应。 6. 修改后的python代码
# import flask dependencies
from flask import Flask, request, jsonify# initialize the flask app
app Flask(__name__)# default route
app.route(/)
def hello_world():return Hello World!# function for responses
def results():# build a request objectreq request.get_json(forceTrue)# fetch parameters from jsonparameters req.get(queryResult).get(parameters)# Check if the users choice or queryText is yesuser_says req.get(queryResult).get(queryText).lower() # Convert to lower case to ensure consistency# Initialize an empty response_dataresponse_data {}# Check if the user said yesif user_says yes:# Construct the response for yesresponse_data {fulfillmentText: Thank you very much for your booking.}else:# Handle other inputs: you might want to fetch other parameters or construct a default responseorigin parameters.get(origin)destination parameters.get(destination)travelmode parameters.get(travelmode)date parameters.get(date)response_data {origin: origin,destination: destination,travelmode: travelmode,date: date,}print(Sending response data to Dialogflow:)print(response_data)# Directly return the constructed JSON datareturn response_data# create a route for webhook
app.route(/webhook, methods[POST, GET])
def webhook():# directly return jsonify of results()return jsonify(results())# run the app
if __name__ __main__:app.run(debugTrue)记得开启 7. 测试结果 8. 知识拓展——Small Talk 小谈话Small Talk在Dialogflow的上下文中指的是一种社交性的对话模式旨在进行非信息性的社交互动而不是交换实际信息。这种模式更多地是关于日常的寒暄或打招呼比如聊天气、个人感受等。这与Smalltalk编程语言不同后者是一种在1972年于施乐公司Xerox创建并曾经在一些学校教授的面向对象编程语言。 在Dialogflow中可以通过侧边栏中的“Small Talk”选项来激活这个功能。启用后代理Agent将能够自动处理用户的常见非信息性问题如“我睡不着”或“你多大了”。Dialogflow的小谈话功能内置了一系列预定义的回答用于响应用户的这类问题从而不需要开发者额外编写这部分对话逻辑。 Eliza是一个更早的程序用于模拟罗杰斯心理治疗师Rogerian psychotherapist它通过反问用户来引导对话。它是人工智能早期的一个里程碑展示了机器能够如何模仿人类的非信息性交流。 两者的区别在于 Dialogflow的小谈话功能提供了更加人性化和多样化的预设回复让聊天机器人能够更自然地融入日常对话中。 Eliza通过特定的对话模式来模仿心理治疗师通过反问用户的问题旨在让用户自己探索自己的想法和感受。 如果你有兴趣了解这些早期的人工智能对话系统Eliza是一个很好的起点它提供了一个简单的模型来理解机器是如何尝试模拟人类的对话的。而Dialogflow的小谈话功能则体现了在这方面取得的进步它提供了更多预设的社交寒暄回复可以直接集成在现代的聊天机器人中。