一、背景

之前写过一篇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,然后让大模型调用函数,递归算结果。           

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐