结合openai协议,谈谈agent的skill调用过程
·
一、背景
之前写过一篇tools的实现过程,有人私信问skill、mcp的实现,就顺便写一下agent的skill调用过程,并提供示例
结合openai协议谈谈tools调用是怎么实现的-CSDN博客
二、agent调用skill实现原理
agent调用skill的过程,本质上是通过tools的方式实现的,想了解skill的实现,需要先了解tools的实现
结合openai协议谈谈tools调用是怎么实现的-CSDN博客
-
Agent 框架:负责维护对话历史(Messages)、执行本地工具(如读取文件、执行命令)。
-
LLM:负责理解意图、决策调用哪个工具、阅读 Skill 说明书并执行。
-
Skill:一份结构化的指令文件(如 SKILL.md),告诉 LLM 遇到特定场景该如何一步步操作。
三、完整示例
以“读取并总结一篇微信公众号文章”为例,完整展示基于 OpenAI 协议的输入输出,并拆解 Agent、LLM 与 Skill 之间的交互流程
整个交互是一个典型的Agent Loop(智能体循环),包含“思考 -> 行动 -> 观察”的闭环
1. 用户发起请求,Agent 注入 Skill 清单。
(1)用户说:“帮我总结一下这篇公众号文章:[微信链接]”;
(2)Agent 框架会将用户的消息、系统提示词(包含所有可用 Skill 的简短描述)以及基础工具(如Read和Shell)打包,发送给 LLM;
(3)如下所示,LLM请求,skill描述放在"role": "system"处,同时注意tools(基础工具)
{
"model": "gpt-4",
"messages": [
{
"role": "system",
"content": "你是一个AI助手。你可以使用以下技能(Skills):\n<available_skills>\n<skill name=\"mp-read\">当用户需要阅读、提取或总结微信公众号文章,或对话中出现 mp.weixin.qq 链接时使用此技能。</skill>\n</available_skills>"
},
{
"role": "user",
"content": "帮我总结一下这篇公众号文章:https://mp.weixin.qq.com/s/xxxx"
}
],
"tools": [
{
"type": "function",
"function": {
"name": "Read",
"description": "读取本地文件内容",
"parameters": { "type": "object", "properties": { "path": { "type": "string" } }, "required": ["path"] }
}
},
{
"type": "function",
"function": {
"name": "Shell",
"description": "执行Shell命令",
"parameters": { "type": "object", "properties": { "command": { "type": "string" } }, "required": ["command"] }
}
}
],
"tool_choice": "auto"
}
2. 大模型的响应,通过"finish_reason":"tool_calls"告之agent,通过读取本地文件的工具,获取skill的详情。如下所示,是LLM的返回
{
"choices": [{
"finish_reason": "tool_calls",
"message": {
"role": "assistant",
"content": null,
"tool_calls": [{
"id": "call_def456",
"type": "function",
"function": {
"name": "Shell",
"arguments": "{\"command\": \"node fetch_mp.js https://mp.weixin.qq.com/s/xxxx\"}"
}
}]
}
}]
}
3. agent执行tool(读取skill详情),将tool的执行结果拼接到LLM的请求。如下所示 "role": "tool"
{
"model": "gpt-4",
"messages": [
// ... 前面的 system 和 user 消息 ...
{
"role": "assistant",
"content": null,
"tool_calls": [{ "id": "call_abc123", ... }] // LLM 的调用请求
},
{
"role": "tool",
"tool_call_id": "call_abc123",
"content": "# Skill: mp-read\n## 触发条件\n当用户提供微信公众号链接时触发。\n## 执行步骤\n1. 使用 Shell 工具执行命令: `node fetch_mp.js <URL>` 来获取文章纯文本。\n2. 阅读返回的文本,并为用户提供一段 200 字以内的摘要。"
}
],
"tools": [...] // 保持工具定义不变
}
4. 再次请求LLM,LLM根据skill的详情,知道下一步要调用tool,以下所示,为LLM的返回("finish_reason": "tool_calls"告之下一步调用工具)
{
"choices": [{
"finish_reason": "tool_calls",
"message": {
"role": "assistant",
"content": null,
"tool_calls": [{
"id": "call_def456",
"type": "function",
"function": {
"name": "Shell",
"arguments": "{\"command\": \"node fetch_mp.js https://mp.weixin.qq.com/s/xxxx\"}"
}
}]
}
}]
}
5. 从LLM的回复,agent知道要调用调用 Shell 命令抓取文章内容,并将结果拼接到LLM的下一步请求
{
"model": "gpt-4",
"messages": [
// ... 前面的所有消息 ...
{
"role": "tool",
"tool_call_id": "call_def456",
"content": "文章标题:AI Agent 的未来\n文章内容:本文将探讨 AI Agent 的发展趋势...(此处省略1万字)"
}
],
"tools": [...]
}
6. 大模型返回结果,整个skill执行完成
{
"choices": [{
"finish_reason": "stop",
"message": {
"role": "assistant",
"content": "这篇文章主要探讨了 AI Agent 的未来发展趋势。文章指出,随着大模型推理能力的增强,Agent 将从简单的工具调用走向复杂的多步任务规划..."
}
}]
}
5. 注意,tools可能不是调一次,这就引入了ReAct。例如,你定义了一个递归的函数作为tool,然后让大模型调用函数,递归算结果。
更多推荐



所有评论(0)