让 Agent 拥有超能力:一文读懂 Skill 的概念、原理与开发实战
从聊天机器人到能干活的智能体你只差一个“技能”引言当你在 ChatGPT 里问“今天天气怎么样”却只得到一句“我无法获取实时信息”时有没有想过如果 AI 能直接帮你查天气、发邮件、甚至操作数据库那该多好这正是Agent Skill要解决的问题——它让大语言模型突破“只动口不动手”的限制真正开始办事。这篇博文会用最通俗的方式带你从零认识 Agent Skill理解它的底层原理再通过可运行的代码开发自己的 Skill最后还会分享开源社区里现成的技能宝库。读完它你就能让 Agent 按你的想法干活。一、什么是 Agent SkillAgent Skill智能体技能是把一项具体能力——比如搜索网络、发邮件、查数据库、调用 API——打包成一个** Agent 能理解和调用的标准化模块**。你可以把它想象成手机的 App手机本身只是一个平台是各种 App 让它能拍照、导航、支付。同样AI Agent如 LangChain、AutoGPT、Coze 中的智能体是一个大脑Skill 就是它的手和脚。一个 Skill 通常由三部分组成名称与描述用自然语言清晰说明这个技能是干什么的、什么时候该用它。输入参数 Schema定义调用时需要哪些参数类型是什么哪些必填。执行函数真正干活的代码可以是本地函数、API 调用、数据库查询等。在不同的框架里Skill 也被叫做Tool、Plugin、Action本质上是一回事。本文统一用“Skill”。二、为什么需要 Skill打破大模型的边界LLM 的知识有截止日期且无法执行真实世界的操作。Skill 让它能获取实时信息、操作外部系统。可复用、可组合写好一个“发送邮件”的 Skill可以在多个 Agent 里反复使用多个 Skill 还能串联成复杂工作流。安全可控把危险操作封装在 Skill 里通过权限校验和参数白名单比让模型直接生成 SQL 或 Shell 命令安全得多。三、Skill 的运行原理从“打字机”到“行动者”Agent Skill 依赖大模型的Function Calling函数调用能力。整个交互过程可以拆成这样一个循环用户输入→ 2.构造上下文系统提示词 可用 Skill 列表 → 3.模型决策是否需要调用某个 Skill输出调用请求 → 4.运行时执行真正的 Skill 函数 → 5.将结果反馈给模型→ 6.模型生成最终回复给用户。用一张简单的流程图表示text用户: “帮我查一下伦敦现在几度”│▼[准备Skills]get_weather(城市)│▼[模型分析]决定调用 get_weather(location“London”)│▼[执行函数]requests.get(天气API) → “15°C, 晴”│▼[模型再次推理]结合结果生成自然语言回复│▼Agent: “伦敦现在15°C天气晴朗。”关键细节模型怎么“看懂”一个 Skill每个 Skill 都要转成 API 描述用的 JSON Schema 传递给模型。例如一个查天气的 Skill 定义长这样json{“type”: “function”,“function”: {“name”: “get_weather”,“description”: “获取指定城市的实时天气。当用户询问某地天气时使用。”,“parameters”: {“type”: “object”,“properties”: {“city”: {“type”: “string”,“description”: “城市名称例如 Beijing”}},“required”: [“city”]}}}模型看到这段描述就知道什么时候该调用它、需要传什么参数。描述写得越清晰准确模型选择 Skill 的成功率就越高——这几乎是 Skill 开发中最重要的一环。四、实战从零开发两个 Skill下面我们用纯 Python OpenAI API不依赖任何第三方 Agent 框架从底层实现一个能干活的小 Agent。你只需要安装openai准备好 API Key 就能跑。环境准备bashpip install openai requests通用 Agent 运行循环我们先写一个函数run_agent它会接收用户消息和 Skill 列表不断与模型交互遇到tool_calls就执行对应函数结果再送回模型直到模型返回纯文本回复pythonimport jsonfrom openai import OpenAIclient OpenAI(api_key“你的API_KEY”) # 替换为真实 keydef run_agent(user_message, tools, available_functions):messages [{“role”: “user”, “content”: user_message}]response client.chat.completions.create( modelgpt-4o-mini, messagesmessages, toolstools, tool_choiceauto ) response_message response.choices[0].message # 循环处理多个工具调用 while response_message.tool_calls: # 将模型的函数调用请求加入消息历史 messages.append(response_message) for tool_call in response_message.tool_calls: function_name tool_call.function.name function_args json.loads(tool_call.function.arguments) # 真正执行函数 function_response available_functions[function_name](**function_args) # 把执行结果包装成消息 messages.append({ role: tool, tool_call_id: tool_call.id, content: str(function_response), }) # 将执行结果发回模型生成下一步回复 response client.chat.completions.create( modelgpt-4o-mini, messagesmessages, toolstools, tool_choiceauto ) response_message response.choices[0].message return response_message.contentSkill 1获取当前时间零参数快速上手pythonfrom datetime import datetimedef get_current_time():“”“返回当前时间字符串”“”return datetime.now().strftime(“%Y-%m-%d %H:%M:%S”)Skill 的 JSON 定义tools_time [{“type”: “function”,“function”: {“name”: “get_current_time”,“description”: “获取当前精确时间当用户问现在几点、当前时间时使用。”,“parameters”: {“type”: “object”,“properties”: {},“required”: []}}}]available_functions {“get_current_time”: get_current_time}测试print(run_agent(“嘿现在几点了”, tools_time, available_functions))无需参数模型只需决定“要不要调”是理解整个机制的最佳起点。Skill 2获取加密货币价格带参数调用真实 API我们调用 CoinGecko 公开接口根据币种 ID如bitcoin获取美元价格。pythonimport requestsdef get_crypto_price(coin_id: str):“”“通过 CoinGecko API 获取加密货币当前价格”“”url “https://api.coingecko.com/api/v3/simple/price”params {“ids”: coin_id, “vs_currencies”: “usd”}try:resp requests.get(url, paramsparams, timeout10)data resp.json()price data[coin_id][“usd”]return f{coin_id} 当前价格{price} 美元except Exception as e:return f获取价格失败{str(e)}tools_crypto [{“type”: “function”,“function”: {“name”: “get_crypto_price”,“description”: “查询某种加密货币的当前价格币种需使用小写英文ID如 bitcoin, ethereum, dogecoin。”,“parameters”: {“type”: “object”,“properties”: {“coin_id”: {“type”: “string”,“description”: “加密货币的 CoinGecko ID例如 bitcoin”}},“required”: [“coin_id”]}}}]available_functions[“get_crypto_price”] get_crypto_priceprint(run_agent(“比特币现在值多少钱”, tools_crypto, available_functions))你会得到类似“bitcoin 当前价格57321 美元”的自然语言回复。到这里你已经掌握了让 Agent 调用任意 Python 函数的全部核心方法。五、开源 Skill 实例集合直接站在巨人肩膀上社区已经沉淀了大量现成的 Skill覆盖绝大多数常用场景。以下资源库都是极好的学习对象和拿来即用的宝藏。资源亮点地址LangChain Tools数百个封装好的工具Google 搜索、维基百科、计算器、代码解释器、SQL 数据库……python.langchain.com/docs/integrations/tools/GitHub 集成目录MCP 官方服务器合集Anthropic 推出的模型上下文协议MCP社区贡献了天气、文件系统、GitHub、数据库、浏览器自动化等大量服务器可作为 Agent Skill 直接挂载github.com/modelcontextprotocol/serversSemantic Kernel Plugins微软的 Plugin 设计典范包含 Microsoft Graph、Outlook、企业级 API 等技能示例github.com/microsoft/semantic-kernel (查看samples目录)CrewAI Tools面向多智能体协作内置文件读写、网络搜索、JSON 解析等实用技能github.com/crewAIInc/crewAI-toolsAutoGPT Plugins经典的插件生态可以学到如何为 Agent 注入复杂第三方能力插件模板社区精选列表awesome-mcp-servers、awesome-langchain等 Awesome 列表持续收录最新 Skill在 GitHub 搜索即可找到如何快速使用这些 Skill以 MCP 为例你只需启动对应的服务器如天气服务器Agent 框架LangChain、Claude Desktop 等就能自动发现并调用它们。大部分 Skill 都提供了详细的描述和参数 Schema拿来和自己写的 Skill 组合Agent 的能力瞬间膨胀。六、MCP 与 Skill容易混淆的两个概念细心的读者可能已经注意到上一节里多次出现了MCP甚至直接把 MCP 服务器当做 Skill 的集合来推荐。那 MCP 和 Skill 到底是不是一回事它们之间到底是什么关系——这确实是目前最容易混淆的一组概念。MCP 是什么MCPModel Context Protocol模型上下文协议是由 Anthropic 推出的一种开放协议它定义了 AI 应用客户端与外部工具/数据源服务器之间如何互相发现、描述和调用。可以把它理解为一套“通用插头标准”任何一个按照 MCP 规范编写的服务器都可以暴露出若干个工具Tool、资源Resource和提示模板Prompt。任何支持 MCP 的客户端比如 Claude Desktop、一些 Agent 框架都能直接连接到这些服务器自动识别并调用其中的能力。Skill 又是什么Skill则是我们一直在讲的具体能力单元比如“查天气”“发邮件”“读文件”。它关注的是“这个功能做什么、参数是什么、怎么执行”而不规定它必须通过哪种协议暴露出来。区别一图以蔽之维度SkillMCP概念层级功能单元做什么通信协议怎么连接标准化程度各框架有各自的描述格式OpenAI function、LangChain Tool 等统一的协议规范跨框架、跨语言可迁移性为某个框架写的 Skill换到另一个框架通常需要改写同样的 MCP 服务器可以被任何 MCP 客户端使用类比手机上的一个 App功能实体应用商店的安装标准与接口规范生态规则二者如何协作在实际场景中一个 MCP 服务器往往就是多个 Skill 的集合。例如官方的modelcontextprotocol/server-filesystem这个 MCP 服务器内部就提供了read_file、write_file、list_directory等多个 Skill。客户端通过 MCP 协议连接服务器后会拉取到一个工具列表Tools—— 这些工具的 JSON Schema 定义和我们前面手写的 Skill 描述一模一样。也就是说Skill 是“内容”真正干活的功能。MCP 是“管道”负责把 Skill 以一种标准、安全、可发现的方式交付给 Agent。为什么我们经常把它们混着说因为 MCP 生态推出后社区贡献了大量 MCP 服务器而每个服务器天然地自带一堆 Skill。所以当我们说“用 MCP 的天气服务器”时实际上是指“通过 MCP 协议使用了一个天气 Skill”。久而久之“MCP 服务器”就被当成了某种“超级 Skill 包”。但从学习开发的角度你需要清楚地知道你可以在完全不碰 MCP 的情况下开发 Skill就像我们第四节做的也可以把自己的 Skill 封装成一个 MCP 服务器从而让任何支持 MCP 的 Agent 都能使用它。七、开发自己的 Skill最佳实践清单写清描述是王道模型要靠你给的描述决定何时调用 Skill。写明“当用户想执行 X 任务时使用”可以加上反例“不要用于 Y 场景”。参数 Schema 要严格使用 JSON Schema 定义类型、枚举、必填项能大幅减少参数错误。例如json“operation”: {“type”: “string”,“enum”: [“add”, “subtract”, “multiply”, “divide”],“description”: “要执行的数学运算”}错误处理要友好捕获异常后返回有意义的信息帮助模型自我纠正。例如“未找到城市‘帕拉帕拉’请尝试使用更常见的城市名”。安全第一涉及文件、数据库、邮件的 Skill务必在函数内部做权限校验和输入过滤绝不可直接把用户原始输入拼进命令行或 SQL。充分测试先用单元测试确保函数本身正确再放进 Agent 里和模型一起调试。模型的“想象力”有时会传入你意想不到的参数。结语理解 Agent Skill 就像给 AI 装上了可插拔的“技能芯片”。从简单的查时间到调用链上的复杂业务 API所有的能力都是通过同一套“描述-调用-执行”的范式来实现。与此同时MCP 作为新兴的标准化协议正在让这些技能的开发与共享变得更加规范、跨平台。但你始终要记得Skill 是灵魂MCP 是躯壳——先有了强大的技能才能谈得上如何更好地交付它们。今天你跟着这篇文章已经掌握了Skill 是什么为什么需要它底层 Function Calling 的完整交互流程用 Python OpenAI 从零开发带 Skill 的 Agent开源社区现成的强大技能库MCP 与 Skill 的区别与联系接下来你可以去 GitHub 上随意打开一个 MCP 服务器或 LangChain Tool 的源码你会发现它们的核心结构和我们手写的 Skill 完全一致——剩下的就是构思你的 Agent 应该拥有哪些超能力然后一个一个实现它们。延伸阅读与资源Milvus向量数据库实战修炼从 0 到 1精通向量检索与生产落地后端工程师的 AI 转型第一课Ollama 与私有化大模型实战10倍开发者的 Dify 魔法书从零构建全栈 AI 应用后端工程师转型AI第一课-Ollama 与私有化大模型实战大型语言模型(LLM) vLLM 高性能推理落地实战Agent开发之LlamaIndex 实战修炼与源码进阶大语言模型Transformers 实战修炼与源码剖析