我正在使用<srai>
标记在AIML中使用递归,如下面的代码所示:
<category><pattern>I LIKE *</pattern>
<think><set name="name"><star/></set>
<set name="it">
<set name="topic"><star/>
</set>
</set>
</think>
<template><srai>I DIG</srai></template>
</category>
<category><pattern>I DIG</pattern>
<template>
<random>
<li>If you dig <get name="name"/>, plant something in it</li>
<li>I dig <get name="name"/> too.</li>
<li>If you dig <get name="name"/> deep enough, rabbits will live in it.</li>
</random>
</template>
</category>
几天前,这段代码正在运行,但现在它的工作原理还没有设置值。 我得到了:
如果你挖掘未知,可以种植一些东西。
我也不知道。
如果你深入挖掘未知的深度,兔子就会生活在其中。
我做错了什么?
答案 0 :(得分:0)
除非我正在阅读&amp;错误地执行此代码,我认为这与设置名称有关。 所以,如果你告诉它,“我挖鸟!”,然后问它你的名字是什么,它会说你的名字是鸟。
这是AIML 2.0,对吗?
答案 1 :(得分:0)
您的AIML格式不正确。
您可以在模板下放置<think>
,<set>
个标签。所以你的AIML将如下
<category>
<pattern>I LIKE *</pattern>
<template>
<think>
<set name="name"><star/></set>
<set name="it">
<set name="topic"><star/></set>
</set>
</think>
<srai>I DIG</srai>
</template>
</category>
<category>
<pattern>I DIG</pattern>
<template>
<random>
<li>If you dig <get name="name"/>, plant something in it</li>
<li>I dig <get name="name"/> too.</li>
<li>If you dig <get name="name"/> deep enough, rabbits will live in it.</li>
</random>
</template>
</category>
This will return like following:
___________________________________________
Input: I like Bird
Output: If you dig Bird, plant something in it
Input: I like Bird
Output: If you dig Bird deep enough, rabbits will live in it.
答案 2 :(得分:0)
这是因为这些变量是会话范围的。这意味着,如果为变量赋值,则可以全局访问。因此,对于Bird和User,您具有相同的变量名称,它的行为方式与您提到的相同。 你可以做的是保留两个变量:
<category>
<pattern>I LIKE *</pattern>
<template>
<think>
<set name="name"><star/></set>
<set name="it">
<set name="topic"><star/></set>
</set>
</think>
<srai>I DIG</srai>
</template>
</category>
并为用户名保留另一个变量,例如
<category>
<pattern>My name is *</pattern>
<template>Ok <think><set name="userName"><star/></set> </think></template>
</category>
<category>
<pattern>What is my name?</pattern>
<template>My name is <get name="userName"/></template>
</category>