一、概念严格对齐(按你的定义)
Skill:封装大模型专有能力+ 上下文交互,形成的专属能力。 本质:模型内生能力,无外部系统调用,依赖 LLM 推理、上下文记忆、提示词编排。
Tool:封装外部系统 / 服务调用,形成的专属能力。 本质:外部资源能力,必须发起网络 / IO 请求,对接 API、数据库、脚本、硬件等。
核心边界
- 执行主体
- Skill:大模型自身完成计算、理解、创作、推理
- Tool:外部服务完成执行,模型只负责发起调用、解析结果
- 依赖
- Skill:仅依赖 LLM + 对话上下文 / 提示模板
- Tool:依赖网络、第三方服务、权限、接口协议(如 MCP)
- 运行环境
- Skill:进程内闭环,低延迟、无外网依赖
- Tool:跨进程 / 跨网络调用,存在可用性、网络、安全风险
二、LangChain 中 Skill 标准实现(模型能力 + 上下文封装)
下面实现纯 Skill:基于 LLM + 固定上下文模板封装,不调用任何外部接口。 场景:文本摘要、文案改写、逻辑分析(典型大模型专有能力)。
环境依赖
bash
运行
pip install langchain langchain-openai python-dotenv完整代码:Skill 封装(模型 + 上下文)
python
运行
from langchain.tools import tool from langchain_openai import ChatOpenAI from langchain.agents import AgentExecutor, create_react_agent from langchain_core.prompts import PromptTemplate from dotenv import load_dotenv load_dotenv() # 初始化大模型(Skill 唯一依赖) llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0) # ===================== 定义 Skill:封装模型能力 + 固定上下文模板 ===================== @tool def text_summary_skill(long_text: str) -> str: """ Skill:长文本摘要(大模型专有能力,纯上下文+LLM推理) 封装固定提示上下文,复用摘要能力,无外部调用 Args: long_text: 待摘要的长文本 """ # 固定上下文模板 = 能力封装的核心 prompt_template = PromptTemplate( input_variables=["content"], template=""" 请精简总结下面内容,提炼核心观点,控制在100字以内: 原文:{content} 总结: """ ) # 拼接上下文 + 调用模型(纯内生能力) prompt = prompt_template.format(content=long_text) return llm.invoke(prompt).content @tool def copywriting_skill(raw_text: str, tone: str) -> str: """ Skill:文案风格改写(大模型语义能力+上下文封装) Args: raw_text: 原始文本 tone: 风格:正式/活泼/商务 """ prompt = f""" 固定上下文规则:仅改写语气,不增删原意。 将以下文本改写为{tone}风格: {raw_text} """ return llm.invoke(prompt).content # ===================== 智能体加载 Skill 并调用 ===================== all_skills = [text_summary_skill, copywriting_skill] agent_prompt = PromptTemplate.from_template(""" 你拥有文本摘要、文案改写两项能力,请根据用户问题选择对应Skill执行。 用户输入:{input} 可用能力:{tools} 能力名称:{tool_names} {agent_scratchpad} """) # 创建智能体 & 执行器 agent = create_react_agent(llm, all_skills, agent_prompt) agent_executor = AgentExecutor(agent=agent, tools=all_skills, verbose=True) if __name__ == "__main__": # 测试 1:调用摘要 Skill print("===== 测试 文本摘要 Skill =====") text = """ 本周公司整体营收稳步增长,线上渠道贡献主要订单, 线下门店客流略有回升。团队完成季度复盘,确定下月重点拓展新客户。 """ res1 = agent_executor.invoke({"input": f"帮我总结这段内容:{text}"}) print(res1["output"]) # 测试 2:调用文案改写 Skill print("\n===== 测试 文案改写 Skill =====") res2 = agent_executor.invoke({"input": "把「今天订单很多,大家辛苦啦」改成商务风格"}) print(res2["output"])代码解读(贴合你的定义)
- 整个能力 =固定上下文模板 + 大模型推理,属于对模型专有能力的封装;
- 全程无任何外部接口、数据库、API 调用,是标准
Skill; - 可以反复复用这套 “上下文 + 模型逻辑”,成为智能体的固定能力。
三、LangChain 中 Tool 标准实现(外部调用能力)
同样用@tool封装,但内部逻辑是调用外部资源,属于标准Tool。 示例:模拟查询业务数据(对接外部接口 / 数据库,搭配 MCP 调用思想)。
python
运行
from langchain.tools import tool import requests # 模拟外部服务地址(真实场景为数据库/业务API/MCP服务) EXTERNAL_DATA_API = "http://127.0.0.1:8001/mcp/tool" @tool def business_data_query_tool(query_key: str) -> str: """ Tool:业务数据查询(外部工具调用能力) 依赖外部API/MCP服务,非模型原生能力 Args: query_key: 查询字段:sales/orders/users """ # 发起外部网络调用(Tool 核心特征) payload = {"tool": "db_query", "params": {"query_key": query_key}} try: resp = requests.post(EXTERNAL_DATA_API, json=payload, timeout=5) data = resp.json() return f"查询结果:{data.get('data', '暂无数据')}" except Exception as e: return f"工具调用失败:{str(e)}" # 单独调用测试 if __name__ == "__main__": print(business_data_query_tool.invoke({"query_key": "sales"}))代码解读
- 能力来源于外部服务,模型只负责 “发起调用、接收结果”;
- 依赖网络、第三方服务,符合
Tool定义; - 企业场景中,这类调用统一走MCP 协议标准化接入。
四、Skill + Tool 完整协同链路(企业标准流程)
真实业务中二者组合使用,流程:用户指令 → Skill(理解 / 规划 / 文本加工,模型能力) → Tool(查外部数据,外部调用) → Skill(整理输出,模型能力)
组合代码示例
python
运行
from langchain.tools import tool from langchain_openai import ChatOpenAI from langchain.agents import AgentExecutor, create_react_agent from langchain_core.prompts import PromptTemplate import requests from dotenv import load_dotenv load_dotenv() llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0) EXTERNAL_DATA_API = "http://127.0.0.1:8001/mcp/tool" # ---------- 1. 定义 Skill(模型能力:报告生成) ---------- @tool def report_generate_skill(data_content: str) -> str: """Skill:基于原始数据生成分析报告(大模型上下文+推理)""" prompt = f""" 请根据以下数据,生成简短业务分析报告: {data_content} 要求:分数据展示、简短分析两部分。 """ return llm.invoke(prompt).content # ---------- 2. 定义 Tool(外部调用:数据查询) ---------- @tool def data_query_tool(query_key: str) -> str: """Tool:查询外部业务数据(外部接口调用)""" payload = {"tool": "db_query", "params": {"query_key": query_key}} resp = requests.post(EXTERNAL_DATA_API, json=payload, timeout=5) return str(resp.json()) # ---------- 智能体加载 Skill + Tool ---------- tools = [report_generate_skill, data_query_tool] agent_prompt = PromptTemplate.from_template(""" 流程要求:先使用 data_query_tool 查询数据,再使用 report_generate_skill 生成报告。 用户输入:{input} 可用工具:{tools} 工具名称:{tool_names} {agent_scratchpad} """) agent = create_react_agent(llm, tools, agent_prompt) agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True) if __name__ == "__main__": # 完整链路:Tool查数据 → Skill生成报告 res = agent_executor.invoke({"input": "查询销售额并生成分析报告"}) print("\n最终输出:") print(res["output"])链路对应定义
data_query_tool:调用外部接口 →Toolreport_generate_skill:模型 + 上下文生成报告 →Skill
五、汇总对比(严格匹配你的定义)
表格
| 对比项 | Skill(模型专有能力封装) | Tool(外部工具调用封装) |
|---|---|---|
| 能力来源 | 大模型原生推理、语义、创作能力 | 外部 API / 数据库 / 系统 / 硬件 |
| 实现核心 | 上下文模板 + LLM 调用 | 网络 / IO 请求 + 外部服务交互 |
| 外部依赖 | 无 | 强依赖外部服务、网络、权限 |
| 运行特征 | 进程内闭环、低延迟、高隐私 | 跨网络调用、有延迟、需安全管控 |
| 典型场景 | 摘要、改写、翻译、逻辑分析、报告文案 | 查数据、发邮件、执行命令、调用 RPA |
| 协议关联 | 纯模型层,不依赖 MCP | 企业场景统一通过MCP对接 |
六、结合你整套架构做最终映射
- 大模型:能力本体,所有 Skill 的基础
- Skill:对模型能力 + 上下文做封装 → 智能体内生岗位技能
- Tool:对外部系统调用做封装 → 智能体使用的外部作业工具
- 智能体框架 (LangChain):流程 / 制度,调度 Skill 与 Tool 协同
- A2A:多智能体之间通信协作
- MCP:智能体与 Tool 之间的标准调用协议
完整企业 AI 运行范式:
大模型(决策大脑)→ 智能体框架(流程制度)→ Skill(内生技能做理解 / 加工) + A2A(多 Agent 协作) → Tool(外部操作) + MCP(工具标准接口)