You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AIML中如何为同一问题获取多个learnf事实?

在AIML中保留多个learnf学习事实的解决方案

你当前的实现会出现旧学习事实被新内容覆盖的问题,核心原因是每次调用<learnf>时,都会创建一个与之前**完全相同**的category,而AIML的匹配逻辑会优先使用最新定义的category,导致旧内容被覆盖。要保留多条学习事实,需要换一种思路:不直接覆盖模板,而是把所有学习到的事实存储起来,查询时统一取出。

解决方案:用变量存储多条事实

通过<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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 15:30:52