Weather Agent 是一个基于 Spring AI Alibaba 和 通义千问大模型 构建的智能天气助手。它支持自然语言交互,用户可以像和朋友聊天一样询问天气情况,AI 会自动理解意图、调用天气 API 并给出贴心的生活建议。
- 自然语言理解 - 无需固定格式,自然对话即可查询天气
- 智能建议 - 不仅告诉你天气,还提供穿衣、出行建议
- 流式响应 - 打字机效果,体验更自然流畅
- 多轮对话 - 支持上下文记忆,对话更连贯
| 特性 | 描述 |
|---|---|
| 🗣️ 自然语言查询 | 支持 "上海今天需要带伞吗?"、"北京明天天气怎么样?" 等自然语言查询 |
| 🔧 AI 函数调用 | 基于 Spring AI Function Calling,自动识别意图并调用天气 API |
| 📡 流式响应 | 支持 SSE 流式输出,实现打字机效果 |
| 💬 多轮对话 | 内置对话记忆,支持上下文理解 |
| 🌍 多城市支持 | 支持北京、上海、杭州、广州、深圳等主要城市 |
| 💡 智能建议 | 根据天气状况提供穿衣、出行、健康等生活建议 |
| 技术 | 版本 | 说明 |
|---|---|---|
| Spring Boot | 3.5.11 | 核心框架 |
| Spring AI Alibaba | 1.1.2.2 | AI 能力集成 |
| 通义千问 | qwen-plus | 大语言模型 |
| 和风天气 API | v7 | 天气数据来源 |
| Java | 17 | 开发语言 |
| WebFlux | - | 响应式 HTTP 客户端 |
| Fastjson2 | 2.0.61 | JSON 处理 |
| Lombok | - | 代码简化 |
WeatherAgent/
├── src/
│ ├── main/
│ │ ├── java/com/weather/agent/
│ │ │ ├── config/
│ │ │ │ └── AiConfig.java # AI 配置(ChatClient、对话记忆)
│ │ │ ├── controller/
│ │ │ │ └── WeatherAssistantController.java # REST API 控制器
│ │ │ ├── model/
│ │ │ │ ├── WeatherRequest.java # 请求模型
│ │ │ │ └── WeatherResponse.java # 响应模型
│ │ │ ├── service/
│ │ │ │ └── WeatherService.java # 天气服务(@Tool 注解)
│ │ │ └── WeatherAgentApplication.java # 启动类
│ │ └── resources/
│ │ └── application.yaml # 配置文件
│ └── test/
│ └── java/com/weather/agent/
│ └── WeatherAgentApplicationTests.java
├── pom.xml # Maven 依赖配置
└── README.md
| 组件 | 文件 | 职责 |
|---|---|---|
| AI 配置 | AiConfig.java |
配置 ChatClient、系统提示词、对话记忆、工具注册 |
| 控制器 | WeatherAssistantController.java |
提供 REST API 接口 |
| 天气服务 | WeatherService.java |
封装天气查询逻辑,使用 @Tool 注解暴露给 AI |
| 数据模型 | WeatherResponse.java |
定义天气数据结构 |
git clone https://github.com/your-repo/weather-agent.git
cd weather-agent编辑 src/main/resources/application.yaml:
spring:
ai:
dashscope:
api-key: 你的百炼API_KEY # 替换为你的阿里云百炼 API Key
weather:
api:
key: 你的和风天气API_KEY # 替换为你的和风天气 API Key
base-url: https://devapi.qweather.com/v7 # 或使用私有域名# 编译项目
mvn clean package -DskipTests
# 运行项目
mvn spring-boot:run启动成功后,控制台会显示:
========================================
🌤️ 天气助手 Agent 已启动!
访问地址: http://localhost:8080/api/weather/ask?question=上海今天需要带伞吗?
========================================
- Base URL:
http://localhost:8080/api/weather - Content-Type:
application/json
POST /chat
支持自然语言查询,返回完整响应。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| message | String | 是 | 用户消息 |
curl -X POST http://localhost:8080/api/weather/chat \
-H "Content-Type: application/json" \
-d '{"message": "上海今天需要带伞吗?"}'上海今天是多云天气,温度 26°C,湿度 65%,降水概率很低,您不需要带伞。
建议穿着轻薄透气的衣物,出门记得做好防晒哦!
POST /chatStream
支持流式输出,实现打字机效果。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| message | String | 是 | 用户消息 |
curl -X POST http://localhost:8080/api/weather/chatStream \
-H "Content-Type: application/json" \
-H "Accept: application/x-ndjson" \
-d '{"message": "杭州明天穿什么衣服合适?"}'- Content-Type:
application/x-ndjson - 响应为流式输出,每次返回一段文本
GET /ask
简单的 GET 请求接口,适合快速测试。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| question | String | 是 | 查询问题 |
curl "http://localhost:8080/api/weather/ask?question=北京今天天气怎么样?"直接在浏览器中访问:
http://localhost:8080/api/weather/ask?question=深圳明天会下雨吗?
用户:明天去杭州出差,需要带伞吗?
AI:杭州明天是晴天,温度 25°C,降水概率仅 5%,您不需要带伞。
不过早晚温差较大,建议带一件薄外套备用。
用户:上海今天穿什么衣服合适?
AI:上海今天多云,温度 22°C,湿度适中,建议穿着长袖衬衫或薄毛衣。
如果您需要长时间户外活动,可以搭配一件轻便外套。
用户:北京今天天气怎么样?
AI:北京今天晴,温度 18°C,空气质量良好,非常适合户外活动!
用户:那明天呢?
AI:北京明天同样是晴天,温度会升至 21°C,您可以继续享受好天气!
spring:
application:
name: weather-agent
ai:
dashscope:
api-key: ${DASHSCOPE_API_KEY} # 百炼 API Key
chat:
options:
model: qwen-plus # 模型选择:qwen-turbo/qwen-plus/qwen-max
temperature: 0.7 # 创造性参数 (0-1)
max-tokens: 500 # 最大输出 token
function-callback-enabled: true # 启用函数调用
cache-mode: SYSTEM_AND_TOOLS # 缓存模式
cache-ttl: 1h # 缓存时长
server:
port: 8080
weather:
api:
key: ${QWEATHER_API_KEY} # 和风天气 API Key
base-url: https://devapi.qweather.com/v7| 模型 | 特点 | 适用场景 |
|---|---|---|
| qwen-turbo | 响应快,成本低 | 简单查询,高并发场景 |
| qwen-plus | 平衡性能与成本 | 推荐日常使用 |
| qwen-max | 能力最强 | 复杂推理场景 |
┌──────────────┐ ┌──────────────┐ ┌──────────────┐
│ 用户请求 │────▶│ Controller │────▶│ ChatClient │
└──────────────┘ └──────────────┘ └──────────────┘
│
▼
┌──────────────┐ ┌──────────────┐
│ 通义千问模型 │◀───│ AI Advisor │
└──────────────┘ └──────────────┘
│
▼ Function Calling
┌──────────────┐ ┌──────────────┐
│ WeatherService│────▶│ 和风天气 API │
│ (@Tool) │ └──────────────┘
└──────────────┘
- 用户发送自然语言查询
- ChatClient 将请求发送给通义千问
- AI 识别意图,决定是否调用
getWeather工具 - WeatherService 调用和风天气 API 获取实时数据
- AI 整合天气数据,生成个性化回复
欢迎提交 Issue 和 Pull Request!
- Fork 本项目
- 创建特性分支 (
git checkout -b feature/amazing-feature) - 提交更改 (
git commit -m 'Add some amazing feature') - 推送到分支 (
git push origin feature/amazing-feature) - 创建 Pull Request
- 遵循 Java 编码规范
- 提交信息使用中文,格式清晰
- 新功能需要添加相应测试
本项目采用 Apache License 2.0 许可证。
- Spring AI - AI 能力集成框架
- Spring AI Alibaba - 阿里云 AI 集成
- 和风天气 - 天气数据服务
- 阿里云百炼 - 大模型服务
如果这个项目对你有帮助,请给一个 ⭐ Star 支持一下!