踩坑诊断库
所有 Skill、MCP、工作流仅供个人学习测试,功能、计费、权限以 workbuddy.cn 官方为准。
诚实声明:本库条目为通用排查框架,真实案例实录将在运营中逐步补充并标注来源。
本库按故障大类组织,收录 7 大类、12 条通用排查框架。每条结构固定:现象 → 排查 → 根因 → 修复,并附排查示例、截图脚本占位清单、预防 checklist 与小红书引流文案。涉及 WorkBuddy 专有行为(定时任务机制、缓存路径、上下文窗口大小、计费口径等)一律标注「待核验(以 workbuddy.cn 官方为准)」,不编造官方版本号、错误码与功能细节。
一、MCP 故障合集
以下为通用排查框架,非真实案例记录;具体根因请结合你的实际环境逐项验证。
MCP-01 · MCP 工具卡片红色离线 / 连接失败
现象
已配置的 MCP 工具在客户端显示红色"离线/未连接"状态;
调用时提示"连接失败/超时/无法到达"类通用文案;
同账号下部分 MCP 正常、个别 MCP 异常,或全部异常。
排查(按顺序逐项验证)
确认是单个 MCP 异常还是全部 MCP 异常:全部异常优先怀疑本地网络/账号登录态。
查看该 MCP 的连接配置(地址、端口、Token 字段名)是否仍与服务端一致;重点核对是否多了空格、换行、截断。
在本机用通用网络工具(curl/浏览器/终端)直接访问该 MCP 服务地址,判断是客户端问题还是服务端不可达。
检查 Token/密钥是否过期、是否被服务端吊销;重新生成一次最小权限 Token 测试。
切换网络(手机热点 vs 办公网)排除代理/防火墙拦截;企业内网常见出站 443 被审计代理劫持。
重启客户端并重新加载 MCP 配置,观察状态是否由红转绿。
根因(常见类别)
凭证类:Token 过期/写错字段/复制时带了多余字符。
网络类:本机断网、代理拦截、DNS 解析失败、服务端临时不可用。
配置类:地址变更后未同步、端口写错、JSON 配置少了引号导致解析失败。
客户端类:会话内 MCP 加载状态卡住(待核验:以 workbuddy.cn 官方为准)。
修复(根治 + 预防)
根治:按上述排查命中根因后修正配置或凭证;Token 走环境变量或密钥管理工具,禁止明文写进 Skill 脚本或提交到 git。
预防:建立"MCP 健康检查清单",每周一开工先看一眼连接状态;新增 MCP 时先在测试会话验证再挂到生产工作流。
排查示例
curl -v -m 5 https://<your-mcp-host>/health
# 期望:HTTP 200 或你方服务定义的健康检查响应
# 异常:超时 → 网络/防火墙;401/403 → Token;DNS 错误 → 本机解析截图脚本占位清单
| 序号 | 页面/位置 | 要展示的报错或界面元素 | 标注说明 |
|---|---|---|---|
| S1-1 | MCP 列表页 | 红色离线状态徽章 + 工具名 | 待补:需在真实客户端按此清单截图 |
| S1-2 | MCP 配置详情抽屉 | 地址/Token 字段(Token 打码为 ****) | 待补:需在真实客户端按此清单截图 |
| S1-3 | 调用报错浮层 | 完整报错文案 | 待补:需在真实客户端按此清单截图 |
预防 checklist
* [ ] MCP Token 存入环境变量/密钥工具,脚本内引用 $\{MCP\_TOKEN\} 占位
* [ ] 新增 MCP 先在独立测试会话跑通 3 次再接入工作流
* [ ] 每周一上午巡检 MCP 连接状态,红色项当天处理
* [ ] 配置文件纳入版本管理但 \.env 类密钥文件 \.gitignore
小红书引流文案:MCP 又红了?别着急重装——这张排查地图帮你 5 步定位是 Token 过期还是网络被墙。
MCP-02 · MCP 参数报错 / 权限拒绝
现象
MCP 连接正常,但调用某工具时返回"参数缺失/类型错误/权限不足"类提示;
同一个 Skill 在别人会话里能跑,在你这里报参数错;
改了提示词之后突然开始报权限错。
排查
对照该 MCP 的工具 schema,逐个核对必填参数是否传齐、类型是否匹配(字符串 vs 数字 vs 数组)。
检查参数里是否混入了未清理的占位符(例如仍写着
<your-token>)。确认当前 Token 所属账号/角色是否有该工具的调用权限;最小权限原则下常见"只给了读、没给写"。
把请求参数单独打印出来,用 curl/Postman 直接打 MCP 服务,绕开客户端判断是客户端拼装问题还是服务端拒绝。
核对是否在不允许的环境调用(例如生产写接口被限制只能内网访问)。
根因
参数拼装:Skill 模板里变量没替换、嵌套 JSON 多了一层引号。
权限范围:Token scope 不够,服务端按最小权限拒绝。
环境限制:该 MCP 仅允许指定网络/指定账号调用。
修复
根治:补齐参数 schema、申请对应 scope 的 Token;写操作单独用写 Token,与读 Token 分离。
预防:在 Skill 入口加参数自检(必填项缺失直接报错并提示哪一项),不要等到 MCP 服务端拒绝才暴露。
排查示例
curl -X POST https://<your-mcp-host>/v1/tools/<tool-name> \
-H "Authorization: Bearer ${MCP_TOKEN}" \
-H "Content-Type: application/json" \
-d '{"arg1":"<value1>","arg2":<value2>}'截图脚本占位清单
| 序号 | 页面/位置 | 要展示的报错或界面元素 | 标注说明 |
|---|---|---|---|
| S2-1 | 工具调用报错浮层 | 参数错误/权限拒绝文案 | 待补:需在真实客户端按此清单截图 |
| S2-2 | 该工具 schema 文档页 | 必填参数表 + scope 说明 | 待补:需在真实客户端按此清单截图 |
预防 checklist
* [ ] 读/写 Token 分离,写 Token 只在需要写的 Skill 里引用
* [ ] Skill 入口加必填参数自检,缺项直接给出可读提示
* [ ] 每次改提示词后跑一次最小调用冒烟测试
小红书引流文案:参数报错别让模型自己猜——把 schema 贴出来对一遍,5 分钟就能定位是少传了一个字段。
二、Skill 故障合集
以下为通用排查框架,非真实案例记录;具体根因请结合你的实际环境逐项验证。
SKL-01 · Skill 不触发 / 误触发
现象
明明说了该触发的话,Skill 没被唤起,模型走了普通聊天;
不该触发的时候被唤起,干扰正常对话;
同一个说法,有时触发有时不触发。
排查
打开 Skill 的描述(description/触发说明),核对自己这句话是否真的落在描述覆盖的场景里。
检查是否被另一个更宽泛的 Skill "抢触发":把其他 Skill 临时禁用,单独测这一个。
用更具体的说法重试一次(带上对象名、动作名),判断是触发词太模糊还是描述过宽。
核对 Skill 是否被启用/是否在当前会话的可用范围(待核验:以 workbuddy.cn 官方为准)。
查看 Skill 执行日志/调用记录,确认是"没触发"还是"触发了但立刻退出"。
根因
描述过宽/过窄:触发描述和用户真实说法对不上。
Skill 冲突:多个 Skill 描述重叠,路由随机。
未启用/版本不一致:本地修改未生效或云端版本未发布。
修复
根治:把 description 写成"我负责 X,不负责 Y"的边界句式;把高频用户原话加进触发示例。
预防:上线前用 10 句"应触发 + 5 句不应触发"做回归测试;冲突 Skill 改边界而不是加更多触发词。
排查示例
【我负责】当用户要做 <具体动作 A> 且对象是 <具体对象 B> 时
【我不负责】<相邻但归其他 Skill 的场景 C、D>
【典型说法】<用户真实原话 1> / <用户真实原话 2>截图脚本占位清单
| 序号 | 页面/位置 | 要展示的元素 | 标注说明 |
|---|---|---|---|
| S3-1 | Skill 列表页 | 该 Skill 启用开关状态 | 待补:需在真实客户端按此清单截图 |
| S3-2 | Skill 详情/描述页 | description 全文 | 待补:需在真实客户端按此清单截图 |
| S3-3 | 会话日志/调用记录 | 是否命中该 Skill 的记录 | 待补:需在真实客户端按此清单截图 |
预防 checklist
* [ ] 每个 Skill 描述明确写"我负责/我不负责"边界
* [ ] 改 description 后跑 10\+5 句触发回归
* [ ] 冲突 Skill 改边界,不靠堆触发词解决
小红书引流文案:Skill 老是"该醒不醒、不该醒乱醒"?把描述改成边界句式,触发准确率立刻上来。
SKL-02 · Skill 文件越界 / 脚本异常
现象
Skill 执行时报"无权限访问路径/文件不存在";
脚本跑一半报错退出,留下半截产物;
读写范围越出了 Skill 自己的工作目录。
排查
确认脚本里所有路径是相对工作目录的占位路径,而不是写死的本机绝对路径(例如
/Users/xxx/...)。核对该 Skill 被授权的文件白名单范围(待核验:以 workbuddy.cn 官方为准),是否真的覆盖了脚本要读写的目录。
单独跑一次脚本,把 stderr 完整打印出来;常见是依赖未装、解释器版本不对、权限位问题。
检查是否在脚本里写了
sudo、写了系统目录、或尝试覆盖只读资源。核对输入文件是否存在、是否为空、编码是否 UTF-8。
根因
路径越界:脚本假设了一个更宽的文件权限,实际白名单更窄。
脚本环境:依赖缺失、解释器版本不一致、环境变量没注入。
输入异常:空文件、编码错误、外部服务返回非预期格式。
修复
根治:脚本内一律用相对路径 + 工作目录占位;把需要的目录写进 Skill 权限申请说明;依赖随脚本打包或在 README 写清安装步骤。
预防:脚本开头加"前置检查"(文件存在性、依赖版本、环境变量是否为空),失败立即退出并打印可读错误,不写半截产物。
排查示例
set -euo pipefail
: "${INPUT_FILE:?INPUT_FILE 未设置}"
: "${OUTPUT_DIR:?OUTPUT_DIR 未设置}"
[ -f "$INPUT_FILE" ] || { echo "缺输入文件: $INPUT_FILE"; exit 1; }截图脚本占位清单
| 序号 | 页面/位置 | 要展示的元素 | 标注说明 |
|---|---|---|---|
| S4-1 | Skill 执行报错浮层 | 完整 stderr 末 20 行 | 待补:需在真实客户端按此清单截图 |
| S4-2 | Skill 权限配置页 | 文件读写白名单范围 | 待补:需在真实客户端按此清单截图 |
预防 checklist
* [ ] 脚本内禁止写死本机绝对路径
* [ ] 脚本开头 set \-euo pipefail \+ 前置自检
* [ ] 失败时清理半截产物,不留下脏文件
小红书引流文案:Skill 跑一半挂了还留一堆脏文件?加个前置自检,失败立刻干净退出。
三、定时任务故障合集
以下为通用排查框架,非真实案例记录;具体根因请结合你的实际环境逐项验证。定时任务的唤醒机制、会话隔离、上下文保留策略等 WorkBuddy 专有行为一律待核验(以 workbuddy.cn 官方为准)。
CRON-01 · 定时任务休眠失效 / 到点不触发
现象
设定了每天/每小时执行,但到点没动静;
昨天还在跑,今天突然不跑了;
客户端关掉之后就再也不触发(待核验:是否依赖客户端在线,以官方为准)。
排查
核对 Cron 表达式本身:时区是否正确、是否漏了"分/时/日"某一段、是否用了不被支持的语法。
确认任务是"启用"状态,没有被手动暂停或禁用。
查看任务历史执行记录,判断是从未触发还是从某次后停止。
检查账号登录态/会话是否过期;长休眠后重新登录一次再观察。
核对执行时段是否被周末/节假日规则过滤。
(待核验:以官方为准)确认客户端/后台进程是否需要保持在线。
根因
表达式错:时区错位(例如按 UTC 写了北京时)。
状态错:任务被禁用、会话过期、登录态失效。
环境依赖:客户端未运行、后台服务临时不可用。
修复
根治:显式指定时区;任务列表每周巡检一次启停状态;关键任务配一个"未执行告警"。
预防:新建任务后先手动触发一次验证链路通畅,不要等到第二天才发现不跑。
排查示例
□ 表达式是否 5/6 段齐全(分 时 日 月 周)
□ 时区是否显式写为 Asia/Shanghai
□ 是否包含不被支持的特殊字符(如 @reboot 等扩展语法)
□ 与你期望的下一次执行时间是否一致(用在线 Cron 解析器核对)截图脚本占位清单
| 序号 | 页面/位置 | 要展示的元素 | 标注说明 |
|---|---|---|---|
| S5-1 | 定时任务列表 | 启用开关 + Cron 表达式 + 下一次执行时间 | 待补:需在真实客户端按此清单截图 |
| S5-2 | 任务执行历史 | 最近几次执行记录/空态 | 待补:需在真实客户端按此清单截图 |
预防 checklist
* [ ] Cron 表达式显式带时区
* [ ] 新建任务先手动触发一次验证
* [ ] 关键任务配"未按时执行"告警
小红书引流文案:定好的任务一觉睡死?90% 是时区没写对——把 Asia/Shanghai 显式加上立刻见效。
CRON-02 · 定时任务重复推送 / 上下文失忆
现象
同一个任务在同一分钟推了多次结果;
任务跨轮次运行时"忘了"上一轮的中间结果,从头再跑一遍;
上次的执行结论这次完全没被引用。
排查
检查是否被同时创建了多个同名/同表达式任务;去重保留一个。
查看是否有重试机制在失败后反复重推(待核验:重试策略以官方为准)。
确认任务间是否真的需要共享上下文:定时任务通常按"每次独立会话"运行(待核验:以官方为准),把需要复用的中间结果显式写到文件/知识库,不要依赖模型记忆。
核对推送通道是否被多个订阅者同时接收(例如多个机器人/多个 webhook)。
根因
任务重复:同名任务被建了多份,或重试策略过宽。
上下文隔离:误以为定时任务会"记住"上一轮,实际每轮是新会话。
通道重复:同结果被推到多个目的地。
修复
根治:用幂等键(日期 + 任务 ID)作为输出文件名/消息 ID,重复推送时下游可识别丢弃;跨轮次依赖的状态写盘或写知识库,不依赖对话历史。
预防:所有定时任务命名规范统一(项目_任务_频率),列表里一眼能看出重复。
排查示例
输出文件名:<project>_<task>_<YYYYMMDD>.md
推送消息 ID:<task_id>:<YYYYMMDDHH>
# 下游收到重复 ID 直接丢弃,不重复通知截图脚本占位清单
| 序号 | 页面/位置 | 要展示的元素 | 标注说明 |
|---|---|---|---|
| S6-1 | 定时任务列表 | 疑似重复任务的两行记录 | 待补:需在真实客户端按此清单截图 |
| S6-2 | 推送通道配置 | 多个 webhook/订阅者列表 | 待补:需在真实客户端按此清单截图 |
预防 checklist
* [ ] 任务命名统一规范,便于去重
* [ ] 输出/推送带幂等键
* [ ] 跨轮次状态显式落盘,不依赖对话记忆
小红书引流文案:定时任务一边重复推一边失忆?两个小动作:加幂等键 + 状态落盘,立刻清爽。
四、RAG 知识库故障合集
以下为通用排查框架,非真实案例记录;具体根因请结合你的实际环境逐项验证。RAG 的分块策略、召回 top-k、重排机制等 WorkBuddy 专有配置一律待核验(以 workbuddy.cn 官方为准)。
RAG-01 · RAG 幻觉 / 答非所问
现象
问知识库内的问题,模型给出看似合理但库里根本没有的答案;
引用了文档编号/页码,但翻原文对不上;
简单事实题答错,复杂题反而对。
排查
先用同一问题去原始文档里全文搜索,确认"答案"在库里是否真的存在。
打开召回过程(待核验:是否有召回调试面板,以官方为准),看实际捞回来的是哪几段;常见是召回片段根本不相关。
核对分块大小:块太大 → 上下文噪声多;块太小 → 上下文断裂,模型自行补全。
降低或升高召回数量(top-k)做对比,观察答案是否随召回变化。
检查问题本身是否过长、是否混入了与知识库无关的个人背景,干扰向量召回。
根因
召回不准:query 和文档表述风格差异大,向量相似度低。
分块不当:块大小/重叠设置不合理。
提示词缺失:没有明确告诉模型"库里没有就说不知道",模型倾向于编。
修复
根治:在系统提示词里硬约束"仅基于召回片段回答,未命中时明确说知识库未覆盖";调整分块策略;对高价值文档加标题/元数据提升召回。
预防:建一份"高频问题 × 期望答案"小测试集,每次改 RAG 配置跑一遍回归。
排查示例
仅基于下面提供的【召回片段】回答用户问题。
如果召回片段中没有足够信息,必须直接回复:"知识库未覆盖此问题",禁止自行补充。
回答末尾标注引用片段编号 [1][2]。截图脚本占位清单
| 序号 | 页面/位置 | 要展示的元素 | 标注说明 |
|---|---|---|---|
| S7-1 | 问答对话页 | 模型幻觉答案 + 用户问题 | 待补:需在真实客户端按此清单截图 |
| S7-2 | 召回片段面板(如有) | 实际召回的文档片段列表 | 待补:需在真实客户端按此清单截图 |
预防 checklist
* [ ] 系统提示词硬约束"未命中即拒答"
* [ ] 建 10\-20 条高频问题回归集
* [ ] 每次改分块/召回参数后跑回归
小红书引流文案:RAG 一本正经胡说八道?在提示词里加一句"没查到就说没查到",幻觉立刻收敛。
RAG-02 · 检索旧版本 / 文档混杂
现象
文档已经更新,但模型还在引用上个月的旧版本;
同一份问题同时返回了 A 文档和 B 文档的内容,拼在一起自相矛盾;
删除过的旧文档内容仍被召回。
排查
核对文档更新后是否触发了重新索引/重建(待核验:索引刷新时机以官方为准)。
检查是否把"草稿版""归档版""正式版"都扔进了同一个知识库,没有元数据区分。
确认旧文档是否真的从知识库移除,而不只是本地删了文件。
在召回查询里加元数据过滤(例如
version=latest或status=published)做对比。
根因
索引未刷新:文档更新后向量库仍是旧切片。
命名/元数据混乱:多版本共存但没打标签,召回时一锅端。
删除不彻底:源文件删了但向量库残留。
修复
根治:知识库按"正式版/草稿版"分库或加元数据;文档更新后手动触发重建索引;删除文档时同步清理向量库。
预防:文件名/元数据强制带版本号和生效日期;定期巡检"孤儿切片"(源文件已删但向量仍在)。
排查示例
文件名:<主题>_v<语义化版本>_<生效日期 YYYYMMDD>.md
元数据字段:version / status(published|draft|archived) / effective_date
召回过滤:仅召回 status=published 且 effective_date <= today截图脚本占位清单
| 序号 | 页面/位置 | 要展示的元素 | 标注说明 |
|---|---|---|---|
| S8-1 | 知识库文件列表 | 多版本同名文件共存 | 待补:需在真实客户端按此清单截图 |
| S8-2 | 召回片段面板 | 同时命中新旧两版本文档 | 待补:需在真实客户端按此清单截图 |
预防 checklist
* [ ] 文档命名强制带版本号与生效日期
* [ ] 更新后手动重建索引
* [ ] 删除文档时同步清理向量库,不留孤儿切片
小红书引流文案:知识库越更新越乱?给每个文档打上版本号和生效日期,召回立刻按"最新版"说话。
五、长任务故障合集
以下为通用排查框架,非真实案例记录;具体根因请结合你的实际环境逐项验证。上下文窗口大小、长任务超时阈值、断点续跑能力等 WorkBuddy 专有行为一律待核验(以 workbuddy.cn 官方为准)。
LONG-01 · 断点丢失 / 上下文截断
现象
任务跑到一半,模型"忘了"前面已经做过的步骤,从头再做;
回答在某一句戛然而止,像被剪刀剪断;
处理长文档时只对开头/结尾有反应,中间内容像没看见。
排查
估算本次会话累计输入长度(文档 + 历史对话 + 工具返回),判断是否接近上下文窗口上限(待核验:具体窗口大小以官方为准)。
把超长文档分段喂入,每段独立提问,对比模型回答是否恢复正常。
核对是否在同一会话里塞了太多工具返回结果(日志/JSON/表格),这些会占掉大量上下文。
观察截断位置:常在输出 token 上限处戛然而止;缩短单次输出要求重试。
根因
窗口溢出:累计输入超过上下文窗口,早期内容被挤出。
输出截断:单次输出 token 上限触顶。
中间遗忘:长文本中段信息在注意力机制下被弱化("中间丢失"现象)。
修复
根治:长任务拆成"子任务 → 中间结果落盘 → 新会话继续";把大文档切块并行处理,最后汇总;不要把所有日志都塞进对话,写文件再让模型读关键摘要。
预防:长任务模板里显式要求"每完成一步把结论写到
./progress.md",新会话第一件事读这个文件。
排查示例
# progress.md
## 已完成
- [x] 步骤 1:xxx,结论:xxx
## 进行中
- [ ] 步骤 2:xxx
## 下一步提示
- 从这里继续,不要重做步骤 1截图脚本占位清单
| 序号 | 页面/位置 | 要展示的元素 | 标注说明 |
|---|---|---|---|
| S9-1 | 对话窗口 | 回答在中途截断的画面 | 待补:需在真实客户端按此清单截图 |
| S9-2 | progress.md 文件内容 | 断点续跑模板示例 | 待补:需在真实客户端按此清单截图 |
预防 checklist
* [ ] 长任务强制每步落盘 progress\.md
* [ ] 大文档切块并行,不一次性塞全文
* [ ] 工具日志写文件,对话里只留摘要
小红书引流文案:长任务跑一半模型就失忆?给它一个 progress.md,断点续跑比从头再来快 10 倍。
LONG-02 · 长任务中途中断
现象
任务跑了几分钟后主动停止,没有任何报错;
浏览器/客户端切换到后台后任务被挂起;
工具调用在某个外部请求上一直挂着,直到整体超时。
排查
核对是否触发了单次任务的最长执行时长(待核验:以官方为准)。
查看是不是某个 MCP/外部接口在等待响应,把整条链路拖死;单独测该接口。
确认客户端是否在后台被系统休眠(待核验:长任务是否依赖前台,以官方为准)。
检查是否有不可恢复的异常被静默吞掉(脚本里 try/except 空着)。
根因
超时:任务整体或某步调用触顶。
外部依赖挂起:MCP/HTTP 请求没设超时。
异常被吞:脚本静默 catch,看起来像"正常停止"。
修复
根治:所有外部请求显式设置超时(连接 5s、读取 30s);脚本里 catch 后必须打印日志并重抛或落盘错误;长任务拆成可恢复的子段。
预防:在任务入口加心跳(每 N 秒写一次
heartbeat.txt),无心跳则人工介入。
排查示例
import requests
try:
r = requests.get(url, timeout=(5, 30))
r.raise_for_status()
except requests.Timeout:
log.write("TIMEOUT at " + url)
raise
except Exception as e:
log.write(f"ERROR {type(e).__name__}: {e}")
raise截图脚本占位清单
| 序号 | 页面/位置 | 要展示的元素 | 标注说明 |
|---|---|---|---|
| S10-1 | 对话窗口 | 任务静默停止、无报错的画面 | 待补:需在真实客户端按此清单截图 |
| S10-2 | 日志文件 | 被吞掉的异常或最后一次心跳 | 待补:需在真实客户端按此清单截图 |
预防 checklist
* [ ] 所有外部请求显式设超时
* [ ] 脚本 catch 后必须打印日志,禁止空 except
* [ ] 长任务写心跳文件
小红书引流文案:任务跑到一半"悄无声息就死了"?加个超时 + 心跳,下次它死了你至少知道死在哪一步。
六、成本失控合集
以下为通用排查框架,非真实案例记录;具体根因请结合你的实际环境逐项验证。计费口径、积分规则、速率限制等 WorkBuddy 专有数据一律待核验(以 workbuddy.cn 官方为准),本条目不引用任何具体官方数字。
COST-01 · 循环调用 / 无上限重试导致积分爆掉
现象
一个看起来很普通的任务,消耗了远超预期的积分/额度;
模型在两个工具之间来回调用,陷入死循环;
失败后自动重试,重试次数没有上限,越错越烧钱。
排查
查看本次任务的调用记录/用量明细(待核验:入口以官方为准),定位是哪一类调用在暴涨。
回放对话,确认是否出现"A 调 B、B 又调 A"的循环模式。
检查 Skill/脚本里的重试逻辑:是否写了
while true: try ... except: continue这种无上限循环。核对是否在循环里每次都重新加载大文档/重新跑长 RAG,导致 token 倍增。
对比同类型任务的历史用量,判断是这次异常还是长期偏高。
根因
调用循环:工具之间互相触发,模型没有跳出。
重试无界:失败后无限重试,或重试间隔指数退避没设上限。
重复加载:循环体内重复喂大上下文。
修复
根治:所有重试加最大次数(建议 3 次)和总预算上限;循环体内把大文档/大结果缓存到文件,不要每轮重读;在系统提示词里显式约束"同一动作连续失败 3 次必须停下来向用户报告"。
预防:每周看一眼用量曲线,异常峰值当天复盘;高成本操作(长文档、多轮 RAG)前先做小样测试。
排查示例
MAX_RETRIES = 3
for attempt in range(1, MAX_RETRIES + 1):
try:
return call_external()
except Exception as e:
log.write(f"attempt {attempt} failed: {e}")
if attempt == MAX_RETRIES:
raise RuntimeError("达到最大重试次数,停止") from e截图脚本占位清单
| 序号 | 页面/位置 | 要展示的元素 | 标注说明 |
|---|---|---|---|
| S11-1 | 用量/积分页面 | 异常峰值时段的消耗曲线 | 待补:需在真实客户端按此清单截图 |
| S11-2 | 对话回放 | 工具互相循环调用的连续记录 | 待补:需在真实客户端按此清单截图 |
预防 checklist
* [ ] 所有重试逻辑写死 MAX\_RETRIES
* [ ] 循环体内大文档/大结果缓存到文件
* [ ] 每周巡检用量曲线,异常当天复盘
* [ ] 高成本操作先跑小样验证
小红书引流文案:积分一夜被烧光?十有八九是脚本里写了"失败就一直重试"——加个 3 次上限立刻止血。
七、缓存与本地文件异常合集
以下为通用排查框架,非真实案例记录;具体根因请结合你的实际环境逐项验证。缓存目录路径、缓存策略、文件锁机制等 WorkBuddy 专有行为一律待核验(以 workbuddy.cn 官方为准)。
CACHE-01 · 缓存膨胀 / 文件读写冲突
现象
磁盘可用空间持续下降,定位到 WorkBuddy 相关缓存目录占了大头(待核验:路径以官方为准);
两个 Skill/两次任务同时写同一个文件,输出内容互相覆盖或出现半截文件;
明明改了源文件,模型读到的还是旧内容。
排查
用磁盘占用工具(系统自带或
du)定位大目录,区分是缓存、日志还是真实产物。核对缓存目录是否有自动清理策略;如果没有,加一个按时间(例如 7 天)的清理脚本。
检查是否有多个任务/会话同时写同一个输出文件;常见于定时任务重试 + 手动触发同时跑。
文件写入是否走"先写临时文件再 rename"的原子方式;直接覆盖写容易留下半截文件。
核对模型读文件时是否走了 RAG/向量缓存,源文件改了但索引没刷新,导致读到旧切片(见 RAG-02)。
根因
缓存不清理:历史会话、上传文件、临时产物长期堆积。
并发写冲突:多进程写同一文件,无锁无原子写。
读缓存不一致:源文件改了但上层缓存/索引没失效。
修复
根治:加定时清理任务(按 mtime 清理 N 天前的缓存);所有产物写入走"临时文件 + rename"原子模式;并发写同一文件时加锁或按任务 ID 分文件。
预防:把"缓存目录大小"加进每周巡检;文件命名带任务 ID + 时间戳,从根本上避免冲突。
排查示例
import os, tempfile
def atomic_write(path, content):
dir_ = os.path.dirname(path)
fd, tmp = tempfile.mkstemp(dir=dir_, suffix=".tmp")
with os.fdopen(fd, "w", encoding="utf-8") as f:
f.write(content)
os.replace(tmp, path) # 原子替换,不留半截文件截图脚本占位清单
| 序号 | 页面/位置 | 要展示的元素 | 标注说明 |
|---|---|---|---|
| S12-1 | 磁盘占用工具 | 缓存目录体积占比 | 待补:需在真实客户端按此清单截图 |
| S12-2 | 文件目录 | 两个任务同时写同一文件产生的冲突现场 | 待补:需在真实客户端按此清单截图 |
预防 checklist
* [ ] 每周巡检缓存目录大小,超阈值触发清理
* [ ] 所有产物写入走临时文件 \+ rename 原子模式
* [ ] 输出文件名带任务 ID \+ 时间戳,避免并发覆盖
* [ ] 源文件更新后同步失效上层缓存/索引
小红书引流文案:磁盘越用越满、改了文件模型还读旧的?一次清理 + 原子写入,两个毛病一起治。
附:本库使用与更新说明
本库所有条目均为通用排查框架,不代表任何真实故障案例;真实案例实录将在运营中逐步补充,并在条目末尾标注来源与复现环境。
涉及 WorkBuddy 专有行为的描述(定时任务机制、缓存路径、上下文窗口、计费口径等)统一标注「待核验(以 workbuddy.cn 官方为准)」,使用前请对照官方最新文档。
本库不收录交易策略、自媒体批量脚本等敏感内容;所有密钥、Token 在示例中均以占位符呈现,禁止明文存储。
关联文档:版本兼容对照表、资产验收测试标准、最小可用配套资产包、FAQ/全站固定文案,见知识营地文件夹同目录下的兄弟文档。
(注:部分内容由豆包工作 AI 生成)