采用Python语言实现的AIML扩展包可以很容易的开发出人工智能聊天机器人。AIML是人工智能标记语言(Artificial Intelligence Markup Language),它是一种简单的XML格式文档。文本将会从头至尾讲解如何使用Python语言开发一款自己的人工智能聊天机器人。
AIML是什么?
AIML的开发者是Richard Wallace,他创建了一个叫A.L.I.C.E. (Artificial Linguistics Internet Computer Entity)的聊天机器人,这个A.L.I.C.E.赢得了很多人工智能奖项,其中之一是通过了图灵测试。AIML是一种XML格式文档,它定义了匹配模式和回答决策的规则。
创建标准启动文件
标准启动文件名是std-startup.xml,这个文件是载入AIML文件的入口。这里创建一个匹配模式和一次回答决策的例子文件。比如匹配的模式叫load aiml b,它的回答是载入AIML大脑。
<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>
创建AIML文件
上面创建的启动文件表明,当输入命令load aiml b后,系统就会尝试载入basic_chat.aiml文件。这个文件将会创建两个匹配模式和决策回答。
<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>
随机决策回答
另外也可以建立一个随机决策回答的random_response.aiml文件。这个文件记录了在收到一条由"One time I "开头的消息时,随机地做出回答。这里的”*”号表示匹配任何信息。
<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>
安装Python的AIML模块
下一步就需要编制机器人的大脑,也就是用Python语言来实现AIML规范。
PYTHON 2
使用pip安装aiml扩展包,或者从
https://pypi.python.org/pypi/aiml/下载。
pip install aiml
PYTHON 3
对于Python 3,使用pip安装的包是python-aiml,或者也可以从
https://github.com/paulovn/python-aiml下载。
pip install python-aiml
最简机器人程序
实现一个最简单的机器人程序,这个程序完成了创建AIML对象,学习启动文件,然后载入后续AIML文件。然后这个程序就可以进行聊天,就会进入一个循环,无限地向用户提示输入消息。运行时也可以添加一个机器人能够识别的模式,这个模式的识别依赖于载入的AIML文件。
import aiml
# Create the kernel and learn AIML files
kernel = aiml.Kernel()
kernel.learn("std-startup.xml")
kernel.respond("load aiml b")
# Press CTRL-C to break this loop
while True:
print(kernel.respond(input("Enter your message >> ")))
使用脑文件加速载入
当AIML文件越来越多时,花费的学习时间就越长,这时就需要引入脑文件。当机器人学习了大量的AIML文件后,它可以将机器人的大脑存储到一个文件中,这个文件就叫作脑文件,这个文件可以加速以后的运行。
import aiml
import os
kernel = aiml.Kernel()
if os.path.isfile("bot_brain.brn"):
kernel.bootstrap(brainFile = "bot_brain.brn")
else:
kernel.bootstrap(learnFiles = "std-startup.xml", commands = "load aiml b")
kernel.saveBrain("bot_brain.brn")
# kernel now ready for use
while True:
print(kernel.respond(input("Enter your message >> ")))
运行时重新载入AIML文件
当机器人运行时,可以通过重发load aiml b消息载入AIML文件。
添加Python命令
如果需要添加一些特殊命令,则应答捕获输入的消息,在发送给kernel.respond()之前进行处理。
while True:
message = input("Enter your message to the bot: ")
if message == "quit":
exit()
elif message == "save":
kernel.bootstrap(learnFiles = "std-startup.xml", commands = "load aiml b")
kernel.saveBrain("bot_brain.brn")
else:
bot_response = kernel.respond(message)
# Do something with bot_response
会话和谓语
对于多用户环境,可以指定一个会话,这样AIML机器人可以通过不同会话跟不同用户聊天。比如一个用户告诉机器人她的名字叫作Alice,另一个人告诉机器人叫作Bob,那么机器人是可以区分不同名字的用户的。通过给respond()函数传入第二个参数来指定是哪一个会话。
sessionId = 12345
kernel.respond(input(">>>"), sessionId)
通过会话技术可以实现对每个客户端的个性化交谈。对于每个客户端生成独立的会话ID,但需要注意不要将脑文件存储到全局会话中。
sessionId = 12345
# Get session info as dictionary. Contains the input
# and output history as well as any predicates known
sessionData = kernel.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"
kernel.setPredicate("dog", "Brandy", sessionId)
clients_dogs_name = kernel.getPredicate("dog", sessionId)
kernel.setBotPredicate("hometown", "127.0.0.1")
bot_hometown = kernel.getBotPredicate("hometown")
在AIML文件模板中,通过set来预测事务。
<aiml version="1.0.1" encoding="UTF-8">
<category>
<pattern>MY DOGS NAME IS *</pattern>
<template>
That is interesting that you have a dog named <set name="dog"><star/></set>
</template>
</category>
<category>
<pattern>WHAT IS MY DOGS NAME</pattern>
<template>
Your dog's name is <get name="dog"/>.
</template>
</category>
</aiml>
根据上面定义的AIML文件,跟机器人之间的对话就会如下:
My dogs name is Max
机器人回答:
That is interesting that you have a dog named Max
如果又问机器人:
What is my dogs name?
机器人回答:
Your dog's name is Max.