使用aiml开发智能聊天机器人

aiml介绍

AIML是Richard Wallace开发的。 他开发了一个叫A.L.I.C.E(Artificial Linguistics Internet Computer Entity)的机器人并且赢了几个人工智能的奖项。 有趣的是, 其中一个图灵测试是让一个人在文本界面跟一个机器人聊几分钟,看看人们是否认为它是个人类。 AIML是一种定义了匹配模式和决定响应的规则的一种XML。

要看完整的AIML入门,可以看一下 Alice Bot’s AIML Primer.你可以在AIML wiki页学更多关于AIML的知识并知道它能做什么。 我们先写一些AIML文件并用Python给它一点生命。

安装

1
pip install aiml

aiml自带简易英文语料库

Python aiml安装完成后在Python安装目录下的 site-packages/aiml下会有alice子目录,这个是系统自带的一个简单的语料库。

1
2
alice
standard

创建标准启动文件 std-startup.xml

std-startup.xml用于加载aiml文件到大脑。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<aiml version="1.0.1" encoding="UTF-8">
<!-- std-startup.xml -->
<!-- Category is an atomic AIML unit -->
<category>
<!-- Pattern to match in user input -->
<!-- If user enters "LOAD AIML B" -->
<pattern>LOAD AIML B</pattern>
<!-- Template is the response to the pattern -->
<!-- This learn an aiml file -->
<template>
<learn>basic_chat.aiml</learn>
<!-- You can add more aiml files here -->
<!--<learn>more_aiml.aiml</learn>-->
</template>
</category>
</aiml>

注:采用learn标签来学习aiml文件。这里通过load aiml b命令来匹配,当用户输入这个命令的时候会自动执行重新加载操作。匹配多个aiml文件可以将配置改成 *.aiml

创建aiml文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<aiml version="1.0.1" encoding="UTF-8">
<!-- basic_chat.aiml -->
<category>
<pattern>HELLO</pattern>
<template>
Well, hello!
</template>
</category>
<category>
<pattern>WHAT ARE YOU</pattern>
<template>
I'm a bot, silly!
</template>
</category>
</aiml>

注:pattern标签中,英文必须大写

随机响应

相信这个大伙都是很容易理解的,就是随机从中抽取一个答案回答用户

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<category>
<pattern>ONE TIME I *</pattern>
<template>
<random>
<li>Go on.</li>
<li>How old are you?</li>
<li>Be more specific.</li>
<li>I did not know that.</li>
<li>Are you telling the truth?</li>
<li>I don't know what that means.</li>
<li>Try to tell me that another way.</li>
<li>Are you talking about an animal, vegetable or mineral?</li>
<li>What is it?</li>
</random>
</template>
</category>

使用已存在的aiml

编写你自己的AIML文件是一个很有趣的事,但是它将花费很大的功夫。我觉得它需要大概10,000个模式才会开始变得真实起来。幸运的是,ALICE基金会提供了大量免费的AIML文件。在Alice Bot website上浏览AIML文件。

新建一个机器人

这里我们就不累赘这个过程讲解了,如果想了解可以看下面的参考链接,这里我们直接上最终代码

启动程序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# -*- coding: utf-8 -*-
import aiml
import os
mybot_path = './Alice'
#切换到语料库所在工作目录
os.chdir(mybot_path)
mybot = aiml.Kernel()
sessionId = ""
#Get session info as dictionary. Contains the input
# and output history as well as any predicates known
#sessionData = mybot.getSessionData(sessionId)
# Each session ID needs to be a unique value
# The predicate name is the name of something/someone
# that the bot knows about in your session with the bot
# The bot might know you as "Billy" and that your "dog" is named "Brandy"
#mybot.setPredicate("dog", "Brandy", sessionId)
#mybot.setBotPredicate("hometown", "127.0.0.1")
if os.path.isfile("chatbot_brain.brn"):
mybot.bootstrap(brainFile="chat_brain.brn")
else:
mybot.bootstrap(learnFiles="std-startup.xml", commands="load aiml b")
mybot.saveBrain("chatbot_brain.brn")
while True:
message = raw_input("Enter your message >> ")
if "session" in message:
sessionId = message
sessionData = mybot.getSessionData(sessionId)
elif message == "quit":
exit()
elif message == "save":
mybot.saveBrain("vigorbot_brain.brn")
else:
bot_response = mybot.respond(message,sessionId)
#Do something with bot_response
print(bot_response)

这里为了做测试我做了下修改,通过输入包含session字符串信息来设置session,测试session记录信息的分离,我们来看下测试结果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Enter your message >> session1
Enter your message >> My dogs name is Max
That is interesting that you have a dog named Max
Enter your message >> What is my dogs name?
Your dog's name is Max.
Enter your message >>
Enter your message >> session2
Enter your message >> My dogs name is Max2
That is interesting that you have a dog named Max2
Enter your message >> What is my dogs name?
Your dog's name is Max2.
Enter your message >>
Enter your message >> session1
Enter your message >> What is my dogs name?
Your dog's name is Max.
Enter your message >> session2
Enter your message >> What is my dogs name?
Your dog's name is Max2.

看我们的session分离的效果出来了。但是很遗憾的是,当我save之后关闭程序重新启动,session的信息并没有被保存下来。

缺点

  • 中文aiml语料库过少,人工制作语料库成本太高
  • session信息并未作保存,这个是需要自己去优化修改的

参考链接:
http://www.devdungeon.com/content/ai-chat-bot-python-aiml
https://www.pandorabots.com/botmaster/en/tutorial
http://www.alicebot.org/aiml/aaa/
https://www.biaodianfu.com/python-aiml.html
http://www.alicebot.org/documentation/aiml101.html
https://www.tutorialspoint.com/aiml/index.htm

坚持原创技术分享,您的支持将鼓励为继续创作!