You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

基于ProgramAB的AIML机器人重复词检测功能异常排查与修复请求

修复ProgramAB中重复词汇检测与响应不符合预期的问题

我仔细看了你的代码,发现几个关键问题导致重复检测失效和响应异常,下面一步步给你分析并修复:

问题根源分析

  1. 重复判断逻辑错误
    你原来用<input index="2"/>来判断重复,但这个变量是上上次的用户输入,而我们需要对比的是当前输入和上一次输入是否一致,应该用<input index="1"/>。而且原代码的<condition>写法没有明确的对比逻辑,导致判断完全失效。

  2. 重复计数触发逻辑混乱
    原代码里只要调用REPEAT *就会递增计数,但没有先验证输入是否真的重复,导致即使输入不同,计数也会被累加,触发错误的重复提示。

  3. 模式匹配顺序与循环调用
    全局通配符<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>

修复关键点说明

  1. 精准的重复判断
    通过对比userinput(当前输入)和lastinput(上一次输入),只有完全相同时才触发重复检测,避免误判。
  2. 合理的模式匹配顺序
    把精确匹配的命令放在最前面,确保不会被全局通配符拦截。
  3. 避免循环调用
    调整MAINBOT *的逻辑,剥离前缀后直接匹配业务模式,消除了原有的循环调用问题。
  4. 可控的重复计数
    只有确认输入重复时才递增计数,确保计数逻辑完全符合预期。

内容的提问来源于stack exchange,提问作者Paulo Evan

火山引擎 最新活动