claude code使用提示词来调用skill
我使用了charles抓包工具对请求进行抓包,通过对请求体来分析其实现原理,claude code的请求的请求体有很多字段,我们主要看message字段即可
第一次请求:
我们可以看到第一个message中的第一部分将skill的一些信息(简单的描述、路径等)包含在了<system-reminder>``</system-reminder>中
后面的一些消息则不重要了,再之后我发了一个hello的消息,然后模型回复了Hello! How can I help you today?
1 | |
第二轮对话:
我让它帮我创建一个docx文件,然后模型回复我一些信息,让我完整一下内容
1 | |
第三轮对话
我让他创建一个空的docx文件,名字为temp.doc,模型这时候返回了一个工具调用,调用的是Skill这个工具(这是claude code内置的一个tool,我们传入要调用的skill的名称和参数【如果有】),则该工具调用会返回这个skill文件的完整的内容
1 | |
工具调用的结果:
1 | |
之后claude code会将工具调用的结果添加到messages中,发送给模型,然后模型进行后续的处理,后面的内容其实就不重要了,主要就是模型来调用一些工具,执行代码生成docx文件
然后我们可以看一下具体的Skill这个工具,这个也在请求头中声明了,可以看到这里声明了这个工具的功能,以及参数的含义
1 | |
可以看到claude code的Skill的实现并不复杂,首先将skill的一些元数据的信息添加到最开始的提示词中,然后使用一个Skill工具来根据传入的skill的名称来返回对应的skill的完整的内容,最后将内容作为工具调用的结果放到上下文中
使用命令来调用skills
如果在Claude code中直接使用命令来调用对应的skill的话,就是直接将对应的skill的内容添加到上下文中
codex中的实现
其实codex中的实现和Claude code基本差不多,同样在codex中,会在对话的开始阶段就将skill相关的指令添加到上下文,如下所示,在role:developer 的消息中定义了一些预设的prompt,其中skill相关的指令使用了<skills_instructions>``</skills_instructions>进行包裹,与claude code不同的是,它将对应的Skill的markdown文件的路径放在了prompt中,像这样(file: C:/Users/leftover/projects/blog.github.io/.codex/skills/docx/SKILL.md),而claude code并没有,只是放了skill的名称。
1 | |
因此其实现方式有点不一样,因此在需要调用skill的时候,codex会调用一个读文件的工具来读取skill的完整内容,可以看到它调用了shell_command 这个工具,来执行shell命令,传入的参数为command\":\"Get-Content -Path 'C:\\\\Users\\\\leftover\\\\projects\\\\blog.github.io\\\\.codex\\\\skills\\\\docx\\\\SKILL.md'\",\"workdir\":\"C:\\\\Users\\\\leftover\\\\projects\\\\blog.github.io\",这里他应该是沙盒中来执行的,最后返回文件的内容
1 | |
完整的请求的文件
Reference
- 本文作者: leftover
- 版权声明: 本文版权归leftover所有,如需转载清标明来源!