一、什么是Skills
在 AI 智能体(Agent)和智能运维(AIOps)的语境里,Skills 就是 AI 智能体的 “专项能力包” —— 是针对某一类特定任务、可复用、可标准化的执行逻辑,能让智能体不只是 “听懂指令”,更能 “落地做事”。它更像是工作流,定义了完成一件事需要怎么做的流程,适用于将工作中有固定sop的事项转换为skills。
比如要对磁盘空间告警实现自愈,可以定义一个skills,里面包括了检查空间、清理日志等功能,而其中的检查、清理等原子性操作则通过MCP或者代码的形式实现。
所以,skills也可以看成是一堆功能的串接,目的是为了完成一个固定的动作。
把 AI 智能体想象成一个全能的运维工程师,Skills 就是这个工程师掌握的具体职业技能:
- 这个工程师会 “服务器日志分析” → 对应 AI 的 日志异常检测 Skill
- 这个工程师会 “批量启停服务” → 对应 AI 的 服务生命周期管理 Skill
- 这个工程师会 “资源使用率趋势预测” → 对应 AI 的 容量规划 Skill
没有 Skills 的智能体,就像一个 “懂理论但不会动手” 的新手:你告诉他 “排查下服务器高负载问题”,他知道要查 CPU、内存、进程,但不知道具体怎么查、怎么分析日志、怎么定位瓶颈;而加载了对应 Skills 的智能体,能直接按标准化流程完成操作。
因而,为了智能体能够按照某个流程处理一件事情,就需要skills。
二、skills与MCP、提示词的关系
以处理磁盘空间告警的智能体为例,skill、MCP、提示词三者的关系如下:
-
提示词下达需求:运维人员给智能体发指令 → “帮我处理服务器 A 的根目录满告警”
-
Skills 规划执行步骤:智能体调用 “磁盘满处理 Skill” → 该 Skill 内置逻辑:
执行df -h确认使用率→用find命令找大文件→筛选非核心文件→执行删除/归档 -
MCP 提供操作通道:Skill 的每一步操作,都通过对应的 MCP 完成 → 比如通过
SSH MCP执行find命令,通过监控MCP更新告警状态
所以,
没有提示词 → 智能体不知道要做什么;-
没有 MCP → 智能体有技能但没工具,无法落地操作;
没有 Skills → 智能体只能 “口头分析”,无法按标准化流程完成任务,容易遗漏步骤(比如只删文件不确认,导致误删核心数据)。
总结来说:
Skills 是 “能力” → 解决 “怎么标准化做一件事” 的问题,是可复用的 “方法论”;
MCP 是 “通道” → 解决 “怎么连接底层系统” 的问题,是智能体的 “手脚”;
提示词是 “指令” → 解决 “要做什么事” 的问题,是智能体的 “任务清单”。
这样就比较清楚了,skills并不神秘,就是为了完成一件事,定制的一个流程。
三、一个实际例子
以智能运维场景为例,完整拆解 “磁盘满自动清理 Skill” 的技术实现过程,结合代码片段和执行流程,让技术细节更直观。
1. 需求与前置条件
-
触发条件:智能体通过监控 MCP 获取到 “服务器根目录使用率> 85%” 的告警
-
Skill 目标:安全清理非核心文件,将磁盘使用率降至 70% 以下
-
依赖 MCP:
- SSH MCP:执行服务器命令(
df -h/find/rm) - 运维平台 MCP:查询服务器角色(如是否为数据库服务器,核心目录有哪些)
- SSH MCP:执行服务器命令(
2、技术实现步骤
步骤 1:定义输入参数模型(Pydantic)
from pydantic import BaseModel, Field
from typing import Optional, List
# 定义Skill输入参数规范(对应Skill的输入Schema)
class DiskCleanSkillInput(BaseModel):
server_ip: str = Field(description="目标服务器IP地址,必填参数")
disk_path: str = Field(default="/", description="待清理磁盘路径,默认根目录/")
safe_threshold: int = Field(default=70, description="磁盘安全使用率阈值(%),默认70%")
core_dirs: List[str] = Field(default_factory=lambda: ["/var/lib/mysql", "/etc"], description="禁止清理的核心目录列表")
步骤2:封装MCP调用
这个不详细讨论,就是将MCP的调用过程进行封装,使得这个过程可以复用。
class SSHMCP:
def __init__(self, username: str = "admin", password: str = "admin123", port: int = 22):
self.username = username
self.password = password
self.port = port
@retry(stop=stop_after_attempt(3), wait=wait_exponential(multiplier=1, min=2, max=10))
def execute(self, server_ip: str, command: str) -> str:
(此处忽略具体实现)
ssh_mcp = SSHMCP()
ssh_mcp.execute(ip,command) #封装后通过输入IP和需要执行的命令,则可以调用相应的MCP服务。
步骤3:实现核心逻辑并转换为langchain的tool
(这里也只是简单展示,不陷入具体逻辑实现)
from langchain.tools import StructuredTool
from typing import Dict, Any
def disk_clean_skill(
server_ip: str,
disk_path: str = "/",
safe_threshold: int = 70,
core_dirs: List[str] = None
) -> Dict[str, Any]:
""" 磁盘满自动清理Skill:安全清理服务器非核心日志/临时文件,将磁盘使用率降至安全阈值以下
禁止清理核心目录,支持自定义阈值和目标路径 """
(此处省略具体实现逻辑)
# 关键:将Skill封装为LangChain结构化Tool,绑定参数模型
disk_clean_tool = StructuredTool.from_function(
func=disk_clean_skill,
name="disk_clean_skill",
description="用于自动清理服务器磁盘空间,支持指定服务器IP、磁盘路径、安全阈值和保护目录,仅清理大体积日志/临时文件",
args_schema=DiskCleanSkillInput, # 绑定参数校验规则
return_direct=False # 执行结果返回给Agent,而非直接输出
)
步骤4:集成到langchain Agent,实现自然语言调用skills。
将封装好的 Skill(Tool)注册到 Agent,Agent 通过大模型解析提示词,自动匹配并调用对应的 Skill,完成全流程自动化。
from langchain_openai import ChatOpenAI
from langchain.agents import create_openai_tools_agent, AgentExecutor
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
import os
# 配置OpenAI密钥(也可使用其他LLM,如通义千问、豆包)
os.environ["OPENAI_API_KEY"] = "你的API_KEY"
# 1. 初始化大模型
llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0)
# 2. 定义Agent提示词模板
prompt = ChatPromptTemplate.from_messages([
("system", "你是专业的AIOps智能运维助手,可调用内置Skills处理服务器故障。严格按照Skill规则执行操作,禁止删除核心目录文件"),
MessagesPlaceholder(variable_name="chat_history"),
("user", "{input}"),
MessagesPlaceholder(variable_name="agent_scratchpad"),
])
# 3. 注册所有Skills(可批量注册多个Tool,形成Skill集合)
skills = [disk_clean_tool]
# 4. 创建Agent并初始化执行器
agent = create_openai_tools_agent(llm, skills, prompt)
agent_executor = AgentExecutor(agent=agent, tools=skills, verbose=True)
# 5. 测试:通过自然语言提示词触发Skill调用
if __name__ == "__main__":
response = agent_executor.invoke({
"input": "帮我处理服务器192.168.1.100的磁盘满问题,根目录磁盘使用率安全阈值设为65%,保护目录新增/opt/data",
"chat_history": []
})
print("\n===== 执行结果 =====")
print(response["output"])
四、与众不同的关键能力
1. 标准化 Skill 管理
- 所有 Skill 统一封装为
StructuredTool,具备名称、描述、参数规范,大模型可自动理解和调用; - 支持批量注册为
Toolkit,实现 Skills 的分类管理(如运维 Skill 集、数据库 Skill 集)。
2. 自动参数解析与校验
- 基于 Pydantic 自动校验输入参数类型、必填项,避免非法调用;
- 大模型会自动将自然语言(如
192.168.1.100、阈值65%)转化为 Skill 需要的结构化参数。
3. 灵活的流程编排
- 支持单 Skill 独立调用、多 Skill 串行 / 并行执行;
- 结合 LCEL 语法,可实现复杂的 Skill 编排逻辑
4. 与 MCP / 外部系统解耦
Skill 只调用 MCP 的标准化接口,不关心底层实现(SSH/HTTP/SDK),替换 MCP 时无需修改 Skill 核心逻辑。
5. 完善的可观测性
AgentExecutor开启verbose=True后,会打印完整执行链路:
- 大模型决策过程
- 匹配的 Skill 名称
- 传入的参数
- Skill 执行日志
- 最终结果
五、总结
-
LangChain 中用StructuredTool + Pydantic是实现标准化 Skill 的最佳实践,覆盖参数校验、逻辑编排、异常处理全流程;
-
封装后的 Skill 可直接集成到 Agent,支持自然语言触发、自动参数解析、多 Skill 编排;
-
架构实现了解耦设计,Skill 逻辑、MCP 接口、提示词解析相互独立,便于维护和扩展;
-
代码可直接适配生产环境,仅需替换 MCP 的真实连接配置和大模型密钥即可落地。