作者: 希铭
概述
随着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应用查看调用链信息。
3. 查看某条特定的轨迹,可以查看用药信息及其他关键信息,如大模型的响应id、模型名称、温度等:
4.点击右侧的“Events”,可以查看到模型调用过程的输入输出信息:
展望
到目前,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 阿里巴巴
[3] 在线聊天应用示例
[4] 如何获取API Key
[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应用