13. Spring AI 的观测性
@
目录
- 13. Spring AI 的观测性
- 观测性
- 为什么Spring AI应用急需可观测性?
- AI服务成本失控的痛点
- Spring AI可观测性的价值
- 实战演练:构建可观测的Spring AI翻译应用
- 第一步:Spring AI项目初始化
- 第二步:Spring AI客户端配置
- 第三步:构建Spring AI翻译服务
- 第四步:Spring AI翻译API测试
- Spring AI监控指标深度解析
- 核心指标1:Spring AI操作性能监控
- 核心指标2:Spring AI Token使用量精准追踪
- 最后:
观测性
为什么Spring AI应用急需可观测性?
AI服务成本失控的痛点
在企业级AI应用中,使用DeepSeek、OpenAI、Google Gemini或Azure OpenAI等服务时,成本控制是一个严峻挑战:
- Token消耗不透明:无法精确了解每次AI调用的成本
- 费用增长失控:大规模应用中,AI服务费用可能呈指数级增长
- 性能瓶颈难定位:AI调用链路复杂,问题排查困难
- 资源使用不合理:缺乏数据支撑的优化决策
Spring AI可观测性的价值
Spring AI的可观测性功能为这些痛点提供了完美解决方案:
- ✅精准Token监控:实时追踪输入/输出Token消耗,精确到每次调用
- ✅智能成本控制:基于使用统计制定成本优化策略
- ✅深度性能分析:识别AI调用瓶颈,优化响应时间
- ✅完整链路追踪:端到端记录请求在Spring AI应用中的完整流转
实战演练:构建可观测的Spring AI翻译应用
第一步:Spring AI项目初始化
在start.spring.io[1]创建Spring Boot项目,集成Spring AI核心依赖:
Maven依赖配置(Spring AI BOM管理):- <dependency>
- <groupId>com.alibaba.cloud.ai</groupId>
- spring-ai-alibaba-starter-dashscope</artifactId>
- </dependency>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- spring-boot-starter-actuator</artifactId>
- </dependency>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- spring-boot-starter-web</artifactId>
- </dependency>
复制代码 第二步:Spring AI客户端配置
主应用类配置:- @SpringBootApplication
- publicclassSpringAiTranslationApplication {
- publicstaticvoidmain(String[] args) {
- SpringApplication.run(SpringAiTranslationApplication.class, args);
- }
- @Bean
- public ChatClient chatClient(ChatClient.Builder builder) {
- return builder.build();
- }
- }
复制代码 Spring AI配置文件:- # Spring AI 可观测性配置
- management:
- endpoints:
- web:
- exposure:
- include:"*"
- endpoint:
- health:
- show-details:always
- metrics:
- export:
- prometheus:
- enabled:true
- spring:
- threads:
- virtual:
- enabled:true
- ai:
- deepseek:
- api-key:${DEEPSEEK_API_KEY}
- chat:
- options:
- model:deepseek-chat
- temperature: 0.8
复制代码 环境变量设置:
export DEEPSEEK_API_KEY=your-deepseek-api-key
第三步:构建Spring AI翻译服务
智能翻译控制器:- @RestController
- @RequestMapping("/api/v1")
- @RequiredArgsConstructor
- @Slf4j
- public class SpringAiTranslationController {
- private final ChatModel chatModel;
- @PostMapping("/translate")
- public TranslationResponse translate(@RequestBody TranslationRequest request) {
- log.info("Spring AI翻译请求: {} -> {}", request.getSourceLanguage(), request.getTargetLanguage());
-
- String prompt= String.format(
- "作为专业翻译助手,请将以下%s文本翻译成%s,保持原文的语气和风格:\n%s",
- request.getSourceLanguage(),
- request.getTargetLanguage(),
- request.getText()
- );
- String translatedText= chatModel.call(prompt);
-
- return TranslationResponse.builder()
- .originalText(request.getText())
- .translatedText(translatedText)
- .sourceLanguage(request.getSourceLanguage())
- .targetLanguage(request.getTargetLanguage())
- .timestamp(System.currentTimeMillis())
- .build();
- }
- }
- @Data
- @NoArgsConstructor
- @AllArgsConstructor
- @Builder
- class TranslationRequest {
- private String text;
- private String sourceLanguage;
- private String targetLanguage;
- }
- @Data
- @NoArgsConstructor
- @AllArgsConstructor
- @Builder
- class TranslationResponse {
- private String originalText;
- private String translatedText;
- private String sourceLanguage;
- private String targetLanguage;
- private Long timestamp;
- }
复制代码 第四步:Spring AI翻译API测试
- curl -X POST http://localhost:8080/api/v1/translate
- -H "Content-Type: application/json"
- -d '{
- "text": "Spring AI makes AI integration incredibly simple and powerful",
- "sourceLanguage": "英语",
- "targetLanguage": "中文"
- }'
- # 响应示例
- {
- "originalText": "Spring AI makes AI integration incredibly simple and powerful",
- "translatedText": "Spring AI让AI集成变得极其简单而强大",
- "sourceLanguage": "英语",
- "targetLanguage": "中文",
- "timestamp": 1704067200000
- }
复制代码 Spring AI监控指标深度解析
核心指标1:Spring AI操作性能监控
指标端点:/actuator/metrics/spring.ai.chat.client- {
- "name":"spring.ai.chat.client.operation",
- "description":"Spring AI ChatClient操作性能指标",
- "baseUnit":"seconds",
- "measurements":[
- {
- "statistic":"COUNT",
- "value":15
- },
- {
- "statistic":"TOTAL_TIME",
- "value":8.456780293
- },
- {
- "statistic":"MAX",
- "value":2.123904083
- }
- ],
- "availableTags":[
- {
- "tag":"gen_ai.operation.name",
- "values":["framework"]
- },
- {
- "tag":"spring.ai.kind",
- "values":["chat_client"]
- }
- ]
- }
复制代码 业务价值:
- 监控Spring AI翻译服务调用频次
- 分析Spring AI响应时间分布
- 识别Spring AI性能瓶颈
核心指标2:Spring AI Token使用量精准追踪
指标端点 /actuator/metrics/gen_ai.client.token.usage- {
- "name":"gen_ai.client.token.usage",
- "description":"Spring AI Token使用量统计",
- "measurements":[
- {
- "statistic":"COUNT",
- "value":1250
- }
- ],
- "availableTags":[
- {
- "tag":"gen_ai.response.model",
- "values":["deepseek-chat"]
- },
- {
- "tag":"gen_ai.request.model",
- "values":["deepseek-chat"]
- },
- {
- "tag":"gen_ai.token.type",
- "values":[
- "output",
- "input",
- "total"
- ]
- }
- ]
- }
复制代码 成本控制价值:
- 精确计算Spring AI服务成本
- 优化Prompt设计降低Token消耗
- 制定基于使用量的预算策略
最后:
“在这个最后的篇章中,我要表达我对每一位读者的感激之情。你们的关注和回复是我创作的动力源泉,我从你们身上吸取了无尽的灵感与勇气。我会将你们的鼓励留在心底,继续在其他的领域奋斗。感谢你们,我们总会在某个时刻再次相遇。”
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |