采用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.