Skip to content

第12章 专属SubAgent, 处理旅游规划专业Skills

12-1 行程规划Agent挂裁Skills

远程智能体就是行程规划智能体它是如何能够将skills这个专业流程挂载到自己的智能体上。 我们看一下官方文档https://java.agentscope.io/zh/task/agent-skill.html,agentscope它是如何将这个skill挂载到智能体里面的,创建skills有3中方式。这里通过读取文件的方式,通过**SkillBox中的registerSkill方法**来注册,通过**ReActAgent中的skillBox来挂载技能**。

java
@Component
public class TripPlannerAgent {
    @Bean
    public ReActAgent getTripPlannerAgent() {
        //构建Skitl
        SkillBox skillBox = new SkillBox();
        // 以文件形式读取Skitl.md
        AgentSkillRepository repo = new FileSystemSkillRepository(Path.of("./skills"));
        //景点推荐技能
        AgentSkill SuggestSightsSkill = repo.getSkill("Suggest_Sights");
        //表格制作技能
        AgentSkill MakeATableSkill = repo.getSkill("Make_A_Table")
        skillBox.registerSkill(SuggestSightsSkill);
        skillBox.registerSkill(MakeATableSkill);
        //行程规划Agent Builder
        ReActAgent.Builder builder = AgentUtils
                .getReActAgentBuilder("TripPlannerAgent", "擅长处理景点行程规划")
                 //挂载Skitls
                .skillBox(skillBox);
         return builder.build();
    }
}

在远程的行程规划智能体下resources/skills目录下有两个skills的文件夹Suggest_Sights和Make_A_Table

12-2 有限预算内规划精彩旅行的Skills

编写景点推荐技能Suggest_Sights在resources/skills创建:

markdown
Suggest_Sights/
├── SKILL.md          # 必需: 入口文件,包含 YAML frontmatter 和指令
├── references/       # 可选: 详细参考文档。主要存放的一些知识类的文件,例如这个技能需要用到一些酒店的信息,那么这里的酒店的一些参考信息。 
└── scripts/          # 可选: 可执行脚本,存放一些脚本文件,通过API去查询一些内容的脚本
    └── weather_check.py   # 查询当地天气的脚本

编写SKILL.md内容

markdown
---
name: Suggest-Sights
description: 擅长在有限预算内规划出精彩的旅行体验
---

## 核心能力
### 1.免费景点推荐
- 推荐自然风光、历史古迹、特色街区
- 提供最佳游览时间和小众路线
- 分享避开人群的技巧

### 2.美食探索
- 推荐当地特色小吃和地道餐厅
- 侧重性价比高的本地美食
- 分享当地人常去的隐瞒美食店

### 3.打卡点推荐
- 推荐网红打卡点和拍照圣地
- 分享小众但出片的秘密景点

### 4. 住宿建议
提供住宿方案:
- **经济型**:青旅、民宿
- **舒适型**:连锁酒店
  
### 工作流程
1. **分析规划**:综合考虑距离、时间、费用、景点分布因素
2. **方案输出**:提供景点推荐、美食指南、住宿方案

## 回答原则
1. **务实优先**:所有建议要考虑实际可行性和经济性
2. **信息准确**:提供具体的地址、价格区间、开放时间
3. **因地制宜**:根据季节、天气给出适当的建议

12-3 表格制作Skills

根据官方文档Classpath 仓库 (只读)加载

用于从 classpath 资源中加载预打包的 Skills (只读)。自动兼容标准 JAR 和 Spring Boot Fat JAR。

try (ClasspathSkillRepository repository = new ClasspathSkillRepository("skills")) {
    AgentSkill skill = repository.getSkill("data-analysis");
    List<AgentSkill> allSkills = repository.getAllSkills();
} catch //...

资源目录结构: src/main/resources/skills/ 下放置多个 Skill 子目录,每个子目录包含 SKILL.md

注意: JarSkillRepositoryAdapter 已废弃,请使用 ClasspathSkillRepository

所以这里使用(1.0.8)使用JarSkillRepositoryAdapter

java
// 以文件形式读取Skill.md
JarSkillRepositoryAdapter repo = new JarSkillRepositoryAdapter("skills");
//景点推荐技能
AgentSkill SuggestSightsSkill = repo.getSkill(name:"Suggest_Sights");
//表格制作技能
AgentSkill MakeATableSkill = repo.getSkill(name:"Make_A_Table")
....

有赞Skills聚合平: https://skill0.io/zh

下载https://skill0.io/zh/skills/K-Dense-AI-claude-scientific-skills-scientific-skills-document-skills-xlsx-skill-md,将其修改,scripts/recalc.py

python
import pandas as pd

# Read Excel
df = pd.read_excel('file.xlsx')  # Default: first sheet
all_sheets = pd.read_excel('file.xlsx', sheet_name=None)  # All sheets as dict

# Analyze
df.head()      # Preview data
df.info()      # Column info
df.describe()  # Statistics

# Write Excel
df.to_excel('output.xlsx', index=False)

编写SKILL.md内容

markdown
---
name: Make-A-Table
description: 电子表格工具集(.xlsx/.csv格式),用于电子表格处理与分析。
---

## 核心能力
### 1.创建表格
### 2.编辑表格
### 3.公式与格式设置
### 4.数据分析

12-4 Skills实现Agent工具的渐进式加裁

通过SkillBox实现工具和skill渐进式加裁

java
/**
 * description: 行程规划Agent
 */
@Component
public class TripPlannerAgent {
    @Bean
    public ReActAgent getTripPlannerAgent() {
        Toolkit toolkit = new Toolkit();
       //构建Skill,并将工具包和Skill结合
        SkillBox skillBox = new SkillBox(toolkit);
           ....
        // 可以通过这种方式注册工具和skill,这里的Calculate是一个Tools工具
        skillBox.registration().tool(new Calculate())://.skill()

        //行程规划Agent Builder
        ReActAgent.Builder builder = AgentUtils
                .getReActAgentBuilder("TripPlannerAgent", "擅长处理景点行程规划")
                 //挂载工具包
                .toolkit(toolkit)
                //挂载Skills
                .skillBox(skillBox);
         return builder.build();
}

12-5 景点推荐SubAgent执行景点推荐任务

在行程规划智能体下需要一个子智能体,这里的景点推荐技能Skills和mcp都是挂载在这个子智能体下的,所有这里的行程规划智能体需要修改,先建立子智能体

创建子智能体参考文档: Agent as Tool:https://java.agentscope.io/zh/task/agent-as-tool.html,推荐使用 lambda 表达式,确保每次调用创建新实例。

java
/**
 * 景点推荐Agent
 */
public class SuggestSightsAgent {

    //创建景点推荐Agent
    public ReActAgent getSuggestSightAgent() {
        Toolkit toolkit = new Toolkit();
        //构建Skill,并将工具包和Skill结合
        SkillBox skillBox = new SkillBox(toolkit);
        // 以文件形式读取Skill.md
        JarSkillRepositoryAdapter repo = null;
        try {
            repo = new JarSkillRepositoryAdapter("skills");
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        //景点推荐技能
        AgentSkill SuggestSightsSkill = repo.getSkill("Suggest_Sights");
        //表格制作技能
       // AgentSkill MakeATableSkill = repo.getSkill("Make_A_Table");
        skillBox.registerSkill(SuggestSightsSkill);
       // skillBox.registerSkill(MakeATableSkill);
        // 可以通过这种方式注册工具和skill,这里的Calculate是一个Tools工具
       // skillBox.registration().tool(new Calculate()).skill();
        ReActAgent.Builder builder = AgentUtils
                .getReActAgentBuilder("SuggestSightAgent", "擅长景点推荐")
                //挂载工具包
                .toolkit(toolkit)
                //挂载Skills
                .skillBox(skillBox);
        return builder.build();
    }
}

再修改行程规划智能体

java
@Component
public class TripPlannerAgent {
    @Bean
    public ReActAgent getTripPlannerAgent() {
        Toolkit toolkit = new Toolkit();
        SuggestSightsAgent suggestSightsAgent = new SuggestSightsAgent();
        //将智能体(子Agent)作为工具
        toolkit.registration().subAgent(() -> suggestSightsAgent.getSuggestSightAgent()).apply();
        //行程规划Agent Builder
        ReActAgent.Builder builder = AgentUtils
                .getReActAgentBuilder("TripPlannerAgent", "擅长处理景点行程规划")
                .toolkit(toolkit);
        return builder.build();
    }
}