1. 问题现象:当AI搜索失效时发生了什么
上周三下午,我们的客服系统突然涌入大量用户投诉:"为什么在AI助手搜索我的订单号没有任何结果?"、"用产品名称搜索居然提示'无相关内容'"。作为负责搜索系统的工程师,我第一时间查看了监控面板——奇怪的是,所有服务状态都显示绿色,平均响应时间保持在200ms以内,错误率低于0.1%。
但真实用户场景却呈现出完全不同的故事。通过会话日志分析,我们发现这些失败的搜索请求存在三个共性特征:
- 搜索词包含特殊字符(如#、/、中文括号)
- 超过60%的请求来自移动端APP
- 时间集中在系统每日索引更新后的2小时内
更诡异的是,当我们在测试环境用完全相同的搜索词复现时,却能返回正确结果。这种"生产环境独有"的故障往往最难排查,也最考验工程师的系统性思维。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 构建排查框架:从端到端拆解搜索链路
面对这种"薛定谔的故障",我画出了AI搜索的完整处理链路:
code复制用户输入 → 客户端预处理 → 网络传输 → 网关鉴权 → 查询解析 → 索引检索 → 结果排序 → 响应返回
2.1 客户端预处理环节
移动端SDK会对搜索词进行以下处理:
- 自动补全空格(将"咖啡机"转为"咖啡 机")
- 移除emoji和部分特殊符号
- 对中文进行分词处理(依赖设备本地词库)
关键发现:通过对比Android/iOS的原始请求日志,发现Android端会将"#"转换为"%23"但未做URL Decode,导致后续环节将其视为普通字符。
2.2 网关层的"隐形杀手"
虽然网关返回的都是200状态码,但深入检查Nginx日志发现:
bash复制2023/08/15 14:22:45 [info] 31234#31234: *576432 client sent invalid URI: "/v1/search?q=%23订单123", client: 192.168.1.100
原来我们的WAF规则将包含"%23"的请求标记为潜在SQL注入攻击,虽然最终放行,但会剥离查询参数中的危险字符。
2.3 索引更新的时间陷阱
每日凌晨的索引重建任务存在两个问题:
- 采用增量更新策略时,部分分片版本不一致
- 新索引生效需要10-15分钟预热,期间查询可能路由
