你是一名有4年sre经验的python线上故障响应工程师,正在处理一个刚上线就500的flask接口,用户已提供完整traceback和deploy_log_v20260618-03.txt。请忽略所有venv/site-packages路径,只聚焦用户代码。每条排查步骤必须严格按【位置】→【现象】→【动作】格式,且动作动词只能是:检查、确认、打印、替换、删除、添加、重启、回滚。禁止出现“可能”“建议”“可以”。本次发布仅修改了payment.py第112–116行(新增优惠券核销逻辑),未更新requirements.txt,未改动数据库schema。请不要检查redis连接池配置、不要分析sqlalchemy session生命周期、不要建议增加超时时间——所有异常均发生在http 200返回后、异步任务触发前。第一步:定位堆栈中第一个非框架路径 → 这是首查坐标。第二步:检查该行所在函数的入参是否被上游空值穿透。第三步:检查该行调用的外部服务api是否在最近10分钟有状态变更(查statuspage.io或curl -i https://api.stripe.com/v1)。第四步:检查该行所在模块的单元测试是否覆盖此分支(运行 pytest test_payment.py::test_charge_with_coupon -s)。第五
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

要让通义千问输出的报错排查步骤能直接贴进团队Wiki或发到故障群通知所有人,必须让它跳过解释性语言、绕过模糊归因、不提“可能”“建议”,只输出带坐标、可执行、带验证动作的硬指令。
第一步:用角色+场景锚定输出粒度
在提问开头写:“你是一名有4年SRE经验的Python线上故障响应工程师,正在处理一个刚上线就500的Flask接口,用户已提供完整Traceback和deploy_log_v20260618-03.txt。请忽略所有venv/site-packages路径,只聚焦用户代码。”
这句强制模型跳过对urllib3、Werkzeug等框架层的泛泛分析,把注意力压向/app/routes/order.py第72行这类真实坐标。
不加这句,它大概率从File “/venv/lib/python3.11/site-packages/flask/app.py”, line 2528, in __call__开始逐行翻译,浪费3分钟且无法执行。
第二步:强制结构化动词与三要素绑定
在堆栈后追加指令:“每条排查步骤必须严格按【位置】→【现象】→【动作】格式,且动作动词只能是:检查、确认、打印、替换、删除、添加、重启、回滚。禁止出现‘可能’‘建议’‘可以’。”
例如正确输出:
③ /app/services/payment.py 第114行 → 调用 stripe.Charge.create() 前未校验 order_id 是否为空字符串 → 在该行前插入 print(f"DEBUG: order_id={repr(order_id)}"),重放请求并确认日志输出。
【若未出现print语句或repr包装,说明模型未理解调试需暴露原始值】
第三步:注入本次变更上下文,排除干扰路径
方法一:直接附关键信息
“本次发布仅修改了payment.py第112–116行(新增优惠券核销逻辑),未更新requirements.txt,未改动数据库schema。”
方法二:用否定式收缩范围
“请不要检查Redis连接池配置、不要分析SQLAlchemy session生命周期、不要建议增加超时时间——所有异常均发生在HTTP 200返回后、异步任务触发前。”
这两句能让模型自动过滤掉80%的无效排查方向,比如不会去翻redis.conf或查connection_timeout参数。
第四步:指定输出数量与优先级顺序
第一步:定位堆栈中第一个非框架路径 → 这是首查坐标。
第二步:检查该行所在函数的入参是否被上游空值穿透。
第三步:检查该行调用的外部服务API是否在最近10分钟有状态变更(查statuspage.io或curl -I https://api.stripe.com/v1)。
第四步:检查该行所在模块的单元测试是否覆盖此分支(运行 pytest test_payment.py::test_charge_with_coupon -s)。
第五步:检查该行前后3行是否存在未处理的except块吞噬了原始异常(搜索 except: 或 except Exception:)。
这五步按真实故障概率降序排列,跳过所有“重启Nginx”“清DNS缓存”类万金油动作。











