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 操作,而不仅是陪聊了。