现在位置: 首页 > Skills 教程 > 正文

Skills 调试

Skill 写好后,常常会遇到"没有触发"、"执行出错"、"输出不对"等问题。

本篇介绍排查这些问题的基本思路和方法。


调试的三类常见问题

问题类型 现象 优先排查点
未触发 Claude 完全没有使用 Skill description 写法、任务复杂度
触发但执行错误 Skill 被读取,但脚本运行失败 脚本路径、依赖、参数格式
触发且执行,但结果不符合预期 输出内容与期望有出入 SKILL.md 指令清晰度

调试问题一:Skill 未触发

这是最常见的问题,排查步骤如下:

第一步:确认 Skill 文件被正确加载

实例

# 检查 Skill 目录结构是否正确
ls -la my-skill/

# 确认 SKILL.md 存在且非空
wc -l my-skill/SKILL.md
-rw-r--r-- 1 user user  842 May 18 10:00 SKILL.md

第二步:检查 YAML frontmatter 格式

frontmatter 格式错误会导致 Skill 无法被识别。

---
name: my-skill
description: 这是一个示例 Skill,处理用户上传的文本文件。
---

# My Skill
...

frontmatter 必须以 --- 开始和结束,namedescription 字段名不能有多余空格,冒号后必须有一个空格。

第三步:使用更复杂的测试提示词

简单任务(如"读取这个文件")可能不会触发 Skill。

将测试提示词改为多步骤、有明确输出格式要求的复杂请求。

不易触发的提示词 更易触发的提示词
"分析这个文件" "分析这份销售数据 CSV,找出月度增长趋势,生成统计摘要表格"
"生成一个 PPT" "根据这份报告,创建一个 10 页的产品介绍演示文稿,要有图表和摘要"

调试问题二:脚本执行错误

脚本出错时,错误信息会出现在命令行输出中。

在 Claude 会话里,可以直接让 Claude 运行脚本并查看输出:

实例

# 手动运行脚本,检查错误输出
python scripts/process.py /mnt/user-data/uploads/test.csv

# 加 -v(verbose)参数查看详细日志(如果脚本支持)
python scripts/process.py /mnt/user-data/uploads/test.csv --verbose

常见错误类型与修复方法

错误信息 原因 修复方法
ModuleNotFoundError: No module named 'pandas' 依赖未安装 运行 pip install pandas --break-system-packages
FileNotFoundError: [Errno 2] 文件路径错误 检查文件是否在 /mnt/user-data/uploads/
PermissionError: [Errno 13] 无写入权限 将输出目标改为 /mnt/user-data/outputs/
SyntaxError 脚本语法错误 python -m py_compile 脚本名.py 检查

快速语法检查

实例

# 检查 Python 脚本语法(不执行,只验证语法)
python -m py_compile scripts/process.py && echo "语法正确" || echo "语法错误"

# 检查 Shell 脚本语法
bash -n scripts/run.sh && echo "语法正确" || echo "语法错误"
语法正确

调试问题三:输出结果不符合预期

这类问题通常源于 SKILL.md 中的指令不够清晰,或者存在歧义。

排查方法:逐步缩小范围

在 SKILL.md 中临时添加调试输出指令,观察 Claude 每一步的理解:

## 调试模式(开发时使用,发布前删除)

执行前,先输出以下信息供确认:
1. 识别到的输入文件路径
2. 用户期望的输出格式
3. 计划执行的步骤列表

等待用户确认后再继续执行。

常见的指令歧义问题

含糊写法 清晰写法
"处理完成后输出结果" "将结果保存到 /mnt/user-data/outputs/ 目录,并在对话中展示文件路径"
"分析数据" "计算各列的均值、中位数、标准差,并以 Markdown 表格形式输出"
"生成报告" "生成一个包含摘要段落、数据表格和结论的 HTML 文件,保存到输出目录"

使用 print 进行脚本内调试

在脚本关键节点添加打印语句,是排查执行流程问题最直接的方式。

实例

# 文件路径:scripts/debug_example.py
import sys

def process_file(file_path: str):
    print(f"[DEBUG] 开始处理文件:{file_path}")  # 调试点 1

    with open(file_path, "r", encoding="utf-8") as f:
        content = f.read()

    print(f"[DEBUG] 文件读取成功,大小:{len(content)} 字节")  # 调试点 2

    lines = content.split("\n")
    print(f"[DEBUG] 总行数:{len(lines)}")  # 调试点 3

    # 实际处理逻辑
    result = [line.strip() for line in lines if line.strip()]
    print(f"[DEBUG] 处理后有效行数:{len(result)}")  # 调试点 4

    return result

if __name__ == "__main__":
    output = process_file(sys.argv[1])
    print("\n--- 处理结果 ---")
    for line in output[:5]:  # 只显示前 5 行
        print(line)
[DEBUG] 开始处理文件:/mnt/user-data/uploads/sample.txt
[DEBUG] 文件读取成功,大小:1024 字节
[DEBUG] 总行数:32
[DEBUG] 处理后有效行数:28

--- 处理结果 ---
第一行内容
第二行内容
...

调试完成后,记得删除 [DEBUG] 开头的 print 语句,避免正式输出中混入调试信息。