用 AIML 开发人工智能聊天机器人

借助 Python 的 AIML 包,我们很容易实现人工智能聊天机器人。AIML 指的是 Artificial Intelligence Markup Language (人工智能标记语言),它不过是简单的可 XML (扩展标记语言)形式。本文的示例代码将带你初步领略如何借助 Python 创建属于你的人工智能聊天机器人。

AIML 是什么?

AIML由Richard Wallace发明。他设计了一个名为 A.L.I.C.E.  (Artificial Linguistics Internet Computer Entity 人工语言网计算机实体) 的机器人,并获得了多项人工智能大奖。有趣的是,图灵测试的其中一项就在寻找这样的人工智能:人与机器人通过文本界面展开数分钟的交流,以此查看机器人是否会被当作人类。AIML是一种为了匹配模式和确定响应而进行规则定义的 XML 格式。

关于 AIML 详细的初级读物,可翻阅 Alice Bot’s AIML Primer(http://www.alicebot.org/documentation/aiml-primer.html)。你同样可以在 AIML Wikipedia page(https://en.wikipedia.org/wiki/AIML)了解更多 AIML 的内容以及它能够做什么。我们首先将创建 AIML 文件,并用 Python 赋予它生命。

创建标准的启动文件

创建一个启动文件 std-startup.xml 作为读取AIML文件的主入口点是标准做法。在这里,将创建了一个初始文件用来匹配一种模式和进行一个动作。我们想匹配模式 load aiml b ,并且使它载入我们的 aiml 大脑作为响应。我们将即时创建 basic_chat.aiml 文件。

<aiml version="1.0.1" encoding="UTF-8">

<!-- www1.qixoo.com std-startup.xml -->

<!-- <category> 作为AIML的原子级单元 -->

<category>

<!-- 匹配用户输入的模式 -->

<!-- 如果用户输入 "LOAD AIML B" -->

<pattern>LOAD AIML B</pattern>

<!-- <Template> 用来响应模式 -->

<!-- <learn>是一个aiml文件 -->

<template>

<learn>basic_chat.aiml</learn>

<!-- 在这下面你能添加更多的aiml文件 -->

<!--<learn>more_aiml.aiml</learn>-->

</template>

</category>

</aiml>

创建 AIML 文件

上面我们已经创建了只有一种模式句柄的 AIML 文件,load aiml b。当我们通过命令行运行这个机器人,它会尝试读取 basic_chat.aiml。除非我们已经完成创建,否则载入失败。下面的示例代码将告诉你 basic_chat.aiml 文件可以加入什么。我们将匹配两种基础的模式和响应。

<aiml version="1.0.1" encoding="UTF-8">

<!-- www1.qixoo.com 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>

随机响应

你同样可以像下面的示例代码一样添加随机响应。当接收到“One time I”开头的信息(message),通配符“*”可以进行模糊匹配。

<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 可浏览这些文件。有一种说法是 std-65-percent.xml 包含了 65% 最常用的短语。还有一种说法是它可以让你和机器人玩二十一点。

运用 Python

目前为止,所有 XML 格式的 AIML 文件都准备好了。作为机器人大脑的组成部分,它们都很重要,不过目前它们只是信息(information)而已。机器人需要活过来。你可以借助任何语言定制 AIML,但某些好心人已经用 Python 这么做了。

首先用 pip 安装 aiml 包。

pip install aiml

注意,aiml 包只能在 Python2 环境下运行。也可以选择 Py3kAiml on GitHub (https://github.com/huntersan9/Py3kAiml)

最简单的 Python 程序

我们可以用如下最简单程序入门。它创建了 aiml 类,学习启动文件,然后读取其余 aiml 文件。接下来,它已经准备好聊天了,我们也进入了一个不断提示用户输入信息的死循环。你需要输入一个机器人能识别的模式。模式的识别取决于你载入的 AIML 文件。

因为我们建立启动文件作为独立实体,所以我们稍后可以对机器人添加更多 aiml 文件而不需要调试任何程序的源代码。只有在 xml 格式的 starup 下,我们才能添加更多文件。

import aiml

# 创建Kernel()和 AIML 学习文件

kernel = aiml.Kernel()

kernel.learn("std-startup.xml")

kernel.respond("load aiml b")

# 按组合键 CTRL-C 停止循环

while True:

print kernel.respond(raw_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()已经等待使用了

while True:

print kernel.respond(raw_input("Enter your message >> "))

运行时重载 AIML

运行时,你可以发送载入信息给机器人,接着将会重载 AIML 文件。注意你是否像上文那样使用了大脑方式,飞速重载不会造成大脑有新的变化。你要么删除大脑文件,以便下次启动时重建;要么修改代码,以便重载后的某一时刻能够储存大脑。下一节将利用新建 Python 命令来让机器人执行这些操作。

load aiml b

添加 Python 命令

如果你想通过运行 Python 函数来为机器人添加一些特别的命令,那么你应该在发送 kernel.respond() 函数前截取输入信息并处理。在上述的例子中,我们借助 raw_input 函数获取用户的输入。由此我们无论如何都能获取我们的输入信息。可能好似一个 TCP 套接字(socket),或者使声源转换成文本源。你也许不想 AIML 处理对于某些信息。因此在它们传递给 AIML 时处理。

while True:

message = raw_input("Enter your message to the bot: ")

if message == "quit":

exit()

elif message == "save":

kernel.saveBrain("bot_brain.brn")

else:

bot_response = kernel.respond(message)

# bot_response() 回复某些信息

会话和谓词(Predicates)

通过指定会话,AIML 能根据不同对话者随机应变。举个例子,如果某人告诉机器人他们叫 Alice,另一个人则告诉机器人它叫 Bob,机器人可以分清他们。指定你需要的会话,将它作为第二个参数传递给 respond()。

sessionId = 12345

kernel.respond(raw_input(">>>"), sessionId)

和每个客户都能有个性化的对话——这棒极了。你不得不生成你特有的会话ID并追踪。记住保存大脑文件不要保存所有的会话值。

sessionId = 12345

# 将会话信息作为字典

# 包含输入输出的历史像已知谓词那样

sessionData = kernel.getSessionData(sessionId)

# 每个会话ID需要一个唯一的值

# 用会话中机器人已知的人或事给谓词命名

# 机器人已经知道你叫"Billy"而你的狗叫"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中,我们可以在 <template> 项中设置谓词。

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

其它参考资料

AIML Tag Reference Table

时间: 2024-10-24 17:40:38

用 AIML 开发人工智能聊天机器人的相关文章

自己动手开发智能聊天机器人完全指南(附完整源码)

一.前言 本文是<自己动手开发智能聊天机器人完全指南(附完整源码)>的第二篇,也是21天实战人工智能系列<知识图谱完全项目案例剖析>里面的知识图谱应用的案例.前文中实现了一个最基本的人工智能聊天机器人,其能力完全等同于刚出生的婴儿,还谈不上智能,只是初步具备了人工智能问聊天器人的雏形.从读者的反馈中,发现大家对于当前智能连天机器人的技术发展还不太了解.针对这部分问题,我们后续会有专题探讨,人工智能聊天机器人的主要实现技术,和当前主流的实现方法. 今天要讲的内容则是,如何给你的智能聊

使用图灵机器人高速开发智能聊天机器人

聊天机器人如今已经成为一个流行的话题.不管微信公共帐号,还是qq聊天机器人,能够智能交互聊天的机器人帐号越来越多.相信非常多开发者也想自己实现这样一个好玩的智能聊天机器人. 以下就给广大的技术开发人员提供一个通过图灵机器人简单高速得实现这样一个智能聊天机器人的方法. 先看一下图灵机器人官方体验页的截图.相信大家会很感兴趣: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcGFtY2hlbg==/font/5a6L5L2T/fontsize/400/fi

Android开发-图灵聊天机器人接口引用

转载注明出处: http://www.cnblogs.com/frank-zouxu/p/4121601.html  在前几日,偶然看到新闻,图灵机器人向开发者提供了API,API地址为:http://www.tuling123.com/openapi/,因为这个API可以定制自己的聊天机器人,这在我看来,是个很有意思的事情,于是我就试着在Android应用中进行了API测试,效果图如下(图1): 图1 主要代码如下: public class MainActivity extends Acti

基于Pytorch热门深度学习框架 从零开发NLP聊天机器人

百度云盘 NLP要学习和应用的好,首先是心理学的基础根基要打牢. 必学科目: 1.普通心理学,关于脑神经运作的基础和心理状态的基本分类.细分要研究认知心理学和情感管理,再细分,要多学习逻辑思维. 2.发展心理学,研究人从出生到死亡的心路历程. 3.社会心理学,三人即为社会最小单元,研究人作为群体性动物的交互规则. 4.变态(异常)心理学,各种心理状态偏差及异常的症状分类和诊断. 5.积极心理学,与传统心理学研究病症相比,研究人的美德和优秀品质能让人活的更有意义.价值,更快乐.更幸福. 6.心理咨

微名汇-微信公众平台功能开发(微信聊天机器人)

因为现在小黄鸡智能聊天机器人接口能免费试用7天,7天之后会收费这对于很多用户来说感觉不划算.所以我找了另一个接口:小i机器人,并且完全免费.本文介绍如何在微信公众平台中使用小i智能聊天api接口开发智能聊天机器人. 小i机器人是全球用户量最大的中文聊天机器人,最早在MSN上出现,后拓展到QQ.短信.网页等交互平台上,拥有超过1亿的用户.2012年2月,小i机器人整合了自然语音识别功能,并陆续发布了智能手机.智能电视以及电话上的语音交互版本. 小i机器人申请地址为http://cloud.xiao

QQ 聊天机器人API

QQ机器人是腾讯陆续推出的的人工智能聊天机器人的总称.都说小Q妹妹聪明好学,我们可以教她说话,也可以请他帮忙查询邮编.手机号,或者解释成语.翻译成语,据说她还会查询手机号码归属地.应用科学计算器. 可是,在查新闻.查列车.车航班.查团购.查价格.查优惠.查酒店.查餐厅.查彩票等方面,小Q妹妹就弱爆了,"逆水行舟,不进则退"小Q妹妹真应该被pass掉了.笔者已经开始使用一款功能更强的机器人--图灵机器人.试一下这个高智商的机器人,她永远有耐心陪您聊天,不怕你调戏她,就怕你被她调戏.点这里

QQ聊天机器人 Delphi代码

QQ聊天机器人 前几日,看到杂志上有一篇关于开发QQ聊天机器人的文章.谈到了对QQ循环发送消息内容,感觉倒也很好玩,于是拿起Delphi开始了我的QQ聊天机器人之路. 首先要明白自己要做什么,大家都用过QQ,知道给别人发送消息的整个过程吧!要实现循环发送消息的功能该有以下几个条件: 1.必须是在聊天模式里进行.这样发送完一条消息后,QQ窗体还存在. 2.其次是要找到QQ文本窗体的句柄. 3.向QQ文本窗体中贴上你想说的话.然后自己点击发送按钮. 思路很简单,接着我们就要开始实施了. 首先要找到Q

微信公众平台开发入门:[8]聊天机器人可开发

在这篇教程中,我们将介绍如何在微信公众平台上开发:[小黄鸡聊天机器人]的功能.微信公众号,客户多了,来不及每个都体贴的照顾:是不是很想有个机器人自动陪聊来顶一下?这里就说说微信聊天机器人的开发. 第一部分 基于模拟请求的方式 1 模拟请求数据(先看一下小黄鸡的网页版界面) 2 我们通过模拟http请求来实现,上面对话抓包如下: (下图分别是:发送消息的包,接收消息的包) 3 根据上面的包,模拟发起请求如下 4 接下来,我们做下与微信的对接,代码如下 5 看下演示效果 END 第二部分 基于接口的

微信小程序开发—项目实战之聊天机器人

我参加CSDN博客之星评选啦,感谢大家前往投票支持! 投票地址:http://blog.csdn.net/vote/list.html?keyword=anda0109#search 项目功能介绍 人工智能虚拟机器人"微软小冰"大家玩过吧,很酷的一个应用.发送文字.语音和图片都能得到智能的回复. 那现在我们就用小程序做一个模拟的应用,智能聊天机器人.发送文字它可以回复一段话,或一张图片,是不是有点小酷! 下面是小程序开发的一个智能聊天机器人的应用界面: 当然,这种智能回复的算法和数据库