«

简单讲讲 function call 和 skill 的区别

时间:2026-4-15 00:43     作者:独元殇     分类: 开发相关


欢迎关注我的公众号,名叫「串串狗小刊」

MCP 就是一个历史上的阶段性实验产物,现在 2026 年 4 月看,论效率和性价比,没法跟 agent 与 cli 直接跑来比,论长时间的运行和 token 消耗节省度,又无法和 skill 比较,当然,它在准确度上,目前仍有优势。

今天,其实我更想说一下 skill 和 function call 这两个的比较。

是的,又一个新概念。 function call 是什么?和说明书一样的 skill 差不多,也是让模型去调用外部能力的一种方式。

Function Call 是大模型在对话过程中调用外部函数的能力,它允许模型在无法直接回答问题时,返回一个函数调用请求,而不是生成文本。开发者需要手动解析这个请求,执行对应的函数,并将结果传回给模型,以生成最终答案。需要注意的是,模型本身并不会真的执行函数,执行的任务必须由你自己定义和实现。

但是 skill 是一大堆口头语言,输出也是口语。但 function call 给你的更好,直接给你一串 JSON!这样你使用别的工具调用它的时候,就会特别的准确的舒服了!

比如说,“帮我看看今天深圳的天气如何?”

然后大模型给你的是:

{
  "function": "get_weather",
  "parameters": {
    "city": "深圳",
    "date": "2026-04-14"
  }
}

这个对于低歧义、稳定性、准确性很重要。

它有啥用?

很简单,我们做的 agent ,有一个头疼的问题,就是不知道什么时候属于【正常聊天】,什么时候属于【调用工具模式】。该调用工具时,大模型突然傻傻的,给你嘻嘻哈哈莫名其妙聊起来了.... 气死人。

如果我们之前和模型约定好,有个函数叫 get_weather ,那等模型得到这串 JSON 后,就知道该调用工具其查询 XX 天的天气了!就可以准确发起工具调用,而且数据清晰,几乎无歧义。

毕竟我们的 agent 里面数据倒来倒去,如果是纯 skill 这种口头语言不断传递,会损失很多信息。

在处理信息的时候,又不是人看,直接写成固定格式更稳定。

它的颗粒度小,一大堆东西只干一个具体的事,并且全是在将是怎么调用动作的。

那 skill 呢?

网上已经有几千万个 skill 了。

但是这些 skill 只是一个文本流程,它只能告诉模型,面对复杂任务,怎么少走弯路,但落实到细处,很容易出现一些太自由的事情,比如给你删库.... 哈哈。我就被删过。 想当年,我只是在一个我自用的 skill 里写了一句「顺便适当优化一下数据库结构」,谁知道它突然有一天给我删库了。

换言之,颗粒度:

skill 颗粒度最大,然后 MCP 次之,然后是 function call ,最后则是我们手写代码颗粒度最小了。

怎么表示?

也就是,怎么和大模型约定?

大模型其实非常喜欢看 JSON ,比看 skill 文本还讨喜。

所以先写一个这种格式的 JSON 文本:

{
  "name": "查询天气",
  "description": "根据城市名称查询实时天气信息",
  "parameters": {
    "type": "object",
    "properties": {
      "城市": {
        "type": "string",
        "description": "需要查询天气的城市名称"
      },
      "温度单位": {
        "type": "string",
        "enum": ["摄氏度", "华氏度"],
        "description": "温度显示单位,默认为摄氏度"
      }
    },
    "required": ["城市"]
  }
}

那么怎么使用呢?

这个也是 openAI 的一个标准,可以参考各大库的文档格式,比如这个是一个 nodejs 的使用示例:

import OpenAI from 'openai';
const openai = new OpenAI({apiKey: process.env.DASHSCOPE_API_KEY, baseURL:"https://dashscope.aliyuncs.com/compatible-mode/v1"});

// 工具定义 + 模拟实现
const getWeather = () => "北京今天晴天";
const tools = [{type:"function",function:{name:"get_current_weather",parameters:{type:"object",properties:{},required:[]}}}}];

// 核心调用
async function main(){
  let msg = [{role:"user",content:"北京天气"}];
  let res = await openai.chat.completions.create({model:"qwen3.6-plus",messages:msg,tools});
  let aiMsg = res.choices[0].message;

  // 执行工具并回传给AI
  if(aiMsg.tool_calls){
    msg.push(aiMsg, {role:"tool",tool_call_id:aiMsg.tool_calls[0].id,content:getWeather()});
    res = await openai.chat.completions.create({model:"qwen3.6-plus",messages:msg});
  }

  console.log(res.choices[0].message.content);
}
main();

这两个没有优劣之分,function call 和 skills 各司其职。该提供工具的时候提供工具,该沉淀经验的时候沉淀经验 ~

标签: 原创 AI skill