Java 长期占据企业级后端主流,而 AI 能力正在成为业务系统的标配。如何在 Spring 生态中优雅地集成大模型,兼顾可观测、可降级、可扩展,是 Java 工程师必须掌握的新技能。本文以 Spring Boot 3 + Spring AI 为主线,结合原生 HTTP 调用与向量检索,给出可落地的代码骨架。
Java 集成 AI 有三条路径:
WebClient 直接调 OpenAI 兼容接口,最灵活,适合定制协议。生产项目推荐 Spring AI 打底,特殊需求用原生补位。
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-openai-spring-boot-starter</artifactId>
<version>1.0.0-M4</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>配置 application.yml:
spring:
ai:
openai:
api-key: ${OPENAI_API_KEY}
base-url: https://api.openai.com
chat:
options:
model: gpt-4o-mini
temperature: 0.2封装一个可注入的 ChatService,统一处理超时、重试与审计:
@Service
public class ChatService {
private final ChatClient chatClient;
private final MeterRegistry metrics;
public ChatService(ChatClient.Builder builder, MeterRegistry metrics) {
this.chatClient = builder
.defaultSystem("你是企业客服助手,仅依据事实回答。")
.build();
this.metrics = metrics;
}
public String ask(String question) {
Timer.Sample sample = Timer.start(metrics);
try {
String answer = chatClient.prompt()
.user(question)
.call()
.content();
metrics.counter("ai.chat.success").increment();
return answer;
} catch (Exception e) {
metrics.counter("ai.chat.failure").increment();
throw new AiInvocationException("模型调用失败", e);
} finally {
sample.stop(metrics.timer("ai.chat.latency"));
}
}
}ChatClient 由 Spring AI 自动装配,天然支持流式输出、结构化输出与函数调用。
企业系统要的不是散文,而是可入库的数据。用 BeanOutputConverter 让模型直接返回 JSON 并映射为对象:
public record TicketResult(String category, String priority, String summary) {}
@Service
public class TicketClassifier {
private final ChatClient chatClient;
private final BeanOutputConverter<TicketResult> converter =
new BeanOutputConverter<>(TicketResult.class);
public TicketClassifier(ChatClient.Builder builder) {
this.chatClient = builder.build();
}
public TicketResult classify(String content) {
String prompt = """
对以下工单进行分类,类别限定为 [退款, 物流, 技术, 其他],
优先级限定为 [P0, P1, P2],并给出20字内摘要。
工单内容:%s
%s
""".formatted(content, converter.getFormat());
return chatClient.prompt().user(prompt).call()
.entity(converter);
}
}调用侧只处理强类型对象,避免手动解析 JSON 带来的脆弱性。
企业问答的准确率依赖检索增强。Spring AI 提供 VectorStore 与 EmbeddingModel:
@Service
public class KnowledgeService {
private final VectorStore vectorStore;
private final ChatClient chatClient;
public KnowledgeService(VectorStore vectorStore, ChatClient.Builder builder) {
this.vectorStore = vectorStore;
this.chatClient = builder.build();
}
public void ingest(List<Document> docs) {
vectorStore.add(docs);
}
public String ask(String question) {
List<Document> docs = vectorStore.similaritySearch(
SearchRequest.query(question).withTopK(5));
String context = docs.stream()
.map(Document::getContent)
.collect(Collectors.joining("\n"));
return chatClient.prompt()
.system("仅根据以下上下文回答,不确定则说不知道:\n" + context)
.user(question)
.call()
.content();
}
}向量库可选 PGVector、Redis、Milvus,生产环境建议独立部署并做租户隔离。
模型本身不能改数据库。用 @Tool 或 FunctionCallback 暴露受控接口:
@Component
public class OrderTools {
private final OrderRepository repo;
public OrderTools(OrderRepository repo) { this.repo = repo; }
@Tool(description = "根据订单号查询订单状态")
public OrderStatus queryOrder(@ToolParam String orderId) {
return repo.findById(orderId)
.map(o -> new OrderStatus(o.getId(), o.getStatus()))
.orElseThrow(() -> new NotFoundException(orderId));
}
}注册后,模型可自主决定何时调用,但权限白名单与幂等键仍由 Java 层控制。
@Async 或消息队列,避免占用 Web 线程。总结:Java 集成 AI 的关键不是调用 API,而是把模型当作一个不可靠的外部依赖来治理。用 Spring AI 统一抽象,用强类型约束输出,用 RAG 补充事实,用工具调用打通业务。代码结构清晰,边界明确,AI 才能真正进入企业生产环境。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。