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

本文涉及的产品
Serverless 应用引擎免费试用套餐包,4320000 CU,有效期3个月
云原生网关 MSE Higress,422元/月
注册配置 MSE Nacos/ZooKeeper,118元/月
简介: Java语言凭借其成熟的生态与解决方案,特别是通过 Spring AI 框架,正迅速成为 AI 应用开发的新选择。本文将探讨如何利用 Spring AI Alibaba 构建在线聊天 AI 应用,并实现对其性能的全面可观测性。

作者: 希铭


概述


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


作为炙手可热的Java应用开发框架,Spring给出了解决方案——Spring AI [1]Spring AI旨在简化Java AI应用程序开发,让Java开发者像使用Spring开发普通应用一样开发AI应用。以Spring AI为基础,Spring AI阿里巴巴项目 [2] 引入了阿里云通义系列大模型的全面装备,带来了丰富的工具集和深度的云服务集成,让开发者极速搭建即可实现AI应用。


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


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


快速搭建 Spring AI 应用


本示范节如何基于Spring AI阿里巴巴开发一个在线聊天代理应用,并支持大模型调用本地函数来查询某城市某天的天气,可以在查看此处示例源码 [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.编写聊天服务控制器类,/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.编写函数供大模型调用:


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);
  }
}


部署应用


通过以上五步,我们的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 控制台获取到的许可证密钥:


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


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


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


演示效果


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. 查看某条特定的轨迹,可以查看用药信息及其他关键信息,如大模型的响应id、模型名称、温度等:

image.png

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

image.png


展望


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


社区链接:https://github.com/alibaba/spring-ai-alibaba


参考文档:

[1] 春天AI

https://spring.io/projects/spring-ai

[2] Spring Cloud 阿里巴巴

https://sca.aliyun.com

[3] 在线聊天应用示例

https://github.com/alibaba/spring-ai-alibaba/tree/main/spring-ai-alibaba-examples/function-calling-example

[4] 如何获取API Key

https://help.aliyun.com/zh/model-studio/getting-started/first-api-call-to-qwen?spm=a2c4g.11186623.help-menu-search-2400256.d_0#f92b9b9cc7huw

[5] 手动安装 Java 探针

https://help.aliyun.com/zh/arms/application-monitoring/user-guide/manually-install-arms-agent-for-java-applicati ons?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://help.aliyun.com/zh/arms/application-monitoring/getting-started/monitoring-java-applications-in-an-ack-cluster

相关实践学习
通过云拨测对指定服务器进行Ping/DNS监测
本实验将通过云拨测对指定服务器进行Ping/DNS监测,评估网站服务质量和用户体验。
相关文章
|
8天前
|
人工智能 开发框架 安全
Serverless MCP 运行时业界首发,函数计算让 AI 应用最后一公里提速
作为云上托管 MCP 服务的最佳运行时,函数计算 FC 为阿里云百炼 MCP 提供弹性调用能力,用户只需提交 npx 命令即可“零改造”将开源 MCP Server 部署到云上,函数计算 FC 会准备好计算资源,并以弹性、可靠的方式运行 MCP 服务,按实际调用时长和次数计费,欢迎你在阿里云百炼和函数计算 FC 上体验 MCP 服务。
120 29
|
9天前
|
前端开发 Java 物联网
智慧班牌源码,采用Java + Spring Boot后端框架,搭配Vue2前端技术,支持SaaS云部署
智慧班牌系统是一款基于信息化与物联网技术的校园管理工具,集成电子屏显示、人脸识别及数据交互功能,实现班级信息展示、智能考勤与家校互通。系统采用Java + Spring Boot后端框架,搭配Vue2前端技术,支持SaaS云部署与私有化定制。核心功能涵盖信息发布、考勤管理、教务处理及数据分析,助力校园文化建设与教学优化。其综合性和可扩展性有效打破数据孤岛,提升交互体验并降低管理成本,适用于日常教学、考试管理和应急场景,为智慧校园建设提供全面解决方案。
162 70
|
9天前
|
存储 人工智能 Java
Spring AI与DeepSeek实战四:系统API调用
在AI应用开发中,工具调用是增强大模型能力的核心技术,通过让模型与外部API或工具交互,可实现实时信息检索(如天气查询、新闻获取)、系统操作(如创建任务、发送邮件)等功能;本文结合Spring AI与大模型,演示如何通过Tool Calling实现系统API调用,同时处理多轮对话中的会话记忆。
218 57
|
2天前
|
Java Spring
Spring框架的学习与应用
总的来说,Spring框架是Java开发中的一把强大的工具。通过理解其核心概念,通过实践来学习和掌握,你可以充分利用Spring框架的强大功能,提高你的开发效率和代码质量。
47 20
|
14天前
|
存储 人工智能 监控
一键部署 Dify + MCP Server,高效开发 AI 智能体应用
本文将着重介绍如何通过 SAE 快速搭建 Dify AI 研发平台,依托 Serverless 架构提供全托管、免运维的解决方案,高效开发 AI 智能体应用。
2044 63
|
5天前
|
人工智能 搜索推荐 Java
【重磅】JeecgBoot 里程碑 v3.8.0 发布,支持 AI 大模型、应用、AI 流程编排和知识库
JeecgBoot 最新推出了一整套 AI 大模型功能,包括 AI 模型管理、AI 应用、知识库、AI 流程编排和 AI 对话助手。这标志着其转型为 “AI 低代码平台”,旨在帮助开发者快速构建和部署个性化 AI 应用,降低开发门槛,提升效率。
46 12
|
14天前
|
人工智能 自然语言处理 安全
大企业的AI应用如何更懂业务?
数字经济推动中国经济高质量发展,大型企业数字化转型至关重要。AI技术浪潮下,国资委提出“应用领航、数据赋能、智算筑基”三大方向,深化AI与实体经济融合。CRM系统作为数智化基础设施,连接客户端与业务端,成为企业核心基座。以纷享销客为例,其通过“连接型CRM”打通数据壁垒,提供灵活组织架构配置,满足个性化需求。ShareAI平台赋能营销、销售和服务全链路智能化,确保数据安全并支持私有化部署。选择具备行业积淀和实战经验的CRM服务商,才能让数智化真正驱动业务增长与企业转型。
|
20天前
|
人工智能 数据可视化 API
开箱即用的可视化AI应用编排工具 Langflow,可调用魔搭免费API作为tool
ModelScope 社区基于优秀的开源可视化AI应用编排工具 Langflow 搭建了创空间,以方便社区开发者基于社区开源模型及免费魔搭 API-Inference,快速创建Agent应用、RAG应用并将其部署为API服务。
172 14
|
15天前
|
人工智能 前端开发 Java
AI大模型进阶系列(02)基于Spring AI实现AI chatbot助理|一句话让deepseek实现
本文介绍了通过DeepSeek生成一个基于Spring AI的在线AI聊天助手项目的全过程。项目采用JDK17+Spring AI+Thymeleaf+Spring Web技术栈,实现了一个简单的聊天界面,用户可输入内容并获得DeepSeek返回的结果。文章详细描述了从需求明确、项目结构设计到配置参数启动的步骤,并展示了核心代码片段如pom.xml、application.properties及主要Java类文件。尽管功能简单,但体现了AI在编程领域的高效应用,未来有望进一步优化上下文记忆等功能,提升开发体验与效率。
|
16天前
|
存储 人工智能 测试技术
Nacos托管LangChain应用Prompts和配置,助力你的AI助手快速进化
AI 应用开发中,总有一些让人头疼的问题:敏感信息(比如 API-KEY)怎么安全存储?模型参数需要频繁调整怎么办?Prompt 模板改来改去,每次都得重启服务,太麻烦了!别急,今天我们就来聊聊如何用 Nacos 解决这些问题。