共计 2432 个字符,预计需要花费 7 分钟才能阅读完成。
环境准备与基础概念
SpringAI 是一个用于快速构建 AI 技能的开源框架。所谓 ” 技能 ”(Skill),可以理解为 AI 应用中的功能模块——就像手机里的 App 一样,每个 Skill 负责处理特定类型的任务。例如天气查询、翻译、日程管理等,都可以开发成独立的 Skill。

开发环境要求
- JDK 1.8+
- Maven 3.2+
- Spring Boot 2.3+
创建项目并添加依赖
- 通过 Spring Initializr 创建新项目
- 在 pom.xml 中添加核心依赖:
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-core</artifactId>
<version>1.0.0</version>
</dependency>
天气预报 Skill 开发实战
第一步:定义技能接口
所有 Skill 都需要实现 Skill 接口,这是 SpringAI 的统一规范。我们创建一个 WeatherSkill 类:
@Skill("weather")
public class WeatherSkill implements Skill {
@Override
public String getName() {return "weather";}
@Override
public String getDescription() {return "提供指定城市的天气预报信息";}
// 核心处理方法
@Override
public SkillResponse execute(SkillRequest request) {// 具体实现将在下面展开}
}
第二步:处理请求参数
通常会通过 SkillRequest 获取用户输入。对于天气查询,我们需要城市名称参数:
public SkillResponse execute(SkillRequest request) {
// 参数校验
String city = request.getParam("city");
if (StringUtils.isEmpty(city)) {return SkillResponse.fail("请提供城市名称");
}
// 调用天气 API
WeatherData data = fetchWeather(city);
// 构建标准响应
return SkillResponse.success()
.withData(data)
.withMessage(city + "天气预报获取成功");
}
第三步:集成第三方天气 API
这里我们使用心知天气的免费 API 作为示例:
private WeatherData fetchWeather(String city) {
String url = "https://api.seniverse.com/v3/weather/now.json?key=YOUR_KEY&location="
+ URLEncoder.encode(city, StandardCharsets.UTF_8);
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<String> response = restTemplate.getForEntity(url, String.class);
// 解析 JSON 响应
JSONObject json = new JSONObject(response.getBody());
JSONObject now = json.getJSONArray("results")
.getJSONObject(0)
.getJSONObject("now");
return new WeatherData(now.getString("text"),
now.getString("temperature"),
now.getString("wind_direction")
);
}
第四步:注册 Skill 到 Spring 容器
在配置类中添加 @EnableSkill 注解,并注册我们的 Skill:
@Configuration
@EnableSkill
public class SkillConfig {
@Bean
public WeatherSkill weatherSkill() {return new WeatherSkill();
}
}
生产环境注意事项
并发请求处理
当多个用户同时请求时,需要注意:
- 使用线程安全的 RestTemplate
- 考虑在调用第三方 API 时添加限流措施
- 对耗时操作使用异步处理
上下文管理
如果技能需要记住用户的上文(比如连续对话),可以通过:
// 存储上下文
request.getSession().setAttribute("lastCity", city);
// 获取上下文
String lastCity = (String)request.getSession().getAttribute("lastCity");
性能优化建议
- 添加缓存机制(如 Redis)存储常用城市的天气数据
- 设置合理的 API 调用超时时间(建议 3 - 5 秒)
- 对响应数据做压缩处理
错误日志记录
建议使用 SLF4J 记录关键日志:
private static final Logger logger = LoggerFactory.getLogger(WeatherSkill.class);
// 在异常捕获处
catch (Exception e) {logger.error("获取天气数据失败,城市:" + city, e);
return SkillResponse.fail("服务暂时不可用");
}
扩展思考与实践
现在你已经完成了一个基础天气 Skill 的开发,可以考虑进一步扩展:
- 添加多语言支持
- 实现天气预警功能
- 集成更多数据源提高准确性
- 开发定时推送天气的功能
建议尝试开发其他类型的 Skill,例如:
- 翻译 Skill
- 计算器 Skill
- 新闻查询 Skill
每个 Skill 的开发模式都是类似的,掌握了这个基础框架后,你可以快速构建各种 AI 能力。记住在实际项目中,良好的异常处理和日志记录同样重要。
正文完
