首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >新手也能懂!手把手教你搭建一个会说双关语的天气预报 AI Agent

新手也能懂!手把手教你搭建一个会说双关语的天气预报 AI Agent

作者头像
90后小陈老师
发布2026-01-28 14:54:46
发布2026-01-28 14:54:46
1790
举报
文章被收录于专栏:杂谈杂谈

今天带大家从零开始,用最简单的方式构建一个会说双关语的智能天气助手。不需要复杂的AI知识,跟着教程走,你也能做出来!

什么是Agent?为什么要学它?

想象一下,你有个私人助理,不仅能回答问题,还能主动调用工具、查询数据、记住你们的对话历史。这就是Agent——比普通AI聊天机器人更强大的智能体。

今天我们要做的天气Agent有这些超能力:

  • • 🤖 能主动判断需要什么信息
  • • 🔧 会自己调用天气查询工具
  • • 💾 记得住你们聊过什么
  • • 😄 还会用双关语逗你开心

听起来很酷吧?其实实现起来一点都不难!

准备工作(5分钟搞定)

你需要什么?

  1. 1. Java开发环境 (JDK 17+、Jetbrain IDEA等)
  2. 2. Maven项目 (用来管理依赖)
  3. 3. API密钥 (选择下面任意一个)
    • • 阿里云DashScope API密钥(推荐国内用户)
    • • OpenAI API密钥

添加依赖

在你的pom.xml文件中加入:

代码语言:javascript
复制
<!-- 如果用阿里云DashScope -->
<dependency>
    <groupId>com.alibaba.cloud.ai</groupId>
    <artifactId>spring-ai-alibaba-starter-dashscope</artifactId>
    <version>1.1.0.0-RC2</version>
</dependency>

<!-- 如果用OpenAI -->
<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-starter-model-openai</artifactId>
    <version>1.1.0</version>
</dependency>

六步搭建你的智能Agent

第一步:给Agent设定人设(System Prompt)

就像给员工写岗位说明书,我们要告诉AI它是谁、能做什么:

代码语言:javascript
复制
String SYSTEM_PROMPT = """
    你是一位资深气象专家,特别喜欢用双关语说话。
    
    你可以使用两个工具:
    • get_weather_for_location: 查询指定城市的天气
    • get_user_location: 获取用户所在位置
    
    当用户问天气时,一定要先确认位置。
    如果用户说"这里"、"我这边"等模糊词,
    就用get_user_location工具查询用户位置。
    """;

小贴士: System Prompt要写得具体明确,就像教小孩做事一样,越详细越好!

第二步:打造Agent的工具箱

Agent之所以强大,就在于它会使用工具。我们给它准备两个工具:

工具1: 天气查询工具

代码语言:javascript
复制
public class WeatherForLocationTool implements BiFunction<String, ToolContext, String> {
    @Override
    public String apply(
        @ToolParam(description = "城市名称") String city,
        ToolContext toolContext) {
        // 这里可以接入真实的天气API
        // 现在先返回模拟数据
        return city + "今天阳光明媚,气温25度!";
    }
}

工具2: 用户定位工具(这个厉害了,能读取运行时上下文!)

代码语言:javascript
复制
public class UserLocationTool implements BiFunction<String, ToolContext, String> {
    @Override
    public String apply(
        @ToolParam(description = "用户查询") String query,
        ToolContext toolContext) {
        // 从上下文中获取用户ID
        String userId = "";
        if (toolContext != null && toolContext.getContext() != null) {
            RunnableConfig config = (RunnableConfig) 
                toolContext.getContext().get(AGENT_CONFIG_CONTEXT_KEY);
            Optional<Object> userIdObj = config.metadata("user_id");
            if (userIdObj.isPresent()) {
                userId = (String) userIdObj.get();
            }
        }
        
        // 根据用户ID返回位置(实际应用中从数据库查询)
        return "1".equals(userId) ? "深圳" : "北京";
    }
}

注册工具:

代码语言:javascript
复制
ToolCallback weatherTool = FunctionToolCallback
    .builder("getWeatherForLocation", new WeatherForLocationTool())
    .description("查询指定城市的天气情况")
    .inputType(String.class)
    .build();

ToolCallback locationTool = FunctionToolCallback
    .builder("getUserLocation", new UserLocationTool())
    .description("根据用户ID获取用户位置")
    .inputType(String.class)
    .build();

关键点: 工具的名称、描述都会成为AI提示的一部分,写清楚能让AI更准确地判断何时使用!

第三步:选择和配置AI大模型

代码语言:javascript
复制
// 以阿里云DashScope为例
DashScopeApi dashScopeApi = DashScopeApi.builder()
    .apiKey(System.getenv("AI_DASHSCOPE_API_KEY"))  // 从环境变量读取
    .build();

ChatModel chatModel = DashScopeChatModel.builder()
    .dashScopeApi(dashScopeApi)
    .defaultOptions(DashScopeChatOptions.builder()
        .withModel(DashScopeChatModel.DEFAULT_MODEL_NAME)
        .withTemperature(0.5)  // 控制回答的创造性,0-1之间
        .withMaxToken(1000)    // 限制回答长度
        .build())
    .build();

参数解释:

  • temperature: 0接近精确,1更有创意。天气查询用0.5刚好
  • maxToken: 防止回答太长,浪费成本

第四步:定义输出格式(可选但强烈推荐)

让AI的回答结构化,方便前端展示:

代码语言:javascript
复制
public class ResponseFormat {
    // 必须有的双关语回复
    private String punnyResponse;
    
    // 天气详情(如果有的话)
    private String weatherConditions;
    
    // Getters和Setters
    public String getPunnyResponse() {
        return punnyResponse;
    }
    
    public void setPunnyResponse(String punnyResponse) {
        this.punnyResponse = punnyResponse;
    }
    
    public String getWeatherConditions() {
        return weatherConditions;
    }
    
    public void setWeatherConditions(String weatherConditions) {
        this.weatherConditions = weatherConditions;
    }
}

第五步:给Agent加上记忆

没有记忆的AI就像金鱼,聊完就忘。加上记忆后,它能记住你们的对话:

代码语言:javascript
复制
// 创建Agent时加入记忆组件
ReactAgent agent = ReactAgent.builder()
    .name("weather_agent")
    .saver(new MemorySaver())  // 内存存储,简单快速
    .build();

使用记忆的秘诀:

代码语言:javascript
复制
// 用同一个threadId,Agent就能记住之前的对话
String threadId = "user_123_chat";
RunnableConfig config = RunnableConfig.builder()
    .threadId(threadId)
    .build();

// 第一次问
agent.call("深圳今天天气怎么样?", config);

// 第二次问(注意用同一个threadId)
agent.call("明天呢?", config);  
// Agent知道你问的是深圳明天的天气!

生产环境提醒: MemorySaver只存在内存中,服务重启就没了。真实项目要用数据库持久化!

第六步:组装并启动你的Agent!

万事俱备,现在把所有组件组装起来:

代码语言:javascript
复制
// 创建你的智能天气助手
ReactAgent agent = ReactAgent.builder()
    .name("weather_pun_agent")              // 给Agent起个名字
    .model(chatModel)                       // 配置的AI模型
    .systemPrompt(SYSTEM_PROMPT)            // Agent人设
    .tools(locationTool, weatherTool)       // 提供的工具
    .outputType(ResponseFormat.class)       // 输出格式
    .saver(new MemorySaver())               // 记忆组件
    .build();

// 开始对话!
String threadId = "chat_001";
RunnableConfig config = RunnableConfig.builder()
    .threadId(threadId)
    .addMetadata("user_id", "1")  // 传入用户ID
    .build();

// 第一轮对话
AssistantMessage response = agent.call("外面天气怎么样?", config);
System.out.println(response.getText());
// 可能输出: "深圳今天'晴'有独钟!阳光明媚25度,
//          简直是'天气晴郎'的好时'光'啊!"

// 继续对话
response = agent.call("谢谢!", config);
System.out.println(response.getText());
// 可能输出: "不'客气',能为您'预'报天气是我的'荣'幸!"

🎉 成功!你的第一个Agent跑起来了!

看到双关语回复了吗?这就是你的AI Agent在工作:

  1. 1. 理解你的问题
  2. 2. 判断需要调用哪个工具
  3. 3. 自动调用工具获取数据
  4. 4. 用幽默的方式回复你
  5. 5. 记住对话历史,等待下一轮交互

进阶技巧(选读)

技巧1: 自定义JSON输出格式

除了用Java类,还可以直接定义JSON格式:

代码语言:javascript
复制
String customSchema = """
    请按以下JSON格式输出:
    {
        "title": "标题",
        "content": "内容",
        "style": "风格"
    }
    """;

ReactAgent agent = ReactAgent.builder()
    .outputSchema(customSchema)
    .build();

技巧2: 获取完整执行状态

想看Agent内部发生了什么?用invoke方法:

代码语言:javascript
复制
Optional<OverAllState> result = agent.invoke("帮我查天气");

if (result.isPresent()) {
    OverAllState state = result.get();
    // 查看所有消息历史
    List<Message> messages = state.value("messages", new ArrayList<>());
    // 调试神器!
    System.out.println("Agent内部状态: " + state);
}

技巧3: 防止Agent进入死循环

加个保险栓,限制最多调用次数:

代码语言:javascript
复制
ModelCallLimitHook hook = ModelCallLimitHook.builder()
    .runLimit(5)  // 最多调5次模型
    .exitBehavior(ModelCallLimitHook.ExitBehavior.ERROR)
    .build();

ReactAgent agent = ReactAgent.builder()
    .hooks(hook)
    .build();

技巧4: 人机协同(高级功能)

让重要操作需要人工确认:

代码语言:javascript
复制
Hook humanApproval = HumanInTheLoopHook.builder()
    .approvalOn("getWeatherTool", 
        ToolConfig.builder()
            .description("是否允许查询天气?")
            .build())
    .build();

ReactAgent agent = ReactAgent.builder()
    .hooks(humanApproval)
    .build();

更多代码示例在哪里?

想看更多完整示例?访问阿里官方仓库: 👉 https://github.com/spring-ai-alibaba/examples

总结:你学到了什么?

通过这个教程,你掌握了Agent开发的核心概念:

System Prompt - 定义AI的角色和能力 ✅ 工具创建 - 让AI能调用外部功能 ✅ 模型配置 - 选择和调优AI模型 ✅ 结构化输出 - 让回答格式可控 ✅ 对话记忆 - 实现连续对话能力 ✅ 完整构建 - 从零到一搭建Agent

下一步可以做什么?

  1. 1. 接入真实天气API - 替换模拟数据,查询真实天气
  2. 2. 添加更多工具 - 比如查询空气质量、紫外线指数
  3. 3. 优化System Prompt - 让回复更专业或更幽默
  4. 4. 持久化记忆 - 用数据库替代MemorySaver
  5. 5. 部署上线 - 做成微信小程序或网页版

遇到问题?

欢迎在评论区留言,我会第一时间回复!


觉得有用就点个赞吧! 👍 关注我,下期教你如何把Agent部署到生产环境!

#AI开发 #SpringAI #Agent #Java #人工智能

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2026-01-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 90后小陈老师 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 什么是Agent?为什么要学它?
  • 准备工作(5分钟搞定)
    • 你需要什么?
    • 添加依赖
  • 六步搭建你的智能Agent
    • 第一步:给Agent设定人设(System Prompt)
    • 第二步:打造Agent的工具箱
    • 第三步:选择和配置AI大模型
    • 第四步:定义输出格式(可选但强烈推荐)
    • 第五步:给Agent加上记忆
    • 第六步:组装并启动你的Agent!
  • 🎉 成功!你的第一个Agent跑起来了!
  • 进阶技巧(选读)
    • 技巧1: 自定义JSON输出格式
    • 技巧2: 获取完整执行状态
    • 技巧3: 防止Agent进入死循环
    • 技巧4: 人机协同(高级功能)
  • 更多代码示例在哪里?
  • 总结:你学到了什么?
  • 下一步可以做什么?
  • 遇到问题?
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档