基于ProgramAB的AIML机器人重复词检测功能异常排查与修复请求
修复ProgramAB中重复词汇检测与响应不符合预期的问题
我仔细看了你的代码,发现几个关键问题导致重复检测失效和响应异常,下面一步步给你分析并修复:
问题根源分析
重复判断逻辑错误
你原来用<input index="2"/>来判断重复,但这个变量是上上次的用户输入,而我们需要对比的是当前输入和上一次输入是否一致,应该用<input index="1"/>。而且原代码的<condition>写法没有明确的对比逻辑,导致判断完全失效。重复计数触发逻辑混乱
原代码里只要调用REPEAT *就会递增计数,但没有先验证输入是否真的重复,导致即使输入不同,计数也会被累加,触发错误的重复提示。模式匹配顺序与循环调用
全局通配符<pattern>*</pattern>放在了MAINBOT *前面,会先拦截所有输入,然后调用MAINBOT <star/>,而MAINBOT *又调用REPEAT <star/>,形成无意义的循环,打乱了正常的业务响应逻辑。
修复后的完整代码
核心重复检测与路由文件
<?xml version="1.0" encoding="UTF-8"?> <aiml version="2.0"> <!-- 精确匹配命令优先,避免被通配符拦截 --> <category> <pattern>MAINBOT BYE</pattern> <template>BYE</template> </category> <!-- 全局路由:先判断是否重复输入 --> <category> <pattern>*</pattern> <template> <think> <!-- 保存当前输入 --> <set name="userinput"><star/></set> <!-- 保存上一次输入用于对比 --> <set name="lastinput"><input index="1"/></set> </think> <condition> <!-- 仅当当前输入和上一次输入完全相同时,触发重复检测 --> <li name="userinput" value="<get name='lastinput'/>"> <srai>REPEAT <star/></srai> </li> <!-- 非重复输入,路由到业务逻辑处理 --> <li> <srai>MAINBOT <star/></srai> </li> </condition> </template> </category> <!-- 重复输入处理:仅在确认重复时递增计数 --> <category> <pattern>REPEAT *</pattern> <template> <condition name="repeatcount"> <!-- 第一次重复:正常响应,初始化计数 --> <li value="unknown"> <think><set name="repeatcount">1</set></think> <srai>MAINBOT <star/></srai> </li> <!-- 第二次重复:给出调侃提示 --> <li value="1"> <think><set name="repeatcount">2</set></think> <star/>, <star/>, <star/> is that all you can say? </li> <!-- 第三次重复:发出警告 --> <li value="2"> <think><set name="repeatcount">3</set></think> Stop repeating that! </li> <!-- 第四次重复:加重警告 --> <li value="3"> <think><set name="repeatcount">4</set></think> I'm warning you, stop repeating! </li> <!-- 第五次重复:最后通牒 --> <li value="4"> <think><set name="repeatcount">5</set></think> This is the last time I'll tell you to stop! </li> <!-- 第六次及以后:停止响应重复内容 --> <li value="5"> <think><set name="repeatcount">6</set></think> Fine, I'm done responding to your repeats. </li> </condition> </template> </category> <!-- MAINBOT路由:剥离前缀后匹配业务逻辑 --> <category> <pattern>MAINBOT *</pattern> <template> <srai><star/></srai> </template> </category> </aiml>
主业务逻辑文件(调整前缀匹配)
<?xml version="1.0" encoding="UTF-8"?> <aiml version="2.0"> <category> <pattern>HI</pattern> <template><random> <li>Helo</li> <li>Heyyyyyyy</li> <li>Hellooo</li> <li>Hi</li> </random></template> </category> <category> <pattern>HEY #</pattern> <template><srai>HI</srai></template> </category> <category> <pattern>HOW ARE YOU</pattern> <template>i'm fine! and you?</template> </category> <category> <pattern>WHAT IS THE DATE TODAY</pattern> <template>Today is <date/></template> </category> <category> <that>Hi</that> <pattern>HI</pattern> <template>hii ani!</template> </category> <category> <that>Helo</that> <pattern>HEY *</pattern> <template>i think we have just covered greeting part of the conversation</template> </category> <category> <that>Hellooo</that> <pattern>HELLO #</pattern> <template>Aww</template> </category> <category> <that>Heyyyyyyy</that> <pattern>HEY #</pattern> <template>good to see you again</template> </category> <category> <pattern>IM WELL</pattern> <template>glad to know!</template> </category> <category> <pattern>IM GOOD</pattern> <template><srai>IM WELL</srai></template> </category> </aiml>
修复关键点说明
- 精准的重复判断
通过对比userinput(当前输入)和lastinput(上一次输入),只有完全相同时才触发重复检测,避免误判。 - 合理的模式匹配顺序
把精确匹配的命令放在最前面,确保不会被全局通配符拦截。 - 避免循环调用
调整MAINBOT *的逻辑,剥离前缀后直接匹配业务模式,消除了原有的循环调用问题。 - 可控的重复计数
只有确认输入重复时才递增计数,确保计数逻辑完全符合预期。
内容的提问来源于stack exchange,提问作者Paulo Evan




