10.5 故障排查与问题诊断
在上下文工程的实践中,会遇到各种问题。本节汇总常见问题的诊断方法和解决方案,帮助快速定位和解决问题。
10.5.1 问题分类
上下文工程中的问题可以分为以下几类:
10.5.2 检索问题
检索是 RAG 系统的核心环节,检索问题直接影响最终效果。
问题:检索不到相关内容
症状:用户提问后,系统返回"未找到相关信息"或答案明显缺乏依据。
可能原因:
知识库未包含相关信息
嵌入模型与查询类型不匹配
分块策略导致信息碎片化
检索阈值设置过高
诊断步骤:
检查知识库是否包含相关文档
手动测试查询的嵌入相似度
查看检索返回的原始结果(含得分)
对比不同分块大小的检索效果
解决方案:
补充知识库覆盖度:添加缺失的文档
测试嵌入模型效果:尝试不同的嵌入模型
调整分块参数:增大块大小或添加重叠
引入混合检索:结合关键词和语义检索
降低检索阈值:获取更多候选结果
问题:检索结果不相关
症状:检索返回了内容,但与用户问题不相关。
可能原因:
语义相似但实际不相关(如同一领域的不同话题)
关键词权重不足
缺少重排序步骤
诊断步骤:
查看检索返回的具体内容
分析查询与结果的语义关系
检查是否存在关键词匹配
解决方案:
添加重排序步骤:使用交叉编码器二次排序
结合关键词检索:对专有名词等使用精确匹配
优化查询改写:使用 HyDE 等技术增强查询
添加元数据过滤:按类别、时间等过滤
10.5.3 生成问题
即使检索正确,生成阶段仍可能出现问题。
问题:答案不准确
症状:模型的回答与事实不符,或与检索内容矛盾。
可能原因:
上下文信息不足
模型产生幻觉
指令不够明确
检索内容质量差
诊断步骤:
检查上下文是否包含正确答案
对比模型输出与上下文内容
分析系统提示词的约束是否清晰
解决方案:
补充更多相关信息:增加检索数量
强化约束指令:明确要求"仅基于上下文回答"
加入事实核查步骤:让模型自查答案依据
使用引用格式:要求模型标注信息来源
问题:不遵循指令
症状:模型不遵守输出格式要求,或忽略重要约束。
可能原因:
指令被淹没在大量上下文中
格式要求不清晰
上下文存在冲突信息
诊断步骤:
检查指令在上下文中的位置
验证指令表述是否明确
检查是否有相互矛盾的内容
解决方案:
使用 XML 标签隔离:
<instructions>...</instructions>重要指令放在开头/结尾:利用位置优势
简化和明确指令:避免模糊表述
移除冲突内容:确保上下文一致
问题:输出不一致
症状:相同问题多次询问得到明显不同的答案。
可能原因:
温度(temperature)设置过高
上下文每次略有变化
检索结果不稳定
解决方案:
降低温度参数:设为 0 或很低的值(如 0.1)
固定上下文模板:确保每次构建一致
使用更明确的格式约束:减少输出变异
固定随机种子:部分模型支持
10.5.4 性能问题
问题:响应延迟高
症状:用户等待时间过长,影响体验。
可能原因:
上下文过长
检索慢
网络延迟
模型响应慢
诊断步骤:
分解各阶段耗时(检索、构建、生成)
检查上下文 Token 数量
监控网络延迟
解决方案:
压缩上下文:减少 Token 数量
优化索引:使用更高效的向量索引
使用缓存:缓存常见查询结果
流式输出:改善用户感知延迟
模型降级:延迟敏感时使用更快模型
问题:吞吐量不足
症状:高并发时请求堆积,响应变慢。
解决方案:
并行处理:充分利用异步能力
批量请求:合并处理相似请求
横向扩展:增加服务实例
队列缓冲:使用消息队列削峰
10.5.5 成本问题
问题:成本超出预算
症状:API 费用快速增长,超出预期。
诊断步骤:
分析 Token 使用分布
识别高成本的请求类型
检查是否有异常请求
解决方案:
压缩上下文减少 Token
使用更小的模型处理简单任务
增加缓存命中率
设置成本限制和告警
清理滥用或无效请求
10.5.6 稳定性问题
问题:服务不稳定
症状:偶发性失败、超时或异常。
解决方案:
实现重试机制:指数退避重试
设置超时控制:防止无限等待
添加熔断器:故障时快速失败
准备降级方案:核心功能保证可用
10.5.7 问题诊断清单
遇到问题时,按此清单逐项检查:
10.5.8 问题上报模板
团队协作时,使用标准化的问题报告格式:
通过系统化的问题诊断和解决流程,可以快速定位问题根因,减少排查时间,提高系统可靠性。
10.5.9 深度故障案例分析
以下是三个真实场景的故障排查过程,展示完整的诊断思路。
案例一:RAG 系统召回率骤降
故障现象:运行稳定的客服 RAG 系统,突然 40% 的问题无法找到相关答案。
排查过程:
根因:嵌入服务提供商静默升级了模型版本,新旧嵌入不在同一向量空间。
解决方案:
回滚嵌入 API 版本(临时)
用新模型重新嵌入全部知识库文档
添加嵌入版本监控告警
教训:嵌入模型版本必须与知识库一致,变更需要重建索引。
案例二:Agent 陷入死循环
故障现象:代码生成 Agent 在某些任务上不停循环调用工具,Token 消耗暴涨。
排查过程:
根因:工具返回的错误信息不完整,Agent 无法判断是代码问题还是环境问题,陷入"修代码"的循环。
解决方案:
丰富工具返回信息:包含错误类型、堆栈、环境状态
添加循环检测:连续 3 次相同 Action 时强制退出
加入
diagnose_failure()工具帮助 Agent 分析失败原因
教训:工具返回必须提供足够的上下文让 Agent 做出正确判断。
案例三:Token 超限导致关键信息被截断
故障现象:法律咨询系统偶发性给出错误建议,复现困难。
排查过程:
根因:上下文超限后的截断策略不当,重要指令被截断。
解决方案:
调整上下文结构:系统提示词置顶,永不截断
添加 Token 预算检查:超限时主动压缩历史而非被动截断
关键指令冗余:在多个位置重复核心约束
教训:截断是"隐形杀手",必须明确控制各部分优先级。
Last updated
