售后对话到第 22 轮,用户只问那这个呢,检索拿最后一句做 embedding,命中一堆无关文档,日志里 query 就是那这个呢六个字。

一开始怀疑是「没有把关键实体抽出来做会话级记忆」,查了一圈,方向不对。

真正麻烦的地方在于,几个原因的现象几乎一样。检索只用当前一句,指代和省略都没补全。另一种情况是历史裁剪按条数砍,早期提到的型号被丢掉。

少数情况下是查询改写那一步在长历史下输入被截断,改写失效。

第一件事是把最后一句与上文实体一起打印出来

python -c "print('上文实体: X200 电池\n当前问题: 那这个呢')"

再往下加一步查询改写补全指代

python -c "from openai import OpenAI;print(OpenAI().chat.completions.create(model='gpt-4o-mini',messages=[{'role':'user','content':'把「那这个呢」改写为完整问题,上文是 X200 电池'}]).choices[0].message.content)"

会话级缓存关键实体,不随裁剪丢失

python -c "print({'product':'X200','issue':'电池'})"

末了对改写后的查询做一次命中检查

python -c "print(len('X200 电池 保修多久'))"

别只看报错消失,验证要多做一步。第 22 轮的检索 query 带上 X200 与电池,命中文档与首轮同类,答案能直接回答保修问题。

这里还有个坑。查询改写的成本远低于答错的成本,长会话里这一步别省,改写失败要留回退到原句的策略。拖得越久,排查成本越高,因为现场状态会被后续操作覆盖。

作者 9823189