Prompt、Skill、MCP 怎么选?用同一个任务实测三种 AI 工程化方案
让 AI 写代码、查数据库、生成报告——同一个需求,有人靠精心写 Prompt,有人封装成 Skill,有人接 MCP 服务器。这三种方式到底差在哪?什么时候该用哪个?我用一个真实的"查询商品库存"任务,分别用三种方式实现并实测对比,给出选型结论。
三者到底是什么关系
先把概念理清,很多人把它们混为一谈。这三者不是替代关系,而是控制粒度从细到粗的三个层次:
| 方案 | 本质 | 控制粒度 | 类比 |
|---|---|---|---|
| Prompt | 自然语言指令,模型当次推理生效 | 最细,一次对话 | 临时口头交代 |
| Skill | 打包好的指令+脚本+资源,可复用 | 中等,一个任务 | 写好的 SOP 操作手册 |
| MCP | 标准化的工具接入协议,连接外部系统 | 最粗,一套能力 | 给 AI 装一个外挂插件 |
💡 核心区别:Prompt 是"说什么",Skill 是"怎么做(封装好的步骤)",MCP 是"能做什么(连接外部能力)"。三者可以叠加——一个 Skill 里可以调用 MCP 提供的工具。
实测任务:查询商品库存
假设需求:用户问"商品 A 还有多少库存",AI 要查真实数据库并回答。下面用三种方式分别实现。
方式一:纯 Prompt 驱动
最简单的方式,把数据库信息直接塞进提示词,让模型基于上下文回答:
# 纯 Prompt 方式:把库存数据直接拼进提示词 inventory_data = """ 商品A:库存 150 商品B:库存 0 商品C:库存 320 """ prompt = f""" 你是一个库存查询助手。以下是当前库存数据: {inventory_data} 用户问题:商品A还有多少库存? 请基于上述数据回答。 """ # 调用大模型 response = llm.chat(prompt) print(response) # 输出:商品A还有150件库存❌问题马上暴露:库存数据是动态的,每分钟都在变。把数据写死在 Prompt 里,数据一更新就全错。而且数据量一上来(上万商品),Prompt 塞不下也费 token。
方式二:封装成 Skill
把"查询库存"封装成一个可复用的 Skill。Skill 的标准结构是一个文件夹 + 一个 SKILL.md 指令文件 + 配套脚本。Anthropic 官方的 anthropics/skills 仓库就是按这个结构组织的,里面放了一堆公开可复用的技能(pdf 处理、Excel 生成、艺术创作等)。
按这个标准结构,库存查询技能长这样:
# inventory-query/SKILL.md --- name: inventory-query description: 查询商品库存。当用户问"XX还有多少库存"时触发。 --- ## 执行步骤 1. 从用户问题中提取商品名称 2. 执行 scripts/query_stock.js <商品名> 查询真实库存 3. 用查到的数据回答用户// inventory-query/scripts/query_stock.js - 实时查询数据库 const productName = process.argv[2]; // 模拟查数据库(实际项目连 MySQL/Redis) const stock = queryDatabase("SELECT stock FROM products WHERE name = ?", [productName]); // 输出查询结果,供 Skill 的指令层使用 console.log(JSON.stringify({ product: productName, stock: stock })); // 输出:{"product":"商品A","stock":150}Skill 的执行流程:模型读到 SKILL.md → 识别到用户在问库存 → 自动调用query_stock.js→ 拿到真实数据 → 组织语言回答。
💡Skill 解决了 Prompt 的痛点:数据实时查询(不写死)、逻辑可复用(多个场景共享)、改动集中(改脚本不用改提示词)。想看更多真实例子,可以直接翻 anthropics/skills 官方仓库的源码。
方式三:接入 MCP 服务器
MCP(Model Context Protocol)是一套标准协议,让 AI 客户端能调用外部工具。把"查库存"做成一个 MCP 工具,任何支持 MCP 的客户端(Claude Desktop、ZCode、Cursor 等)都能直接用:
// mcp-config.json - 注册 MCP 服务器 { "mcpServers": { "inventory": { "command": "node", "args": ["./inventory-mcp-server.js"] } } }// inventory-mcp-server.js - MCP 服务器实现 import { Server } from "@modelcontextprotocol/sdk/server"; import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio"; // 创建 MCP 服务器,声明提供的工具 const server = new Server( { name: "inventory-server", version: "1.0.0" }, { capabilities: { tools: {} } } ); // 注册工具:query_stock(查库存) server.setRequestHandler("tools/list", async () => ({ tools: [{ name: "query_stock", description: "查询商品实时库存", inputSchema: { type: "object", properties: { product: { type: "string", description: "商品名称" } }, required: ["product"] } }] })); // 处理工具调用:真正查数据库 server.setRequestHandler("tools/call", async (request) => { if (request.params.name === "query_stock") { const product = request.params.arguments.product; // 查真实数据库 const stock = queryDatabase("SELECT stock FROM products WHERE name = ?", [product]); return { content: [{ type: "text", text: `${product}当前库存:${stock}件` }] }; } }); // 启动服务器,通过标准输入输出通信 const transport = new StdioServerTransport(); await server.connect(transport);接入 MCP 后,用户直接在 AI 客户端里问"商品 A 库存",客户端自动发现并调用query_stock工具,全程不需要用户知道有这个工具存在。
⚠️MCP 的本质:它不关心 AI 客户端是 Claude 还是 GPT,只要支持 MCP 协议就能调用。这是一套跨平台的工具标准,类似 USB 接口——做一次,到处用。
三种方式横向对比
用"查询库存"这个任务,从 6 个维度对比:
| 维度 | 纯 Prompt | Skill | MCP |
|---|---|---|---|
| 实现成本 | ⭐ 最低,写几行字 | ⭐⭐ 中等,写指令+脚本 | ⭐⭐⭐ 较高,实现服务器+协议 |
| 数据实时性 | ❌ 写死,易过期 | ✅ 脚本实时查 | ✅ 工具实时查 |
| 跨客户端复用 | ❌ 换个 AI 就失效 | ⚠️ 部分支持 | ✅ 标准协议,处处可用 |
| 维护成本 | ❌ 改逻辑要重写提示词 | ✅ 改脚本即可 | ✅ 改服务器即可 |
| 适合数据量 | 小(受 token 限制) | 任意 | 任意 |
| 上手门槛 | 零门槛 | 需懂脚本 | 需懂协议开发 |
三种方案的真实耗时对比
实测搭建"查库存"功能的全过程,记录耗时:
| 阶段 | 纯 Prompt | Skill | MCP |
|---|---|---|---|
| 编写 | 2 分钟 | 15 分钟 | 45 分钟 |
| 接入客户端 | 无需 | 配置加载 | 注册服务器 |
| 首次可用 | 即时 | 重载即可 | 重启客户端 |
| 响应延迟 | ~0.5 秒(纯推理) | ~0.8 秒(推理+脚本) | ~1.2 秒(推理+工具调用) |
💡 测试环境:Claude 3.5 + 本地 Node.js 18,库存数据库为本地 MySQL 8.0。每个方案实测 5 次取中位数。
关键结论:Prompt 最快但最脆弱,MCP 最强但最重。没有银弹,看场景选。
怎么选:决策树
别记概念,记住这个决策顺序:
你的需求是什么? │ ├─ 一次性、简单的任务(总结、翻译、改写) │ → 用 Prompt 就够了,别过度工程化 │ ├─ 重复出现的固定流程(每次都要查库+格式化+生成报告) │ → 封装成 Skill,写一次复用多次 │ └─ 要给多个 AI 客户端提供统一能力(团队共享、跨工具复用) → 做成 MCP 服务器,一劳永逸
💡 三者可以组合:一个 Skill 的内部可以调用 MCP 提供的工具。比如"库存分析报告"这个 Skill,内部用 MCP 的
query_stock工具取数,再用 Prompt 指令组织报告格式。
常见问题
Q: Skill 和传统的系统提示词(System Prompt)有什么区别?
A: System Prompt 只是一段文本指令,没有脚本和文件资源。Skill = 指令 + 脚本 + 模板 + 数据,是一个完整的可执行单元。可以把 Skill 理解成"带代码的强化版 Prompt"。
Q: MCP 一定要自己写服务器吗?
A: 不一定。社区有大量现成的 MCP 服务器(GitHub、文件系统、数据库、搜索引擎等),直接配置就能用。自己写只在有定制需求时。可以在 MCP 官方仓库 找现成的。
Q: 这三种方式会互相替代吗?
A: 不会。它们解决不同层次的问题。Prompt 解决"一次表达",Skill 解决"流程复用",MCP 解决"能力共享"。实际项目里三者共存才是常态。
Q: 用 Prompt 实现 Function Calling 不也算"调用工具"吗?
A: 是的,Function Calling 是 Prompt 和工具之间的桥梁。但它是各家 API 私有协议(OpenAI 一套、Anthropic 一套),MCP 的意义就是统一这套协议,让工具写一次到处用。
总结
Prompt:最轻量,适合一次性简单任务。痛点是数据写死、不可复用
Skill:封装指令+脚本,适合重复出现的固定流程。解决数据实时性和逻辑复用
MCP:标准化工具协议,适合跨客户端共享能力。成本最高但通用性最强
选型原则:一次性用 Prompt,重复流程用 Skill,跨工具共享用 MCP
三者可组合:Skill 内部可调用 MCP 工具,不是非此即彼
AI 工程化不是堆概念,是按控制粒度选对工具。简单的需求别上 MCP,复杂的能力别只用 Prompt。你的项目里现在用的是哪种?有没有遇到过"Prompt 写到几百行还管不住"的情况?欢迎评论区交流 👇
参考
Model Context Protocol 官方规范
Anthropic Skills 文档
MCP TypeScript SDK