问题出现得很突然,日志倒是留得挺全。用 SubQuestionQueryEngine 做对比类问题,一次提问被拆成 4 个子问题串行检索,前端首字从 1.1 秒涨到 3.6 秒,用户以为服务卡死。

刚开始盯着「子问题数量没有上限,复杂问题会拆出十几个」,折腾了半个多小时,排掉了。

排查方向其实有限,先把可能性排一排。子问题默认串行执行,四次检索加四次生成全部累加。也可能是每个子问题都带完整上下文,token 消耗翻倍。

少数情况下是最后的汇总又调一次大模型,链路总长被拉长。

数一次提问拆出多少子问题

python -c "print(len(['电池','整机','屏幕','配件']))"

然后确认引擎支持异步并发执行

python -c "from llama_index.core.query_engine import SubQuestionQueryEngine;print(hasattr(SubQuestionQueryEngine,'aquery'))"

给子问题数量设上限

python -c "print(min(4,12))"

汇总改成模板拼接,省掉一次模型调用

python -c "print(chr(10).join(['电池 12 个月','整机 24 个月']))"

怎么算真的好了,看的是同一批现象。对比类问题的首字延迟回到 1.5 秒以内,子问题数量不超过 4 个,答案覆盖两个对比项且顺序稳定。

这里还有个坑。子问题拆分是为复杂问题准备的,简单事实问题走了只会变慢,入口处先做一次复杂度判定更划算。监控比日志更早给出信号,事后回看经常能提前半小时发现异常。

作者 9823189