LangChain4j全集-17-Skills
2026/7/23 13:09:48 网站建设 项目流程

Skills 梳理

skills

你可以把Skills理解成:给大模型准备的一套“可复用的技能说明书”或者“操作手册包”。

它不是 Spring Boot 里的技能,而是 LangChain4j 让 LLM 更有针对性地完成任务的一种机制。


1. Skills 是什么?

文档里说:

Skills is a mechanism for equipping an LLM with reusable, self-contained behavioral instructions.

翻译成通俗的话就是:

Skills 是一种给大模型外挂“技能包”的机制。

比如你希望大模型在不同场景下有不同的专业能力:

场景对应 Skill
帮用户修改 Word 文档docxSkill
帮用户分析数据data-analysisSkill
帮用户写 SQLsqlSkill
帮用户审查 Java 代码java-code-reviewSkill
帮用户生成 Spring Boot 接口springboot-apiSkill

每个 Skill 都是一套独立的说明,它告诉大模型:

当遇到某类任务时,你应该怎么做、遵循什么规则、参考哪些资料。


2. Skills 解决什么问题?

如果不用 Skills,我们通常会把大量系统提示词、规则、业务规范一次性塞进 Prompt 里。

问题是:

  1. Prompt 太长,浪费 Token。
  2. 用户问一个很简单的问题,也要带上一大堆无关规则。
  3. 不同任务的规则混在一起,模型容易混乱。
  4. 维护困难,提示词越来越臃肿。

Skills 的思路是:

先只告诉模型有哪些技能,每个技能是干什么的。
当模型判断某个技能有用时,再按需加载这个技能的详细说明。

所以它的核心作用是:

让大模型按需加载专业能力,而不是一开始就塞满所有上下文。


3. Skills 的组成

一个 Skill 通常包含这些东西:

Skill ├── name:技能名称 ├── description:技能描述 ├── content:技能的详细说明,也就是给 LLM 的指令 └── resources:可选资源,例如参考文档、模板、案例等

3.1 name:技能名称

例如:

name:docx

作用:

告诉模型这个技能叫什么。

可以理解为一个唯一标识。

比如:

docx>3.2 description:技能描述

例如:

description:Edit and review Word documents using tracked changes

意思是:

使用修订模式编辑和审阅 Word 文档。

作用:

让模型快速判断这个技能适不适合当前用户的问题。

比如用户说:

帮我审阅一下这个 Word 合同,并保留修改痕迹。

模型看到docx这个 Skill 的描述,就知道这个技能应该被用上。


3.3 content:技能内容

也就是SKILL.md中 YAML 头部下面的正文部分。

例如:

When the user asks you to edit a Word document: 1. Always use tracked changes so edits can be reviewed. ...

翻译一下:

当用户要求你编辑 Word 文档时: 1. 一定要使用修订模式,这样修改内容可以被审阅。 ...

作用:

这部分是真正给 LLM 的详细操作说明。

它可以写:

  • 遇到什么情况要怎么做
  • 输出格式应该是什么
  • 哪些事情不能做
  • 优先级规则
  • 业务规范
  • 示例
  • 处理流程

你可以把它理解成:

这个技能的详细 Prompt。


3.4 resources:技能资源

文档里说:

Any file in the skill directory, other than SKILL.md itself and files under a scripts/ subdirectory, is automatically loaded as a SkillResource.

也就是说,在技能目录下,除了:

SKILL.md scripts/ 目录下的文件

其他文件都会被自动当作资源加载。

比如:

skills/ └── docx/ ├── SKILL.md └── references/ └── tracked-changes.md

这里的:

references/tracked-changes.md

就是一个资源文件。

作用是:

给模型提供额外参考资料。

比如tracked-changes.md里面可以写:

# Word 修订模式规范 1. 所有正文修改必须保留修改痕迹。 2. 不要直接覆盖原文。 3. 对关键条款修改需要添加批注。

这样模型在需要的时候可以读取这个资源。


4. Skills 是实验性 API

文档特别提示:

The Skills API is experimental. APIs and behavior may still change in future releases.

意思是:

Skills API 目前还是实验性的。

对 Spring Boot 开发者来说,这意味着:

  1. API 以后可能会改。
  2. 类名、方法名可能会变。
  3. 行为可能会调整。
  4. 生产环境使用要谨慎。
  5. 升级 LangChain4j 版本时要特别注意 Release Notes。

如果你现在是学习和调研,非常适合。
如果马上用于核心生产业务,建议做好封装,避免未来升级时改动面太大。


5. Skills 遵循 Agent Skills 规范

文档说:

Skills are designed according to the Agent Skills specification.

意思是:

LangChain4j 的 Skills 设计参考了 Agent Skills 规范。

简单理解:

它不是随便设计的一个 Prompt 文件格式,而是参考了面向 Agent 的技能规范。

这对以后构建 Agent 很有帮助。

比如以后你可能会做:

  • 文档处理 Agent
  • 数据分析 Agent
  • 代码审查 Agent
  • 客服 Agent
  • 运维 Agent

每个 Agent 都可以挂载不同的 Skills。


6. 如何创建 Skill?

文档介绍了两种方式:

  1. 从文件系统加载
  2. 从 Classpath 加载

这两种方式对 Spring Boot 开发者非常重要。


7. 方式一:从文件系统加载 Skills

文档示例目录结构:

skills/ ├── docx/ │ ├── SKILL.md │ └── references/ │ └── tracked-changes.md └──>skills/ 技能根目录 ├── docx/ 一个 docx 技能 │ ├── SKILL.md docx 技能说明文件 │ └── references/ docx 技能的参考资料 │ └── tracked-changes.md └──>SKILL.md

7.1 SKILL.md 的格式

示例:

--- name: docx description: Edit and review Word documents using tracked changes --- When the user asks you to edit a Word document: 1. Always use tracked changes so edits can be reviewed. ...

它分成两部分。

第一部分是 YAML Front Matter:

---name:docxdescription:Edit and review Word documents using tracked changes---

这里声明技能元信息:

name:技能名称 description:技能描述

第二部分是正文:

When the user asks you to edit a Word document: 1. Always use tracked changes so edits can be reviewed. ...

这里是技能指令内容。


7.2 为什么要用 YAML Front Matter?

因为 LangChain4j 需要通过它解析出技能的基础信息。

类似很多 Markdown 文档里的元数据:

---title:xxxauthor:xxxdate:xxx---

在 Skills 里面,它至少需要:

name:xxxdescription:xxx

7.3 文件系统加载适合什么场景?

从文件系统加载,适合这些情况:

  1. Skills 不想打进 Jar 包。
  2. 技能内容希望可以动态修改。
  3. 运维人员或业务人员可以直接修改 Skill 文件。
  4. 多个应用共享同一套 Skills 目录。
  5. 想实现类似配置中心的效果。

例如:

/opt/app/skills/ ├── springboot-api/ ├── sql-review/ └── customer-service/

Spring Boot 应用启动时从这个目录加载 Skills。


8. 引入依赖

文档给的 Maven 依赖是:

<dependency><groupId>dev.langchain4j</groupId><artifactId>langchain4j-skills</artifactId><version>1.17.1-beta27</version></dependency>

作用:

引入 LangChain4j 的 Skills 模块。

注意这里的版本是:

1.17.1-beta27

带有beta,再次说明这个功能还比较新。

在你的项目里,版本最好和你当前使用的 LangChain4j 主版本保持一致。


9. 使用 FileSystemSkillLoader 加载 Skills

文档代码:

List<FileSystemSkill>skills=FileSystemSkillLoader.loadSkills(Path.of("skills/"));

意思是:

从文件系统的skills/目录加载所有 Skill。

这里会加载:

skills/docx/ skills/data-analysis/

也就是skills/下面的直接子目录。


9.1 加载全部 Skills

List<FileSystemSkill>skills=FileSystemSkillLoader.loadSkills(Path.of("skills/"));

作用:

一次性加载某个目录下所有技能。

适合应用启动时初始化。

比如 Spring Boot 里你可以这样理解:

@BeanpublicList<FileSystemSkill>skills(){returnFileSystemSkillLoader.loadSkills(Path.of("skills/"));}

当然具体怎么注入到你的 AI Service,还要根据你使用的 LangChain4j 版本和 API 来定。


9.2 加载单个 Skill

文档代码:

FileSystemSkillskill=FileSystemSkillLoader.loadSkill(Path.of("skills/docx"));

作用:

只加载一个技能。

适合你只想针对某个场景加载特定 Skill。

比如:

FileSystemSkilldocxSkill=FileSystemSkillLoader.loadSkill(Path.of("skills/docx"));

10. 方式二:从 Classpath 加载 Skills

文档介绍了另一个加载器:

ClassPathSkillLoader

它和FileSystemSkillLoader类似,但是加载位置不同。


10.1 什么是 Classpath 加载?

在 Java / Spring Boot 项目里,src/main/resources下的文件会被打包进 Jar。

例如:

src/main/resources/ └── skills/ ├── docx/ │ ├── SKILL.md │ └── references/ │ └── tracked-changes.md └──>ClassPathSkillLoader.loadSkills("skills");

来加载。


10.2 Classpath 加载适合什么场景?

适合这些情况:

  1. Skills 是应用的一部分。
  2. 不希望外部用户随意修改。
  3. 希望随着 Jar 一起发布。
  4. 适合稳定的系统规则。
  5. 适合版本化管理。

比如你做一个 Spring Boot AI 应用,里面内置几个固定技能:

src/main/resources/skills/ ├── java-code-review/ ├── springboot-api/ ├── sql-optimization/ └── customer-service/

然后跟着代码一起提交 Git。

这样技能文件也能版本管理。


11. 使用 ClassPathSkillLoader 加载 Skills

11.1 加载全部 Skills

文档代码:

List<FileSystemSkill>skills=ClassPathSkillLoader.loadSkills("skills");

作用:

从 classpath 下的skills目录加载所有技能。

对应目录:

src/main/resources/skills/

11.2 加载单个 Skill

文档代码:

FileSystemSkillskill=ClassPathSkillLoader.loadSkill("skills/docx");

作用:

只加载skills/docx这个技能。

对应目录:

src/main/resources/skills/docx/

11.3 默认使用线程上下文 ClassLoader

文档说:

By default, ClassPathSkillLoader uses the thread’s context class loader.

意思是:

默认情况下,ClassPathSkillLoader使用当前线程的 Context ClassLoader。

对普通 Spring Boot 应用来说,通常你不用关心这个。

只有在这些特殊场景下才可能需要自定义 ClassLoader:

  1. 插件化系统
  2. 多 ClassLoader 环境
  3. 应用服务器环境
  4. 自定义模块隔离
  5. 测试框架中动态加载资源

12. FileSystemSkillLoader 和 ClassPathSkillLoader 的区别

对比项FileSystemSkillLoaderClassPathSkillLoader
加载位置操作系统文件目录Java Classpath
典型目录/opt/app/skills或项目根目录下skills/src/main/resources/skills
是否打进 Jar不一定会打进 Jar
是否方便动态修改方便不方便,需要重新打包
是否适合配置化适合一般
是否适合内置能力一般非常适合
Spring Boot 推荐场景外部可维护技能应用内置技能

13. 用 Spring Boot 开发者的视角理解 Skills

你可以把 Skills 类比成以下东西:

13.1 类似配置文件

就像:

application.yml

里面写系统配置。

而:

SKILL.md

里面写大模型行为配置。


13.2 类似策略模式

比如你在 Java 里可能会写:

interfaceHandler{booleansupport(Requestrequest);Responsehandle(Requestrequest);}

不同任务有不同 Handler。

Skills 类似于给大模型的“策略处理说明”。

例如:

用户问 Word 处理 -> docx Skill 用户问数据分析 ->>13.3 类似插件机制

每个 Skill 是一个独立目录:

skills/docx/ skills/data-analysis/ skills/sql-review/

你可以新增、删除、修改某个技能,不影响其他技能。


14. 一个适合 Spring Boot 项目的 Skills 示例

比如你要做一个 AI 编程助手,可以这样组织:

src/main/resources/ └── skills/ ├── springboot-api/ │ ├── SKILL.md │ └── references/ │ └── rest-api-style.md ├── mybatis-sql/ │ ├── SKILL.md │ └── references/ │ └── sql-style.md └── code-review/ ├── SKILL.md └── references/ └── java-review-checklist.md

14.1 springboot-api/SKILL.md 示例

--- name: springboot-api description: Help design and generate Spring Boot REST APIs --- When the user asks you to design or generate a Spring Boot REST API: 1. Use layered architecture: - Controller - Service - ServiceImpl - Mapper or Repository - DTO - VO 2. Use standard Spring annotations: - @RestController - @RequestMapping - @GetMapping - @PostMapping - @RequestBody - @PathVariable 3. Return unified response objects. 4. Add basic parameter validation when needed. 5. Explain the code in simple Chinese.

这个 Skill 的作用是:

当用户要求生成 Spring Boot 接口时,让模型按照你指定的代码风格和架构生成代码。


14.2 mybatis-sql/SKILL.md 示例

--- name: mybatis-sql description: Help write and optimize MyBatis SQL and mapper code --- When the user asks about MyBatis or SQL: 1. Prefer clear and maintainable SQL. 2. Avoid SELECT *. 3. Explain possible indexes. 4. For dynamic conditions, use MyBatis dynamic SQL tags properly: - if - choose - where - foreach 5. Consider SQL injection risks.

作用:

让模型在回答 MyBatis 和 SQL 问题时遵守你的团队规范。


14.3 code-review/SKILL.md 示例

--- name: code-review description: Review Java and Spring Boot code for bugs, maintainability and security --- When the user asks you to review Java or Spring Boot code: 1. Check null pointer risks. 2. Check transaction boundary issues. 3. Check exception handling. 4. Check security risks. 5. Check SQL performance. 6. Give suggestions in this format: - Problem - Risk - Suggestion - Example

作用:

让模型成为一个“代码审查专家”。


15. Skills 的执行过程可以这样理解

假设你配置了两个 Skill:

docx>帮我分析一下这个 CSV 文件里的销售趋势。

大概过程是:

  1. LLM 先看到有哪些 Skills。
  2. 它发现data-analysis的描述和用户问题相关。
  3. 它决定使用data-analysisSkill。
  4. LangChain4j 加载这个 Skill 的详细内容。
  5. 如果需要,它还会读取 Skill 目录下的资源文件。
  6. 模型基于 Skill 指令回答用户。

这样就不需要一开始把docxdata-analysissqlcode-review等所有详细规则都塞进上下文。


16. Skills 和普通 Prompt 的区别

对比项普通 PromptSkills
组织方式通常是一大段文本每个技能独立目录
是否可复用可以,但容易混乱天然可复用
是否按需加载一般不是
是否适合多场景场景多了会变复杂更适合
是否方便维护大 Prompt 难维护每个 Skill 单独维护
是否支持资源文件需要自己处理Skill 目录下资源可自动加载

17. Skills 和 Tools 的区别

你学习 LangChain4j 的时候,可能还会看到 Tools,也就是 Function Calling。

这两个容易混淆。

简单区分:

概念主要作用类比
Skills告诉模型“怎么做”操作手册、行为规范
Tools让模型“调用外部能力”Java 方法、接口、函数

举个例子:

用户说:

帮我查一下订单 1001 的物流状态,并按照客服话术回复。

这里可能同时用到:

Tool

用于真正查询订单:

getOrderShippingStatus("1001")

Skill

用于规定回复风格:

你是客服助手,回复要礼貌、简洁、先安抚用户,再说明状态。

所以:

  • Tool 偏执行动作。
  • Skill 偏行为指导。

18. Skills 和 RAG 的区别

RAG 是检索增强生成,主要是:

从知识库中找相关资料,再给模型回答。

Skills 是:

给模型加载某种行为规则和操作说明。

区别:

概念解决问题
RAG让模型知道“某些知识”
Skills让模型知道“应该怎么做”

比如:

公司报销制度

适合放 RAG。

回答报销问题时必须先问发票类型、金额、日期

适合放 Skill。


19. 什么时候应该用 Skills?

适合用 Skills 的情况:

  1. 你有多个任务场景。
  2. 每个任务场景有不同规则。
  3. 规则比较长,不适合每次都放进 Prompt。
  4. 希望提示词模块化管理。
  5. 希望 AI 按需加载能力。
  6. 希望团队共同维护 Prompt。
  7. 希望把 AI 能力做成插件包。

比如:

客服回复规则 合同审查规则 代码审查规则 SQL 优化规则 文档改写规则 数据分析规则

这些都适合做成 Skills。


20. 什么时候不一定需要 Skills?

如果你的应用很简单,比如:

用户问什么,模型直接回答。

或者你的系统提示词只有几句话:

你是一个 Java 开发助手,请用中文回答。

那就没必要马上上 Skills。

Skills 更适合复杂、多场景、可复用的 AI 应用。


21. 对 Spring Boot 项目的建议

如果你是 Spring Boot 开发者,我建议你这样选:

学习阶段

使用 Classpath 方式:

src/main/resources/skills/

好处是简单,跟项目一起管理。


生产阶段

如果技能规则经常变,使用 FileSystem 方式:

/opt/your-app/skills/

好处是不需要重新打包应用。


推荐目录结构

src/main/resources/ └── skills/ ├── springboot-api/ │ ├── SKILL.md │ └── references/ │ └── coding-style.md ├── sql-review/ │ ├── SKILL.md │ └── references/ │ └── mysql-index-guide.md └── customer-service/ ├── SKILL.md └── references/ └── reply-template.md

22. 你可以这样理解整个 Skills 页面

总结一下这篇文档的核心内容:

内容点是什么作用
SkillsLLM 的技能包机制给模型按需加载专业能力
Experimental实验性 API提醒你未来可能变化
Agent Skills specificationAgent 技能规范让 Skills 更适合 Agent 场景
SKILL.md技能定义文件声明技能名称、描述和详细指令
YAML front matterMarkdown 顶部元数据定义namedescription
content技能正文告诉模型具体怎么做
resources技能资源文件给模型提供额外参考资料
FileSystemSkillLoader文件系统加载器从外部目录加载技能
ClassPathSkillLoaderClasspath 加载器resources或 Jar 内加载技能
loadSkills加载多个技能批量初始化
loadSkill加载单个技能针对某个技能单独加载

23. 一句话总结

LangChain4j Skills 就是把大模型的复杂提示词拆成一个个可复用、可维护、可按需加载的“技能包”。

对于 Spring Boot 开发者来说,你可以把它理解成:

用 Markdown 文件管理 AI 的专业能力,用 Loader 在应用启动时加载,让大模型根据用户问题自动选择合适的技能说明。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询