在处理依赖多个变量的问题时,传统的问答模型往往表现不佳。现代搜索引擎通常无法处理这类请求,需要从零散的信息中搜索,然后尝试过滤和组合相关部分。听起来很耗时,不是吗?
随着聊天机器人(简称“机器人”)的出现,这种问答模型正在迅速发展。本文讨论了为印度新引入的商品和服务税(GST)开发信息提取机器人的过程。作为一个相对较新的概念,许多人仍在尝试理解其工作原理。聊天机器人可以以自然和对话的方式提供此类信息。本文展示了构建一个回答GST相关问题的聊天机器人的过程。让将这个机器人称为GST-FAQ机器人!
为了更深入地了解GST,比如如何申请注册、税率等级等,公司在其网站上发布了常见问题解答(FAQ)。浏览这些信息可能是一个痛苦的过程。在这种情况下,聊天机器人变得非常方便和有效,因此变得非常受欢迎。
如今,自然语言处理(NLP)特别是其组成部分自然语言理解(NLU),使得机器人能够更好地理解语言和上下文。它们在理解搜索的含义方面变得更加智能,并且能够返回非常具体的、基于上下文的信息。
RASA-NLU构建了一个本地NLU(自然语言理解)模型,用于从对话中提取意图和实体。它是开源的、完全本地的,最重要的是,它是免费的!它还与wit.ai、LUIS或api.ai兼容,因此可以将聊天应用程序数据迁移到RASA-NLU模型中。
下面是一个如何安装RASA-NLU并在Python中构建一个简单的FAQ机器人的演示。
聊天机器人是一个客户端-服务器应用程序。在RASA-NLU的情况下,甚至服务器也可以是本地的。客户端只不过是聊天机器人用户界面。通过以下图表可以理解交互和架构:
RASA可以安装和配置在独立机器上。安装步骤如下:
pip install rasa_nlu
可以在这里查看最新的文档。RASA-NLU由几个组件组成,每个组件执行一些特定的工作(意图检测、实体提取等)。每个组件可能有一些特定的依赖项和安装。可以选择MITIE(NLP + ML)、Spacy和Sklearn等选项。将在这里使用Spacy-Sklearn。
客户端用户界面可以是网页(使用Python中的Flask框架)或移动应用程序。Flask编码简单且运行在本地。使用
pip install flask
并遵循此教程以基本了解该框架。
RASA-NLU平台在开始使用之前需要进行训练。需要向它提供几个句子,并指出其中哪些是意图和实体。
意图是句子的动作/类别,实体是完成动作所需的必要变量。例如,“想预订3月27日从孟买飞往浦那的航班”有“flight-booking”作为意图,“孟买”、“浦那”和“3月27日”作为实体。同样,可以使用许多训练示例,以便RASA-NLU模型在不同方式上从领域对话中提取意图/实体。这个训练数据存储在一个json文件中,一个样本可以在
这里查看。它包含许多条目。其中一个样本条目如下所示:
{
"text": "show me a mexican place in the centre",
"intent": "restaurant_search",
"entities": [
{
"start": 31,
"end": 37,
"value": "centre",
"entity": "location"
},
{
"start": 10,
"end": 17,
"value": "mexican",
"entity": "cuisine"
}
]
}
以下是上述代码中提到的一些字段的解释:
text:输入句子。
intent:动作或类别,在这个例子中是“restaurant_search”。这通常是回调函数的名称。
entities:实体数组。这里有两个。一个是类型为‘location’,值为‘centre’,另一个是类型为‘cuisine’,值为‘mexican’。‘start’和‘end’指定句子中单词的开始和结束索引。
也可以使用以下在线工具生成此json文件:
构建GST聊天机器人应用程序的服务器端步骤:
创建一个新目录并导航到其中。
在其中创建以下内容:
data目录
data/demo_gst.json:这个文件包含了上面显示的GST FAQ训练示例
json:这个文件包含了RASA-NLU的设置,如下所示:
{
"pipeline": "spacy_sklearn",
"path" : "./",
"data" : "./data/gstfaq-data.json"
}
在Python中训练模型
-m rasa_nlu.train -c config.json
这将创建一个model_YYYYMMDD-HHMMSS文件夹
运行:
-m rasa_nlu.server -c config.json --server_model_dirs=./model_YYYYMMDD-HHMMSS
这将启动RASA-NLU服务器,并让知道端口,例如
一旦服务器开始运行,可以通过curl进行GET/POST或将其用作HTTP服务器。
对于HTTP服务器,在运行服务器时添加“-e luis”。
然后,在浏览器中输入:
http://localhost:5000/parse?q=hello%20there
输出如下所示:
现在可以查看GST FAQ机器人的其余组件。
客户端
聊天机器人客户端用户界面是使用Flask框架构建的。它使用两个html模板来渲染UI(即聊天窗口)。外部UI是用base.html构建的,如下所示:
这是聊天机器人的核心。根据从RASA-NLU接收到的意图,它将实体分派到映射的回调函数。该函数反过来,根据实体,调用知识库以获取响应。一旦收到响应,它就会被发送回UI。
知识库可以像一个简单的问题和答案字典一样简单,或者像人们可以想象/需要的那样复杂(如数据库、互联网源等)。本文为了演示目的,从字典中获取预编码的响应。
让看看样本字典:
intent_response_dict = {
"intro": ["This is a GST FAQ bot. One stop-shop to all your GST related queries"],
"greet":["hey","hello","hi"],
"goodbye":["bye","It was nice talking to you","see you","ttyl"],
"affirm":["cool","I know you would like it"],
"faq_link":['You can check all the events here ']
}
引擎使用RASA-NLU进行意图-实体提取和分派回调如下:
@app.route('/chat',methods=["POST"])
def chat():
try:
user_message = request.form["text"]
response = requests.get("http://localhost:5000/parse",params={"q":user_message})
response = response.json()
response = response["topScoringIntent"]
intent = response.get("intent")
entities = response.get("entities")
if intent == "gst-info":
response_text = gst_info(entities)
elif intent == "gst-query":
response_text = gst_query(entities)
else:
response_text = get_random_response(intent)
return jsonify({"status":"success","response":response_text})
except Exception as e:
print(e)
return jsonify({"status":"success","response":"Sorry I am not trained to do that yet..."})
用户文本通过http://localhost:5000/parse发送到RASA-NLU服务器。其响应包含意图和实体。根据意图,调用诸如gst-info和gst-query之类的函数。然后,它们的响应被发送回UI。
这个应用程序的源代码可以在github上找到。
聊天机器人在行动
操作步骤:
1. 通过执行“run_server.bat”脚本启动RASA-NLU服务器。它加载自定义训练的模型并开始监听端口5000
2. 通过在给定端口(例如8000)运行localhost来执行Flash应用程序。
3. 在底部聊天窗口中开始输入命令并单击“发送”。
4. 输入的消息及其响应将出现在上面的窗口中,如旁边的图片所示。
可以在这里查看视频演示。
结束语
本教程仅提供了一个小示例,展示了开发一个完整且实用工具的潜力。GST Q&A机器人可以在多个方面进行增强,例如扩展知识库(即问题和答案的数量),更好的训练以找到更多的意图和实体,自然语言生成的响应以具有人类语言感等。
GST FAQ机器人只是使用政府信息构建直观前端的一个例子。随着更多API和公开数据的可用性,可以为这些数据库构建类似(甚至更好)的机器人。想象一下使用聊天机器人与政府部门互动!