当前位置: 首页 > news >正文

Spring AI实战:快速集成阿里通义千问

一、背景:AI时代,Java开发者如何不掉队?

最近AI Agent概念火得一塌糊涂,ChatGPT、Claude等大模型能写代码、能查资料,甚至能调用外部工具。但作为Java后端开发,我们最关心的是:如何把AI能力集成到现有的Spring Boot系统中?

官方方案是Spring AI—— 一个专门为Spring开发者设计的AI应用开发框架。它可以让我们像写普通业务代码一样,用注解、依赖注入的方式让AI调用Java方法。

本文目标:用最简洁的代码,实现一个能听懂“明天深圳罗湖会下雨吗?”这类自然语言,并自动调用天气API返回答案的智能助手。


二、实现思路

核心思路只有三步:

步骤做什么技术点
1️⃣让AI能看懂中文问题接入阿里云通义千问大模型
2️⃣告诉AI“你会查天气”@Tool注解标记Java方法
3️⃣AI自动决策:什么时候该查天气Spring AI框架自动完成

一句话原理:你只需要写好“查天气”的Java方法,用注解说明它的用途,AI大模型会自动判断用户问题是否需要调用这个方法,并提取参数执行。

三、完整实现(3步搞定)

解决:

使用spring_Ai包

3.1目录:

3.2代码:

pom.xml

<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>3.3.0</version> <relativePath/> </parent> <groupId>com.dp</groupId> <artifactId>spring_ai_pro</artifactId> <version>0.0.1-SNAPSHOT</version> <name>spring_ai_pro</name> <properties> <java.version>17</java.version> <spring-ai-alibaba.version>1.0.0.3</spring-ai-alibaba.version> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>com.alibaba.cloud.ai</groupId> <artifactId>spring-ai-alibaba-bom</artifactId> <version>${spring-ai-alibaba.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <!-- 核心:DashScope Starter(通义千问适配器) --> <dependency> <groupId>com.alibaba.cloud.ai</groupId> <artifactId>spring-ai-alibaba-starter</artifactId> <version>1.0.0-M5.1</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> </dependencies> <!-- 需要这两个仓库才能下载依赖 --> <repositories> <repository> <id>spring-milestones</id> <name>Spring Milestones</name> <url>https://repo.spring.io/milestone</url> </repository> <repository> <id>spring-snapshots</id> <name>Spring Snapshots</name> <url>https://repo.spring.io/snapshot</url> </repository> </repositories> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>

application.yml

spring: ai: dashscope: api-key: sk-dc58ae76e4c34020axxxx chat: options: model: qwen-plus server: port: 8080

api-key是阿里ai官网申请的API的key,免费。

大模型服务平台百炼控制台大模型服务平台百炼控制台百炼控制台是阿里云大模型服务平台,提供AI模型训练、部署、推理一站式服务,支持多种大模型框架,助力企业快速构建AI应用。https://bailian.console.aliyun.com/cn-beijing#/home

WeatherTools.Java
package com.dp.aipro.tools; import org.springframework.ai.tool.annotation.Tool; import org.springframework.ai.tool.annotation.ToolParam; import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; @Component // 重要:将该类注册为Spring Bean public class WeatherTools { // 模拟一个简单的天气数据库 private static final Map<String, String> WEATHER_DB = new HashMap<>(); static { WEATHER_DB.put("深圳,明天", "深圳明天:多云转晴,26-32℃,午后可能有短时阵雨。"); WEATHER_DB.put("北京,后天", "北京后天:晴,18-25℃,空气质量良。"); WEATHER_DB.put("上海,明天", "上海明天:小雨,22-28℃,记得带伞。"); // 你可以根据需要添加更多城市... } /** * 核心:使用 @Tool 注解标记这个方法是一个AI可调用的工具。 * description 是给AI看的“说明书”,至关重要! */ @Tool(description = "根据城市名称和日期获取天气预报。如果用户问'明天'或'后天',请先计算出具体日期再传入。") public String getWeather( @ToolParam(description = "城市名称,例如:深圳、北京、上海") String city, @ToolParam(description = "日期,格式为YYYY-MM-DD,例如2026-06-06") String date) { // 为了演示,这里使用简单匹配。实际开发中你可以调用真实的API或查询数据库。 String key = city + "," + date; String weatherInfo = WEATHER_DB.get(key); if (weatherInfo == null) { // 如果找不到精确匹配,返回一个默认的模拟数据 return String.format("%s在%s的天气预报:多云,气温24-30℃。", city, date); } return weatherInfo; } }
WeatherController.java
package com.dp.aipro.controller; import com.dp.aipro.tools.WeatherTools; import org.springframework.ai.chat.client.ChatClient; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import java.time.LocalDate; @RestController public class WeatherController { private final ChatClient chatClient; @Autowired public WeatherController(ChatClient.Builder builder) { // 直接构建 ChatClient,不再需要配置 defaultFunctions this.chatClient = builder.build(); } @GetMapping("/ai/weather") public String askWeather(@RequestParam String question, WeatherTools weatherTools) { // 获取当前日期,让AI知道“明天”是哪一天 String currentDate = LocalDate.now().toString(); String fullQuestion = String.format("今天是%s。问题:%s", currentDate, question); // 关键:在每次请求时通过 .tools() 方法注册工具 return chatClient.prompt(fullQuestion) .tools(weatherTools) // <--- 就在这里直接注册工具实例 .call() .content(); } }
AiController.java
package com.dp.aipro.controller; import org.springframework.ai.chat.client.ChatClient; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/ai") public class AiController { private final ChatClient chatClient; public AiController(ChatClient.Builder builder) { this.chatClient = builder.build(); } @RequestMapping("/chat") public String chat(@RequestParam String question) { return this.chatClient.prompt().user(question).call().content(); } }

四 测试

http://localhost:8080/ai/weather?question=%E6%98%8E%E5%A4%A9%E6%B7%B1%E5%9C%B3%E7%BD%97%E6%B9%96%E5%A4%A9%E6%B0%94%E4%BC%9A%E4%B8%8B%E9%9B%A8%E5%90%97

http://localhost:8080/ai/chat?question=%E6%98%8E%E5%A4%A9%E6%B7%B1%E5%9C%B3%E7%BD%97%E6%B9%96%E5%A4%A9%E6%B0%94%E4%BC%9A%E4%B8%8B%E9%9B%A8%E5%90%97

Done.

五、原理解析(一张图看懂)

text

用户提问:"明天深圳会下雨吗?" ↓ Spring AI 框架 ↓ 发送给通义千问大模型 ↓ 模型理解:需要查天气,参数{city="深圳", date="2026-06-10"} ↓ 调用 WeatherTools.getWeather() ← 你写的Java方法 ↓ 获取天气数据:"多云转晴,26-32℃" ↓ 大模型组织自然语言回答 ↓ 返回用户:"深圳明天多云转晴,26-32℃..."

核心价值:你不需要写任何“判断用户意图”的代码,AI大模型自动完成!


六、进阶扩展建议

扩展方向实现方式
接入真实天气APIgetWeather()中调用高德/和风天气API
添加更多工具新建类,用@Tool注解方法,并在控制器中.tools()注册
支持流式输出使用ChatClientstream()方法
添加对话记忆配置ChatMemory,支持多轮对话
更换其他模型修改application.yml中的model参数

七、常见问题

Q1:依赖下载失败?
A:检查是否配置了Spring里程碑仓库(见pom.xml中的repositories)。

Q2:API Key无效?
A:去阿里云百炼控制台确认Key是否正确,新用户有免费额度。

Q3:AI不调用我的工具?
A:检查@Tooldescription是否清晰,给AI的提示词是否包含工具功能说明。

Q4:支持其他大模型吗?
A:Spring AI支持OpenAI、Azure OpenAI、通义千问、智谱等,只需更换starter即可。


八、源码获取

完整代码已上传:👉lvan-jone · GitHub


九、总结

本文带你从零实现了一个“能听懂人话、能查天气”的AI智能助手,核心代码不超过50行。你只需要:

  1. ✅ 引入Spring AI依赖

  2. ✅ 配置API Key

  3. ✅ 用@Tool注解标记Java方法

  4. ✅ 在Controller中用.tools()注册

剩下的——意图识别、参数提取、工具调用——全部交给AI大模型!


如果本文对你有帮助,欢迎点赞、收藏、评论三连!🎉


📌版权声明:本文为CSDN博主「總鑽風」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
🔗原文链接:Spring AI实战:快速集成阿里通义千问-CSDN博客

http://www.jsqmd.com/news/987655/

相关文章:

  • 用 Vim 以只读模式打开文件的几种方式
  • 道里正规商家榜单,收的顶领跑区域黄金回收行业 - 奢侈品回收测评
  • # 高并发核心系统中分布式事务一致性架构演进实践
  • 助睿Max数据大屏实战(进阶篇):浏览器用户画像大屏的数据接入与交互全解析
  • 哈尔滨道里高价回收店铺TOP榜,2026黄金回收收的顶稳居榜首梯队 - 奢侈品回收测评
  • UVM验证进阶:如何像搭积木一样,用start_item和finish_item组合出灵活的激励流?
  • 别再死记硬背了!用STM32CubeMX+FreeModbus库,5分钟搞定你的第一个Modbus从机
  • 维特比译码在5G和Wi-Fi 6里到底怎么用的?从仿真到硬件实现的跨越
  • 宁波石材加工厂怎么选?本地源头工厂7个筛选标准(2026版) - 宁波融诚石业
  • 别再只盯着TPM了!从国产TPCM实战出发,聊聊可信启动的静态度量与动态度量到底怎么玩
  • 别再只用VAE了!CTGAN vs TVAE:手把手教你为表格数据选对生成模型
  • 2026年 大庆/黑龙江GEO优化服务商推荐榜:豆包GEO推广与AI获客关键词优化全景解析 - 品牌发掘
  • 告别混乱!用SAP PS用户状态与字段选择,搭建清晰的项目管理流程(附SU22/SU24配置技巧)
  • 苏州五年制专转本美术大类,选择蓝洋教育的核心理由 - 起跑123
  • 用CppAD+IPOPT搞定一个简单的非线性优化问题:从数学公式到C++代码的完整流程
  • 通关‘头歌’线性回归后,我总结了5个NumPy实战技巧与1个常见坑
  • FastAPI学习笔记:二、ORM
  • 后端技术栈深度解析:从入门到精通的完整指南
  • 后端技术栈实战指南:打造高性能、高可用系统
  • 2026年 除漆剂/除臭剂/絮凝剂/消泡剂厂家推荐榜:源头工艺与环保高效除味消泡实力品牌解析 - 品牌发掘
  • dubbo和oppenFeign是如何找到正确的url请求地址的
  • 抽象数据类型和数据结构的定义
  • Redis 分布式锁进阶第一百二十八篇
  • 2026年 浙江宣传册设计公司最新推荐榜单:品牌画册、企业宣传册与产品手册设计服务及创意案例精选 - 品牌发掘
  • SAP PS避坑指南:项目状态管理与字段选择配置中的5个常见误区
  • 2026 成都迪奥回收最新行情,经典款与新款二手流通价差解析 - 奢侈品回收评测
  • 2026选店指南,哈尔滨黄金回收门店参考手册 - 奢侈品回收测评
  • 济南车主改灯避坑指南|改灯别乱选门店,天眼照明专业才是硬道理 - Ayu8888
  • 2026 消费电子异形磁铁赛道 多家源头厂商技术能力多维对比 - 变量人生001
  • 别再只会用uvm_do了!手把手教你用start_item/finish_item搞定复杂transaction发送