我是第一次接触CLIPS,并试图了解这是否是实现聊天机器人的更好方法。据我了解,到目前为止,它已广泛用于创建专家系统,并且完全基于规则。 我曾尝试使用NN创建一个对话引擎,但是即使对于简单的训练数据变体(使用规则也可以很容易地处理),它却失败了。
现在可以用任何语言编写规则。 与其他任何语言相比,CLIPS有何优势?
编辑1: 答案表明CLIPS是一个不错的选择,因为它使用模式匹配算法。但是,通过对CLIPS的少量试验,我看不出为什么声明规则(激活LHS规则事实时启动)是更好的方法。让我举个例子:
假设我想创建一个能够回答学生结果的聊天机器人。
BOT: What are you looking for?
1. grade
2. subjects
USER: grade
BOT: Enter stream name.
USER: electrical
BOT: Enter student name
USER: john
BOT: grade in electrical for john is 56%
这是我为此编写的CLIPS脚本:
(defrule main-intent
(initial-fact)
=>
(printout t"What are you looking for?
1. grade
2. subjects
")
(assert(why))
(assert(intent (read)))
)
;;;======================================================
(defrule grade-intent
(intent grade)
=>
(printout t"Enter stream name."crlf)
(bind ?stream (read))
(assert (stream-name ?stream))) ;;;There should be stream name validator here
;;;======================================================
(defrule stream-name
(stream-name ?stream)
=>
(printout t "Enter student name "crlf)
(bind ?user (read))
(assert (user-name ?stream ?user))) ;;;There should be student name validator here
;;;======================================================
(defrule user-name-rule
(user-name ?stream ?user)
=>
(printout t"grade in " ?stream " for " ?user " is 56%" crlf)
(bind ?grade 60)
(assert(grade-is ?grade)))
;;;======================================================
(defrule explanation
(why)
=>
(printout t "==============================" crlf)
(retract 0)
(facts)
(printout t "==============================" crlf)
)
另一方面,我在python中有一个基于规则的会话引擎,在该引擎中,我训练了一个NLP模型以从用户查询中提取意图和实体。我使用如下配置文件来定义拨号流:
ask_stream:
call_python_fn: "validate_stream" # python routine that check against DB if stream exist. Returns value valid/invalid
properties:
prompt: "Enter stream name"
transitions:
valid: "ask_user" # if return value is valid, goto next state, ask_user
invalid: "ask_stream" # else again ask for correct stream name
ask_user:
component: "validate_user" # python routine that check against DB if student exist. Returns value valid/invalid
properties:
prompt: "Enter student name"
transitions:
valid: "hit_grade_api" # if return value is valid, goto next state
invalid: "ask_user" # else again ask user
hit_grade_api:
component: "grade_api" # python routine that hits an API to fetch grades
properties:
variable: "grade"
prompt: "grade in"+%stream+"for"+%user+" is "+%grade
因此,如果我的流程发生变化,例如说机器人需要学生的掷骰编号,则我必须在python配置文件中添加一个额外的节点以要求掷骰编号,同样,我也必须在CLIPS中添加新规则。那么CLIPS的优势是什么?
答案 0 :(得分:0)
CLIPS有很多优点。
当然,您可以使用任何图林完整的语言来实现相同的目标, 但是您是否要创建流程图并用某种语言对其进行硬编码。我猜不是。逻辑上的微小变化可能意味着您对控制流程的重大更改。
美丽在于以规则为中心的方法。您有一个if-then关系,上面还有一些其他概念,例如显着性。因此,如果逻辑发生变化,则只需更改一些规则即可。 而且由于使用了rete-algorithm CLIPS,尽管它具有抽象概念,但它却非常快。
但是,当然,它受到您实施规则数量的限制。就您而言,规则从本质上限制了聊天的复杂性。但这完全是确定性的。因此,您知道一定输入后会得到什么。 当然,训练有素的神经网络也是确定性的,但是到目前为止,您还不能真正推理出它。您不知道为什么...为什么NN表现得像它一样?
原则上,人们会猜测,神经网络将以更少的努力得到更好的概括。但就目前而言,我不会这么说。您需要足够的数据,我想您缺少所需数量的数量级。而且,NN可以轻松播放。想想微软的Twitter机器人TAY。另外,您没有计算能力来训练可以按您希望的水平执行的NN。
对于聊天机器人,我会选择CLIPS。我认为您能从中得到最大的收益。您将不得不忍受限制,但这没关系。您可以随时扩展规则集,直到满意为止。对于初学者来说更好,因为您能够重新制定它在做什么。
答案 1 :(得分:0)
看看现有技术,看看它是否适用于您要尝试做的事情。如果您搜索“ eliza源代码”,则会发现该聊天机器人的多种语言实现(包括https://github.com/codeanticode/eliza的Java版本)。这些程序使用脚本,可以使脚本更轻松地逐步增加可以处理的响应。这是Eliza脚本的一部分:
key: my 2
decomp: $ * my *
reasmb: Lets discuss further why your (2).
reasmb: Earlier you said your (2).
reasmb: But your (2).
reasmb: Does that have anything to do with the fact that your (2) ?
decomp: * my* @family *
reasmb: Tell me more about your family.
reasmb: Who else in your family (4) ?
reasmb: Your (3) ?
reasmb: What else comes to mind when you think of your (3) ?
decomp: * my *
reasmb: Your (2) ?
reasmb: Why do you say your (2) ?
reasmb: Does that suggest anything else which belongs to you ?
reasmb: Is it important that your (2) ?
如果您是从头开始实现聊天机器人,那么支持CLIPS之类的模式匹配的语言自然适合将这些脚本与用户的响应进行匹配。
答案 2 :(得分:0)
CLIPS是RETE算法的实现。 RETE是实现专家系统最有效的算法之一,因为它可以最大限度地减少推理过程所需的模式匹配量。
首先,实现规则引擎是一个相当简单的任务。但是,一旦复杂度增加,问题就会突然暴露出它的指数性质,而性能却成为一个主要问题。
如果您的聊天机器人足够简单,那么使用CLIPS可能不会立即带来好处。但是,如果要在用户交互的数量和复杂性增加时确保良好的可伸缩性,则选择CLIPS是一种工具。
尝试使用CLIPS的另一个原因是它广泛的documentation,对于那些想要学习人工智能的人们来说,这是一个很好的起点,而这正是当今流行的基于统计的简单解决方案之外的另一种选择。
最后,采用现有的基于规则的语言来代替或自己动手将自己从许多维护中解放出来。因此,让您专注于真正重要的是规则和底层平台。
CLIPS还通过其绑定(较旧的pyclips和较新的clipspy)在Python上得到了很好的支持。您可以通过将Python代码嵌入(example)中来轻松扩展CLIPS语言。这样,您就可以将任何Python库移植到CLIPS中并立即使用。