接着前面的内容: https://blog.csdn.net/DavidSoCool/article/details/160857790
alibaba官方文档:https://java2ai.com/docs/frameworks/agent-framework/tutorials/skills
下面是工程目录:

我们需要在资源目录下新建个"skills"文件夹,然后再新建个"travel-assistant",接着创建SKILL.md文件,这一套基本是通用的skill做法.
下面是SKILL.md的具体内容, name需要和文件夹名称保持一致,skill规范不能错
---
name: travel-assistant
description: 当用户需要规划旅游行程时使用此技能。用户只需提供目的地,技能将自动生成3-5天行程(未指定天数时默认3天),包含每日详细安排、花费明细,可以使用"search_tool"工具查询目的地景点和特色美食,并调用天气工具提供穿衣指数及出行提醒,高效解决用户旅游规划需求。
---
旅游行程助手(含预算+天气穿衣建议)
## 一、功能说明
本技能是一款智能化旅游行程规划工具,核心功能的如下:
- 行程生成:用户提供目的地后,自动生成3-5天行程(未指定天数默认3天),每天包含上午、下午、晚上三个时段的具体安排,涵盖景点/活动、餐饮建议、交通方式,确保行程可落地。
- 预算计算:同步输出每日花费明细及总预算,分类清晰(住宿、餐饮、交通、门票、其他杂费),提供穷游、舒适、轻奢三档预算供参考。
- 天气与穿衣提醒:生成行程后,自动调用天气工具,获取目的地行程期间的天气概况,输出精准穿衣指数及实用出行提醒(如雨伞、防晒、舒适鞋等)。
- 灵活适配:支持用户指定游玩天数(3-5天)、预算金额,可根据用户需求调整行程档次,也可单独提供目的地天气及穿衣建议。
## 二、使用方法
2.1 触发方式
核心触发词:旅游规划、行程安排、XX旅游攻略、XX穿衣建议、XX旅游预算
示例触发话术:
- “帮我规划去成都的旅游”
- “我要去西安玩5天,帮我做个行程”
- “三亚旅游攻略,预算2000元/人”
- “青岛最近天气怎么样,去玩该穿什么”
2.2 操作流程
1. 触发技能后,系统自动收集核心信息(必填:目的地;可选:游玩天数、预算)。
2. 若未提供目的地,系统追问:“你想去哪个城市或具体景点呢?”
3. 若未提供游玩天数,系统提示:“需要玩几天?我也可以直接给你做3天经典行程。”
4. 若未提供预算,系统询问:“是否有明确预算?我可以根据你的预算调整行程档次(穷游/舒适/轻奢)。”
5. 收集完信息后,系统自动生成行程、预算明细,并调用天气工具输出穿衣及出行提醒。
6. 行程生成后,系统自动发送结束语,可根据用户需求调整行程档次或细化行程细节。
2.3 异常处理
- 天数异常:用户指定天数超出3-5天范围,提示:“为保证行程舒适度,建议游玩天数控制在3-5天,我将为你默认生成3天行程,如需调整可随时告知。”
- 目的地模糊:用户提供的目的地不具体(如“江南”),提示:“请提供具体的城市或景点名称(如‘杭州’而非‘江南’),以便为你生成精准行程。”
- 天气工具调用失败:提示:“当前天气工具暂时无法获取数据,建议你关注目的地近期天气预报,穿衣参考:春秋季薄外套+内搭,夏季短袖+防晒,冬季厚外套+保暖内搭。”
## 三、核心规则(必遵循)
1. 目的地必填,未提供时需持续追问,直至获取有效目的地。
2. 游玩天数控制在3-5天,未明确时默认3天,超出范围需提示并默认生成3天行程。
3. 每日行程必须包含上午、下午、晚上三个时段,每个时段需明确景点/活动、餐饮、交通。
4. 预算需包含每日明细及总预算,分类清晰,提供三档预算参考,贴合实际市场价格。
5. 必须调用天气工具输出穿衣及出行提醒,建议需精准、实用,避免笼统表述。
6. 所有话术需亲切、简洁,避免生硬,提升用户体验;用户调整信息后需重新生成行程。
## 四、行程生成逻辑(固定模板)
4.1 通用模板(按天数适配)
第1天:抵达+市区精华+夜景(适配所有天数)
- 上午:抵达目的地 → 交通前往住宿地点(推荐靠近市中心/核心景点)→ 休整、存放行李
- 下午:目的地核心地标景点(1个,避免过度劳累)
- 晚上:当地特色美食街区/步行街 → 夜景观赏
- 花费:住宿×1(按档次定价) + 餐饮×2(午+晚) + 市内交通 + 景点门票(如有)
第2天:经典景点线(1-2个大景点,适配所有天数)
- 上午:目的地经典核心景点(1个,如灵隐寺、兵马俑等)
- 下午:关联景点/休闲街区(补充游玩,避免行程过满)
- 晚上:当地特色晚餐 → 轻松散步/休闲活动
- 花费:餐饮×3(早+午+晚) + 市内交通 + 景点门票(如有)
第3天:深度/人文/小众体验(适配3-5天,默认3天行程含此天)
- 上午:人文景点/博物馆/老街(感受当地文化)
- 下午:当地特色体验项目(如茶园品茶、文创体验、骑行等)
- 晚上:当地小吃夜市/特色小馆
- 花费:餐饮×3(早+午+晚) + 市内交通 + 景点门票/体验费用(如有)
第4天:轻松收尾+伴手礼+返程(仅用户指定4-5天时生成,默认3天行程不含此天)
- 上午:慢逛景点/城市公园(轻松休闲,避免疲劳)
- 下午:当地特产采购(伴手礼)→ 整理行李、前往交通枢纽(机场/车站)
- 晚上:返程(根据用户返程时间调整,无返程则安排轻松晚餐)
- 花费:餐饮×2(早+午) + 市内交通 + 伴手礼费用(可选)
第5天:周边一日游/休闲(仅用户指定5天时生成,默认3天行程不含此天)
- 上午:目的地周边热门景点(1个,车程控制在1.5小时内)
- 下午:返回市区 → 休整、整理行李
- 晚上:告别晚餐(当地特色)→ 准备返程(如需)
- 花费:交通(市内+城际) + 餐饮×3(早+午+晚) + 周边景点门票(如有)
4.2 预算输出结构(固定格式)
- 住宿:XXX元/晚 × N晚(N=游玩天数-1)
- 餐饮:早/中/晚 日均XXX元 × N天(按档次区分:穷游50-80元/天,舒适100-150元/天,轻奢200元以上/天)
- 交通:市内交通(地铁/打车/公交) + 城际交通(如有,如周边游)
- 门票:列出每个景点单价及合计金额
- 其他:伴手礼/杂费(如饮用水、小零食等)
- 总计预算:____ 元(标注档次:穷游/舒适/轻奢)
4.3 天气工具调用与穿衣提醒(固定格式)
调用参数:{目的地, 开始日期, 结束日期}
输出格式:
- 天气概况:行程期间温度范围、天气状况(如22–30℃,多云为主,午后局部小雨)
- 穿衣指数:明确穿衣建议(如“短袖+薄外套(早晚微凉)”“毛衣+厚外套”)
- 出行提醒:结合天气及行程特点的实用建议(如“午后带伞,西湖边做好防晒”)
## 五、标准化输出示例
以“杭州4天(默认)、舒适版、预算1700元/人”为例:
以“杭州3天(默认)、舒适版、预算1500元/人”为例:
✈️ 杭州3天2晚行程(默认生成)
总预算参考:1400–2200元/人(舒适版)
第1天|抵达→西湖夜景
第2天|灵隐禅意+茶园
- 上午:灵隐寺+飞来峰(门票45+香花券30,感受禅意文化)
- 下午:龙井村/九溪烟树喝茶、观赏茶园,体验当地茶文化
- 晚上:武林夜市品尝当地小吃(推荐葱包烩、定胜糕)
- 当日花费:餐饮110(早+午+晚) + 交通40 + 门票75 = 225元
第3天|慢逛返程(默认行程最后一天)
第3天|宋城+钱塘休闲
- 上午:宋城+千古情演出(门票+演出约300,体验宋代文化实景演出)
- 下午:钱塘江畔/钱江新城城市阳台散步,欣赏城市风光
- 晚上:星光大道/滨江天街吃晚餐,感受杭州现代气息
- 当日花费:餐饮120(早+午+晚) + 交通35 + 门票300 = 455元
第4天|慢逛返程
- 上午:小河直街/拱宸桥古街拍照、慢逛,感受老杭州韵味
- 下午:杭州东站附近采购龙井茶叶、藕粉等伴手礼 → 前往车站/机场返程
- 当日花费:餐饮80(早+午) + 交通30 + 伴手礼100 = 210元
无天数:“我默认给你安排3天经典行程,需要改成4天或5天也可以告诉我。”
- 住宿:220×3 = 660元
- 餐饮:120+110+120+80 = 430元
- 交通:30+40+35+30 = 135元
- 门票:75+300 = 375元
- 其他(伴手礼):100元
- 合计:1700元/人
🌤️ 杭州近期天气与穿衣建议(调用天气工具结果)
- 天气:22–30℃,多云为主,午后局部小雨
- 穿衣指数:短袖+薄外套(早晚微凉)
- 出行提醒:午后带伞,西湖边做好防晒;灵隐山路较陡,建议穿舒适运动鞋。
## 六、固定话术(技能配置专用)
6.1 追问话术
- 无目的地:“你想去哪个城市或具体景点呢?”
- 无天数:“我默认给你安排4天经典行程,需要改成3天或5天也可以告诉我。”
- 无预算:“是否有明确预算?我可以根据你的预算调整行程档次(穷游/舒适/轻奢)。”
6.2 结束语(行程生成完成后)
“行程和预算如上,我已根据目的地天气给出穿衣提醒。需要我按‘穷游/轻奢’再调一版,或每天细化到具体餐厅/地铁出口吗?”
这次在构建ReactAgent的时候添加了 skillHook,主要改动的代码在AgentConfig.java配置ReactAgent.
package com.david.springalibabareactagentdemo.config;
import com.alibaba.cloud.ai.graph.agent.ReactAgent;
import com.alibaba.cloud.ai.graph.agent.hook.skills.SkillsAgentHook;
import com.alibaba.cloud.ai.graph.agent.hook.summarization.SummarizationHook;
import com.alibaba.cloud.ai.graph.checkpoint.savers.redis.RedisSaver;
import com.alibaba.cloud.ai.graph.skills.registry.SkillRegistry;
import com.alibaba.cloud.ai.graph.skills.registry.classpath.ClasspathSkillRegistry;
import com.david.springalibabareactagentdemo.intercept.MessageFilterInterceptor;
import com.david.springalibabareactagentdemo.tools.SearchTool;
import com.david.springalibabareactagentdemo.tools.WeatherTool;
import org.redisson.api.RedissonClient;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.ai.chat.model.ChatModel;
import org.springframework.ai.deepseek.DeepSeekChatModel;
import org.springframework.ai.deepseek.api.DeepSeekApi;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class AgentConfig {
Logger log = LoggerFactory.getLogger(AgentConfig.class);
@Value("${spring.ai.deepseek.api-key}")
private String apiKey;
@Bean
public ReactAgent reactAgent(RedissonClient redissonClient) {
// 创建 ChatModel
DeepSeekApi deepSeekApi = DeepSeekApi.builder()
.apiKey(apiKey)
.build();
ChatModel chatModel = DeepSeekChatModel.builder()
.deepSeekApi(deepSeekApi)
.build();
// 从资源目录下获取skill
SkillRegistry registry = ClasspathSkillRegistry.builder()
.classpathPath("skills")
.build();
SkillsAgentHook skillHook = SkillsAgentHook.builder()
.skillRegistry(registry)
.build();
log.info("Skills loaded: {}", skillHook.getSkillCount());
// 构建React Agent
ReactAgent build = ReactAgent.builder()
.name("ai_agent")
.model(chatModel)
.tools(new WeatherTool().toolCallback(), new SearchTool().toolCallback())
.systemPrompt("""
你是一个博学的智能聊天助手,必须调用工具获取信息,不能编造答案。
调用工具后,根据结果回答用户。
""")
// 添加对话记忆,使用redis保存对话记忆
.saver(RedisSaver.builder().redisson(redissonClient).build())
// 添加摘要钩子,用于对话摘要,防止对话过长超过模型窗口
.hooks(SummarizationHook.builder()
.model(chatModel) // 专用摘要模型,这里用的同一个,可以换一个专门做摘要的模型
.maxTokensBeforeSummary(8000) // 触发阈值(模型窗口的70%)
.messagesToKeep(10) // 保留最近10轮原始对话
.build(),
skillHook)
.build();
return build;
}
}
下面接着启动服务,可以看到日志输出了加载的skill数量

调用接口测试

下面是返回的完整旅游计划
好的,查到了!现在为您规划**长沙4天3晚行程(5月5日~5月8日)**👇
---
## ✈️ 长沙4天3晚经典行程
**出行时间:** 2026年5月5日(周二)~ 5月8日(周五)
**总预算参考:** 约1300元/人(舒适版,不含往返大交通)
---
### 🌤️ 天气情况
| 日期 | 天气 | 温度 |
|:---:|:---:|:---:|
| 5/5(周二) | ☁️ 多云 | 16~27℃ |
| 5/6(周三) | ☁️ 多云 | 17~28℃ |
| 5/7(周四) | ☀️ 晴转多云 | 19~30℃ |
| 5/8(周五) | ☁️ 多云转阴 | 18~28℃ |
> 昼夜温差较大(约10℃),白天温暖,早晚微凉
---
### 📍 第1天|5月5日(周二)☁️ 抵达 → 太平老街 → 五一广场
**上午:** 🚄 抵达长沙 → 入住酒店(建议住五一广场/芙蓉广场附近)→ 休整
**下午:** 🚶 逛**太平老街**—— 小青瓦、坡屋顶老街,感受长沙古韵,有贾谊故居、文艺小店、咖啡厅
**晚上:** 🍜 **五一广场** + **坡子街**—— 吃长沙美食!推荐:**茶颜悦色**、**黑色经典臭豆腐**、**糖油粑粑**、**超级文和友**(拍照打卡绝了)
**当日花费:** 住宿200元 + 餐饮80元 + 交通20元 + 门票0元 = **300元**
---
### 📍 第2天|5月6日(周三)☁️ 岳麓山 → 岳麓书院 → 橘子洲
**上午:** ⛰️ **岳麓山**(免费)—— 登山赏景,参观**爱晚亭**,感受"停车坐爱枫林晚"的诗意
**下午:** 🏛️ **岳麓书院**(门票约40元)—— 千年学府,中国四大书院之一 → 下山后前往**橘子洲**
**傍晚:** 🌉 **橘子洲**(免费)—— 坐小火车(约40元)到洲头,和**毛泽东青年艺术雕塑**合影,看湘江日落
**晚上:** 🦞 晚餐推荐**五一广场附近吃小龙虾**,长沙的夏天就是从嘬虾开始的!
**当日花费:** 住宿200元 + 餐饮100元 + 交通30元 + 门票40元 + 小火车40元 = **410元**
---
### 📍 第3天|5月7日(周四)☀️ 湖南博物院 → 烈士公园 → 万家丽
**上午:** 🏛️ **湖南博物院**(免费,需提前预约)—— 看马王堆汉墓文物、辛追夫人、素纱襌衣,必去!
**下午:** 🌳 **烈士公园**(免费)—— 本地人散步休闲的好去处,湖光树影很惬意
**晚上:** 🏙️ **万家丽国际mall顶楼**(免费)—— "宇宙中心"网红打卡地,28楼看长沙全景日落,金光闪闪的雕塑群,超震撼!楼下还能吃各种美食
**当日花费:** 住宿200元 + 餐饮100元 + 交通30元 + 门票0元 = **330元**
---
### 📍 第4天|5月8日(周五)☁️ 李自健美术馆 → 谢子龙影像馆 → 返程
**上午:** 🎨 **李自健美术馆**(免费,需预约)+ **谢子龙影像艺术馆**—— 洋湖片区艺术打卡地,建筑本身就很出片
**下午:** 🛍️ 逛**黄兴路步行街**采购伴手礼(酱板鸭、臭豆腐礼盒、剁椒酱)→ 返程
**当日花费:** 餐饮80元 + 交通20元 + 伴手礼100元 = **200元**
---
### 💰 总预算明细(舒适版)
| 项目 | 费用 |
|:---|:---:|
| 🏨 住宿(3晚) | **600元** |
| 🍜 餐饮(4天) | **360元** |
| 🚌 市内交通 | **100元** |
| 🎫 门票(岳麓书院+小火车) | **80元** |
| 🎁 伴手礼等 | **100元** |
| **💵 总计** | **约1240元/人**(不含往返大交通) |
> 💡 **穷游版**约900元/人(住青旅、多坐公交地铁)
> 💎 **轻奢版**约2200元/人(住四星酒店、打车出行、高档餐厅)
---
### 🍜 长沙必吃美食清单
| 美食 | 推荐理由 |
|:---|:---|
| 🧋 **茶颜悦色** | 长沙名片!幽兰拿铁、声声乌龙必喝 |
| 🦞 **小龙虾** | 文和友、天宝兄弟,夏天必嘬 |
| 🫘 **黑色经典臭豆腐** | 外酥里嫩,灌上辣椒汁绝了 |
| 🍡 **糖油粑粑** | 甜而不腻,街头小吃 |
| 🐔 **酱板鸭** | 真空包装可带走当伴手礼 |
| 🥩 **小炒黄牛肉** | 湘菜灵魂,锅气十足 |
---
### 👕 穿衣建议与出行提醒
- **白天:** 短袖T恤 + 薄长裤 / 裙子
- **早晚:** 备一件**薄外套**(16~18℃微凉)
- **鞋子:** 穿**舒适运动鞋**(岳麓山、橘子洲步行较多)
- **预约提醒:** 湖南博物院、李自健美术馆**需提前公众号预约**
- **防晒:** 中午紫外线较强,注意防晒🧴
- **立夏时节:** 正好赶上立夏(5月5日),长沙夜生活超热闹,晚上别错过烟火气🔥
---
您看这个行程满意吗?需要调整天数或预算档次吗?😊
562

被折叠的 条评论
为什么被折叠?



