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-chat2. 第一步:定义工具 (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 美元。发生了什么?
- DeepSeek 收到“特斯拉股价”,分析发现你需要数据。
- 它查看工具箱,发现
currentStockPrice工具的描述匹配需求。 - 它提取参数
TSLA,命令 Spring AI 调用 Java 方法。 - Java 方法返回
210.2。 - DeepSeek 拿到数字,组织成通顺的自然语言回答你。
5. 总结
看,这就是 Agent! 你不需要写 if (msg.contains("股价")) 这种死板的代码。你只需要把业务逻辑封装成 Function,AI 就会自动根据语义去调用。
这对于我们做业务系统的启示是巨大的: 你可以把“查询订单”、“修改密码”、“统计报表”全部封装成 Tool。 以后用户再问:“帮我把昨天没支付的订单取消掉”,AI 就能真的去执行 SQL Update 操作,而不仅是陪聊了。