乐于分享
好东西不私藏

【AI Agent】【35】agent skills 入门

【AI Agent】【35】agent skills 入门
一句话总结:
Skills 就是 带目录的说明书,本质上就是 组织提示词。
不单是 skills ,很多 agent 智能体,最终也是 “浓缩” 成关键的提示词。
相对于传统的 提示词,特点就是可以通过 向量检索 按需注入,这样子就节省 token 的消耗了。
所以,本质上还是 类似 rag,不过 rag 是检索“业务内容”,skills 是检索 tool 的 “说明书”。
本篇主要介绍:
1)skills 的演进历程
2)在 cursor 中使用 skills
3)skills 和 tools
4)skills 和 rag
5)在 langchain 中使用 skills
1. 发展由来
1)提示词的复用和共享
好的提示词策略值得被复用和共享,skills 就是沉淀这种策略的 “容器”
2)rag(检索增强生成)
rag 是在 runtime 检索知识库,而 skills 借鉴了这个思路,检索说明书,
例如我在 cursor 中打开 下面这个 xlsx skill,给了一些 python 脚本的执行说明:
3)tool call 的发展
让 AI 知道怎么用工具,这就是 skills 的作用,例如上面的例子。
这个工具的说明书 可能很多,但是用户只需要使用到其中一个功能,就可以进行 按需检索。
4)ReAct / chain of thought 框架的发展
agent 有了 规划-行动-观察 的循环能力,但是每个领域的规划策略不同,skills 为不同领域提供了专业的推理引导
agent skill 相当于将 人类专家的经验 编码为 agent 可读的操作手册,在 runtime 动态注入,让 agent 像专家一样,执行专业任务。
2. 使用 skills
1)安装 openskills 
npm install -g openskills
2)安装 claude code 的 cli
npm install -g @anthropic-ai/claude-code
3)安装官方的 skills
4)创建 Available Skills 说明,生成 AGENT.md 文件
openskills sync
5)通过 cursor 打开当前文件夹
6)给 cursor agent 输入指令
使用 xlsx skill 生成 10 条美味食谱
生成效果:
3. skills 和 tools
skill 中定义了很多脚本,这些脚本 llm 没法直接执行,所以还是得借助 agent 的 tool call
读取到 skills 对应的说明后,传给 llm, llm 通过 tool call 读取 skill 的脚本执行。
例如:
const executePythonTool tool(  async ({ code }) => {    const tmpFile = `/skills/script_${Date.now()}.py`;    fs.writeFileSync(tmpFile, code);    // 读取脚本后执行......  },  {    name'execute_python',    description'执行 xxx skill 的 Python 脚本',    schema: z.object({      code: z.string().describe('要执行的 Python 代码'),    }),  });
4. skills 和 rag
skills 和 rag 类似,都是 提示词注入机制,但目的不同:
Skill   → 注入"说明书"(工具调用的操作规范)RAG     → 注入"知识内容"(业务知识库、文档库)
架构图:
用户输入    ↓[RAG 检索] ──→ 检索知识库 ──→ 注入 Prompt[Skill 检索] ─→ 找对应的操作说明 ────→ 注入 Prompt    ↓[LLM] 结合两者生成计划    ↓[Tool 执行]    ↓[ReAct 循环]

RAG 和 Skill 在同一层次,都在 LLM 推理前注入 Prompt。Skill 给说明书,RAG 给知识库业务数据,Tool 负责执行。

async function runAgent(userInput) {  // Step 1: 并行检索(RAG + Skill)  const [ragContext, skill] = await Promise.all([    retrieveFromRAG(userInput),      // 检索业务知识    retrieveSkill(userInput),        // 检索操作规范  ]);  // Step 2: 组装 Prompt  const systemPrompt = `    你是一个得力助手。    <knowledge>    ${ragContext}    </knowledge>    <skill>    ${skill}    </skill>  `;  // Step 3: LLM 推理 + Tool 执行  const agent = createReactAgent({ llm, tools, prompt: systemPrompt });  return agent.invoke({ input: userInput });}
举个例子,用户问"把我们公司 今年的 销售数据生成 Word 报告"
RAG 检索  → 从公司文档库找到今年销售数据.csv 的内容  → 注入 Prompt:"以下是相关数据:销售额 300万,同比+15%..."Skill 检索  → 匹配到 docx Skill  → 注入 Prompt:"生成 Word 文档请遵循以下规范:..."LLM 结合两者  → 知道数据内容(来自 RAG)  → 知道怎么生成文档(来自 Skill)  → 生成代码调用 Tool 执行
5.  在 langchain 中使用
agent skills 的整体架构
用户输入   ↓[Skill 检索] ──→ 读取 .md 文件 ──→ 注入 System Prompt   ↓[LangChain Agent] ──→ LLM 规划步骤   ↓[Tool 调用循环]   ├── install_npm_package  (环境准备)   ├── generate_docx        (执行代码)   └── 验证结果 / 自我修正   ↓生成执行结果
在 langchain 中使用,向量检索:
const { MemoryVectorStore } = require('langchain/vectorstores/memory');const { OpenAIEmbeddings } = require('@langchain/openai');// 把所有 Skill 索引进向量数据库async function indexSkills() {  const skills = [    { name'docx'contentloadSkill('docx'), desc'生成Word文档' },    { name'excel'contentloadSkill('excel'), desc'生成Excel表格' },  ];  const vectorStore = await MemoryVectorStore.fromTexts(    skills.map(s => s.desc),    skills.map(s => ({ name: s.name })),    new OpenAIEmbeddings()  );  return vectorStore;}// 按需检索最相关的 Skill 说明async function retrieveSkill(userInput, vectorStore) {  const results = await vectorStore.similaritySearch(userInput, 1);  return loadSkill(results[0].metadata.name);}
把检索后的 skills 说明,交给 agent 即可,其它的和之前介绍的一样的:
  const systemPrompt = `    你是一个得力助手。    <knowledge>    ${ragContext}    </knowledge>    <skill>    ${skill}    </skill>  `;  const agent = createAgent({ llm, tools, prompt: systemPrompt });