简单讲讲 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 各司其职。该提供工具的时候提供工具,该沉淀经验的时候沉淀经验 ~