如何编写一个简单的人工智能聊天机器人?
-
09-06-2019 - |
题
我想构建一个机器人,它会问某人一些简单的问题,并根据答案进行分支。我意识到解析人类反应的含义将具有挑战性,但是如何设置程序来处理对话的“状态”?
这将是人类和机器人之间的一对一对话。
解决方案
您可能想调查一下 马尔可夫链 作为机器人人工智能的基础。我很久以前写过一些东西(我对这些代码一点也不感到自豪,并且需要一些 mods 才能在 Python > 1.5 上运行),这对您来说可能是一个有用的起点: http://sourceforge.net/projects/Benz/
编辑:下面是 Python 中马尔可夫链的一个最小示例,它接受来自 stdin 的输入,并根据输入中单词相继出现的概率输出文本。它针对 IRC 风格的聊天日志进行了优化,但通过它运行任何合适大小的文本都应该演示以下概念:
import random, sys
NONWORD = "\n"
STARTKEY = NONWORD, NONWORD
MAXGEN=1000
class MarkovChainer(object):
def __init__(self):
self.state = dict()
def input(self, input):
word1, word2 = STARTKEY
for word3 in input.split():
self.state.setdefault((word1, word2), list()).append(word3)
word1, word2 = word2, word3
self.state.setdefault((word1, word2), list()).append(NONWORD)
def output(self):
output = list()
word1, word2 = STARTKEY
for i in range(MAXGEN):
word3 = random.choice(self.state[(word1,word2)])
if word3 == NONWORD: break
output.append(word3)
word1, word2 = word2, word3
return " ".join(output)
if __name__ == "__main__":
c = MarkovChainer()
c.input(sys.stdin.read())
print c.output()
从这里可以很容易地插入持久性和 IRC 库,并拥有您正在谈论的机器人类型的基础。
其他提示
人们已经提到状态性并不是典型聊天机器人的重要组成部分:
如果纯马尔可夫实现实时增长其词典和表格,则它可能会表达一种非常松散的状态(人类对话者之前的话语可能会在对话中稍后偶然出现),但马尔可夫模型没有任何固有的选择或产生此类响应的机制。
基于解析的机器人(例如ELIZA)通常尝试响应用户最近输入的(某些)语义内容,而不显着考虑之前的交换。
这就是说,你当然 能 无论您使用什么输入解析和语句合成模型,都可以向聊天机器人添加一定量的状态。如何做到这一点在很大程度上取决于您想要通过状态性实现什么目标,而您的问题并不清楚这一点。然而,有几个一般想法:
创建关键字堆栈。当您的人员提供输入时,从他们的陈述/问题中解析出关键字,并将这些关键字放入某种堆栈中。当您的聊天机器人无法在最近的输入中提出一些令人信服的内容来响应时(或者,也许只是随机地混淆一些内容)时,请返回堆栈,获取上一个关键字,并使用它来播种下一个关键字合成。为了获得奖励积分,让机器人明确承认它要返回到之前的主题,例如“等等,人类,你之前提到过 foo。[由 foo 播种的句子]”。
在机器人中构建类似 RPG 的对话逻辑。在解析人类输入时,切换来自用户的特定对话提示或内容的标志,并有条件地改变聊天机器人可以谈论的内容或其通信方式。例如,聊天机器人对脏话感到愤怒(或责骂或大笑)是相当常见的;一个会变得兴奋的聊天机器人,并且有条件地 保持这种状态直到道歉为止, ,将是一个有趣的有状态变体。将输出切换为全部大写,加入对抗性言论或要求或哭泣等。
您能澄清一下您希望国家帮助您实现什么目标吗?
想象一个每个节点或神经元都具有解析功能的神经网络。根据规则和解析结果,神经元会放电。如果某些神经元放电,您就会对问题的主题和语义有一个很好的了解,因此可以给出一个好的答案。
记忆是通过在会议中保留讨论的主题,增加下一个问题的触发,从而在最后指导可能答案的选择过程来完成的。
将规则和模式保存在知识库中,但在开始时将它们编译到内存中,每个规则都有一个神经元。您可以使用侦听器或事件函数之类的东西来设计突触。
我认为要开始这个项目,最好有一个包含问题的数据库(组织为树状结构)。每个节点都有一个或多个问题)。这些问题应该用“是”或“否”来回答。
如果机器人开始提问,它可以从您或标记为起始问题的问题数据库中的任何问题开始。答案是到达树中下一个节点的路径。
编辑:这是一个用 ruby 编写的简单代码,您可以从以下开始: 红宝石机器人
天真的聊天机器人程序。没有解析,没有聪明,只是一个训练文件和输出。
它首先根据文本进行自我训练,然后使用训练中的数据生成对对话者输入的响应。训练过程会创建一个字典,其中每个键都是一个单词,值是训练文本中按顺序跟随该单词的所有单词的列表。如果一个单词在此列表中出现多次,则表明它更有可能被机器人选择,不需要概率性的东西,只需使用列表即可。
机器人从您的输入中选择一个随机单词,并通过选择另一个被视为其保留单词的后继的随机单词来生成响应。然后它会重复这个过程,依次找到该单词的后继者并迭代进行,直到它认为已经说得足够多了。它通过在训练文本中标点符号之前的单词处停止来得出该结论。然后它再次返回输入模式以让您做出响应,依此类推。
这不太现实,但我在此挑战任何人在 71 行代码中做得更好!对于任何初露头角的 Python 专家来说,这都是一个巨大的挑战,我只是希望能够向更广泛的受众开放这一挑战,而不是访问此博客的少数访问者。为了编写一个始终保证符合语法的机器人,肯定必须接近数百行,我通过尝试思考最简单的规则来极大地简化,让计算机能够尝试说些什么。
至少可以说,它的反应相当印象主义!另外,您必须将您所说的内容放在单引号中。
我使用《战争与和平》作为我的“语料库”,训练运行需要几个小时,如果您不耐烦,请使用较短的文件......
这是教练
#lukebot-trainer.py
import pickle
b=open('war&peace.txt')
text=[]
for line in b:
for word in line.split():
text.append (word)
b.close()
textset=list(set(text))
follow={}
for l in range(len(textset)):
working=[]
check=textset[l]
for w in range(len(text)-1):
if check==text[w] and text[w][-1] not in '(),.?!':
working.append(str(text[w+1]))
follow[check]=working
a=open('lexicon-luke','wb')
pickle.dump(follow,a,2)
a.close()
这是机器人
#lukebot.py
import pickle,random
a=open('lexicon-luke','rb')
successorlist=pickle.load(a)
a.close()
def nextword(a):
if a in successorlist:
return random.choice(successorlist[a])
else:
return 'the'
speech=''
while speech!='quit':
speech=raw_input('>')
s=random.choice(speech.split())
response=''
while True:
neword=nextword(s)
response+=' '+neword
s=neword
if neword[-1] in ',?!.':
break
print response
当它说出一些似乎有一定道理的东西时,你往往会产生一种不可思议的感觉。
我建议查看贝叶斯概率。然后只需监视聊天室一段时间即可创建您的概率树。
我不确定这就是你要找的,但有一个旧程序叫做 伊丽莎 它可以通过接受你所说的话进行对话,并在执行一些简单的文本转换后将其返回给你。
如果我没记错的话,很多人都确信他们正在与一个真人“交谈”,并与其进行了长时间的详细对话。
如果你只是涉足,我相信 洋泾浜语 允许您编写聊天风格行为的脚本。框架的一部分可能会记录谁在何时发送消息的状态,并且您希望为最后 N 条消息中的每一条保留机器人的内部状态日志。未来的状态决策可以根据对先前状态的检查和最近几条消息的内容进行硬编码。或者您可以执行类似于讨论的马尔可夫链的操作,并将其用于解析和生成。
如果您不需要学习机器人,请使用 AIML (http://www.aiml.net/)很可能会产生您想要的结果,至少对于机器人解析输入并基于它进行回答而言。
您可以重用或创建由 XML(AIML 格式)组成的“大脑”,并在程序(解析器)中解析/运行它们。有几种不同语言的解析器可供选择,据我所知,代码在大多数情况下似乎都是开源的。
您可以使用“ChatterBot”,并使用“flask-chatterbot-master”在本地托管它
链接:
- [ChatterBot 安装]https://chatterbot.readthedocs.io/en/stable/setup.html
- [本地主机使用-flask-chatterbot-master]: https://github.com/chamkank/flask-chatterbot
干杯,
拉特纳卡尔