Spring Boot 接入大模型能力:调用模型 API 做智能问答与日志异常分析
在 Spring Boot 项目里接入大模型,最稳妥的起点不是直接调接口,而是先把“模型调用”收口成一个独立的服务:统一管理地址、密钥、模型名、超时和重试,业务代码只关心“问什么、得到什么”。这样后续换模型服务商、换模型版本,都只需要改配置,不用改业务。
一、两种接入方式怎么选
- 直接调用模型服务商的 HTTP API:依赖最少,适合快速验证和小型功能;需要自己处理鉴权、超时、重试和结果解析。
- 通过网关或代理服务调用:适合多服务共用、需要统一审计和限流的场景;多一层部署与维护成本。
对多数已有 Spring Boot 应用来说,先从直接调用开始,等调用量和调用方多起来再考虑网关,是更省事的演进路线。
二、智能问答:把一次调用做成可复用的接口
智能问答的核心不是“能调通”,而是“可控”。建议做到三点:第一,提示词由服务端组装,不要把系统提示词交给前端拼接;第二,输入做长度限制,避免超长文本直接透传;第三,返回结果保留原始结构,方便前端按需取用,也方便排查问题。
一个常见的落地形态是:前端把用户问题发给后端接口,后端组装提示词、调用模型 API,再把回答返回给前端。业务数据查询仍然走数据库,模型只负责理解问题和组织语言,查库、算数、写库这些确定性操作不要交给模型去“猜”。
三、日志异常分析:先结构化,再提问
直接把一整段原始日志丢给模型,效果往往不稳定。更有效的做法是先在程序里做结构化处理:提取时间、服务名、异常类型、异常信息和关键的请求标识,只把这些结构化信息和少量上下文发给模型,请它做归类、给出可能原因和排查建议。
例如,一条日志里同时出现空指针异常和数据库连接超时,模型如果只看到堆栈,很容易只盯着第一条;而先由程序把“异常类型、首次出现时间、出现次数、关联接口”整理成清单,模型的判断会更聚焦。分析结论只能作为排查线索,最终定论仍要以复现和日志、监控证据为准。
四、代码示例:一个可运行的最小调用
下面是一个基于 Spring Boot 3 与 RestClient 的最小示例,依赖只有 spring-boot-starter-web,模型地址、密钥和模型名都从配置读取,密钥不要写进代码或提交到仓库。
package com.example.llm;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestClient;
import java.util.List;
import java.util.Map;
@RestController
@RequestMapping("/ai")
public class AskController {
private final RestClient restClient;
private final String model;
public AskController(@Value("${llm.api-url}") String apiUrl,
@Value("${llm.api-key}") String apiKey,
@Value("${llm.model}") String model) {
this.model = model;
this.restClient = RestClient.builder()
.baseUrl(apiUrl)
.defaultHeader("Authorization", "Bearer " + apiKey)
.build();
}
@PostMapping("/ask")
public Map<String, Object> ask(@RequestBody Map<String, String> body) {
String question = body.getOrDefault("question", "");
Map<String, Object> request = Map.of(
"model", model,
"messages", List.of(Map.of("role", "user", "content", question)));
return restClient.post()
.contentType(MediaType.APPLICATION_JSON)
.body(request)
.retrieve()
.body(Map.class);
}
}
配置写在 application.properties 里,地址和模型名按所用模型服务商的文档填写:
llm.api-url=https://模型服务商提供的兼容接口地址
llm.api-key=${LLM_API_KEY}
llm.model=模型名称
启动后用 POST 请求调用 /ai/ask,请求体为 {“question”:“Spring Boot 启动时报端口占用,一般先检查什么?”},服务会把问题转发给模型并原样返回模型响应的 JSON 结构。第一次跑通后,可以再逐步加上超时设置、失败重试和输入长度校验。
五、落地前必须想清楚的三件事
- 密钥安全:密钥只放在环境变量或密钥管理服务里,日志里不要打印密钥和完整请求体。
- 成本与限流:模型调用需要按调用量付费,给接口加上调用次数限制,避免循环或重试把调用量放大。
- 结果不可全信:模型会一本正经地给出错误答案,关键结论要人工复核,涉及生产变更的操作更不能由模型直接执行。
把模型当成“能读能写的助手”,而不是“能拍板的上级”,Spring Boot 接入大模型的收益才真正落到实处。
- 点赞
- 收藏
- 关注作者
评论(0)