AIML中如何为同一问题获取多个learnf事实?
在AIML中保留多个learnf学习事实的解决方案
你当前的实现会出现旧学习事实被新内容覆盖的问题,核心原因是每次调用<learnf>时,都会创建一个与之前**完全相同
解决方案:用变量存储多条事实
通过<set>和<get>标签,为每个术语维护一个存储所有定义的变量,每次学习时将新定义追加到变量中,查询时读取变量内容并输出所有条目。
修改后的学习Category
<category> <pattern>Learn * means *</pattern> <template>Aight <!-- 追加新定义到对应术语的变量中,用|作为分隔符 --> <set name="def_<star>"> <get name="def_<star>"/> <!-- 如果变量已存在,先加分隔符;不存在则直接添加 --> <condition name="def_<star>" exists="true">|</condition> It means <star index="2"/> </set> </template> </category>
查询Category
<category> <pattern>What is *</pattern> <template> <condition name="def_<star>" exists="true"> <!-- 按分隔符拆分所有定义并输出 --> <split delim="|"><get name="def_<star>"/></split> </condition> <condition name="def_<star>" exists="false"> I don't know what <star> means yet. </condition> </template> </category>
测试效果
Human: Learn life means to pursue something.
Robot: Aight
Human: Learn life means to live to the fullest.
Robot: Aight
Human: What is life?
Robot: It means to pursue something. It means to live to the fullest.
原理说明
- 学习阶段:每次执行
Learn X means Y时,会把新的定义追加到名为def_X的变量中,用分隔符区分不同条目,避免直接覆盖。 - 查询阶段:当问
What is X时,读取def_X变量的内容,用<split>标签按分隔符拆分所有条目并依次输出,就能展示所有学习过的事实。
内容的提问来源于stack exchange,提问作者Paulo Evan
相关产品推荐
相关产品推荐

