Skip to content

Java AI Agent :30行代码手撸一个“能查股价”的智能体

1. 环境准备

确保你的 pom.xml 引入了 Spring AI 的 OpenAI Starter(DeepSeek 兼容 OpenAI 协议)。

xml
<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-openai-spring-boot-starter</artifactId>
</dependency>

application.yml 配置 DeepSeek:

yaml
spring:
  ai:
    openai:
      base-url: https://api.deepseek.com
      api-key: sk-你的key
      chat:
        options:
          model: deepseek-chat

2. 第一步:定义工具 (The Tool)

在 Java 里,一个工具本质上就是一个 java.util.function.Function。 我们需要定义一个 Bean,让 AI 知道它是干嘛的。

java
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonClassDescription;

@Configuration
public class ToolsConfig {

    // 1. 定义请求参数结构(AI 会根据这个类填充参数)
    @JsonClassDescription("股票查询请求,包含股票代码") // 👈 这里的描述很重要,AI 靠它理解
    public record StockRequest(
        @JsonProperty(required = true, value = "股票代码,如 AAPL, TSLA") String symbol
    ) {}

    // 2. 定义返回结果结构
    public record StockResponse(String symbol, double price, String currency) {}

    // 3. 注册工具 Bean
    @Bean
    @Description("根据股票代码查询当前实时股价") // 👈 核心!这是给 AI 看的工具说明书
    public Function<StockRequest, StockResponse> currentStockPrice() {
        return request -> {
            System.out.println("🤖 AI 正在调用 Java 方法查询股票:" + request.symbol());
            // 这里可以对接真实的 API,为了演示我们模拟一下
            double price = switch (request.symbol().toUpperCase()) {
                case "AAPL" -> 180.5;
                case "TSLA" -> 210.2;
                default -> 0.0;
            };
            return new StockResponse(request.symbol(), price, "USD");
        };
    }
}

3. 第二步:构建 Agent 并调用

在你的 Controller 或测试类中:

java
@RestController
@RequestMapping("/agent")
public class AgentController {

    private final ChatClient chatClient;

    public AgentController(ChatClient.Builder builder) {
        // 在构建时,把刚才定义的工具注册进去
        this.chatClient = builder
                .defaultFunctions("currentStockPrice") // 👈 对应 Bean 的名字
                .build();
    }

    @GetMapping("/chat")
    public String chat(String msg) {
        return chatClient.prompt()
                .user(msg)
                .call()
                .content();
    }
}

4. 见证奇迹的时刻

启动项目,访问接口: GET /agent/chat?msg=特斯拉现在的股价是多少?

后台日志会打印:

text
🤖 AI 正在调用 Java 方法查询股票:TSLA

浏览器返回结果:

text
特斯拉(TSLA)当前的股价是 210.2 美元。

发生了什么?

  1. DeepSeek 收到“特斯拉股价”,分析发现你需要数据。
  2. 它查看工具箱,发现 currentStockPrice 工具的描述匹配需求。
  3. 它提取参数 TSLA,命令 Spring AI 调用 Java 方法。
  4. Java 方法返回 210.2
  5. DeepSeek 拿到数字,组织成通顺的自然语言回答你。

5. 总结

看,这就是 Agent! 你不需要写 if (msg.contains("股价")) 这种死板的代码。你只需要把业务逻辑封装成 Function,AI 就会自动根据语义去调用。

这对于我们做业务系统的启示是巨大的: 你可以把“查询订单”、“修改密码”、“统计报表”全部封装成 Tool。 以后用户再问:“帮我把昨天没支付的订单取消掉”,AI 就能真的去执行 SQL Update 操作,而不仅是陪聊了。