当前位置: 首页 > news >正文

Spring AI(1)—— 基本使用

Spring AI 是一个用于 AI 工程的应用程序框架。 其目标是将 Spring 生态系统设计原则应用于 AI 领域。

Spring AI 提供以下功能:

  • 支持所有主要的 AI 模型提供商,例如 Anthropic、OpenAI、Microsoft、Amazon、Google 和 Ollama等。
  • 支持跨 AI 提供商对同步和流式处理 API 选项的可移植 API 支持。
  • 支持结构化输出 - AI 模型输出到 POJO 的映射。
  • 支持所有主要的向量数据库提供商,例如 Apache Cassandra、Azure Vector Search、Chroma、Milvus、MongoDB Atlas、Neo4j、Oracle、PostgreSQL/PGVector、PineCone、Qdrant、Redis 和 Weaviate。
  • 支持跨向量存储提供商的可移植 API,包括一种新颖的类似 SQL 的元数据过滤器 API。
  • 工具/函数调用 - 允许模型请求执行客户端工具和函数,从而根据需要访问必要的实时信息。
  • 可观察性。
  • 用于数据工程的文档注入 ETL 框架。
  • AI 模型评估 - 帮助评估生成的内容并防止幻觉响应的实用程序。
  • ChatClient API - 用于与 AI 聊天模型通信的 Fluent AP。
  • Advisors API - 封装重复的生成式 AI 模式,转换发送到和传出语言模型 (LLM) 的数据,并提供跨各种模型和用例的可移植性。
  • 支持 Chat Conversation Memory(聊天记忆) and Retrieval Augmented Generation (RAG)。
  • 针对所有 AI 模型和向量存储提供Spring Boot的自动配置和启动器。

下面,我们通过具体的案例来学习下Spring AI的使用。

导入jar

新建spring boot项目,使用spring ai时,spring boot使用3.0以上版本,jdk使用17及以上版本。

<dependencyManagement><dependencies><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-bom</artifactId><version>1.0.0-SNAPSHOT</version><type>pom</type><scope>import</scope></dependency></dependencies>
</dependencyManagement>

本例调用智谱大模型,还需要导入如下jar:

<!--     m7以后使用该pom   -->
<dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-starter-model-zhipuai</artifactId>
</dependency>

注意:本例使用spring ai的1.0.0-SNAPSHOT版本,如果使用1.0.0-M6及之前的版本,导入的智谱的artifactId为spring-ai-zhipuai-spring-boot-starter。

yml配置

spring:ai:zhipuai:api-key: XXXXXXXXXXXXXX # 智谱的apikeychat:options:model: glm-4-flashtemperature: 0.7

本例测试智谱大模型的调用,api-key使用读者自己申请的key。

配置类

package com.renr.springainew.common;import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.client.advisor.SimpleLoggerAdvisor;
import org.springframework.ai.zhipuai.ZhiPuAiChatModel;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class SpringAiConfig {// 创建ChatClient对象@Beanpublic ChatClient chatClient(ZhiPuAiChatModel chatModel) {return ChatClient.builder(chatModel).build();}}

调用模型的代码

package com.renr.springainew.controller;import jakarta.annotation.Resource;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.messages.UserMessage;
import org.springframework.ai.chat.model.ChatResponse;
import org.springframework.ai.chat.prompt.Prompt;
import org.springframework.ai.zhipuai.ZhiPuAiChatModel;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Flux;@RestController
public class ChatController {@Resourceprivate ZhiPuAiChatModel chatModel;@Resourceprivate ChatClient client;@GetMapping("/chat")public String chat(String message) {String answer = this.chatModel.call(message);System.out.println(answer);return "success";}@GetMapping("/chat2")public String chat2(String message) {String answer = this.client.prompt("你好").call().content();System.out.println(answer);return "success";}}

本例使用两种方式调用智谱的大模型:

  • 通过ZhipuAiChatModel对象
  • 通过ChatClient对象,ChatClient支持函数调用、聊天记忆、RAG等高级功能

打印请求和响应的日志

修改配置类

package com.renr.springainew.common;import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.client.advisor.SimpleLoggerAdvisor;
import org.springframework.ai.zhipuai.ZhiPuAiChatModel;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class SpringAiConfig {@Beanpublic SimpleLoggerAdvisor simpleLoggerAdvisor() {// 创建SimpleLoggerAdvisor实例,可以传递日志级别等配置参数(此处为默认配置)return new SimpleLoggerAdvisor();}@Beanpublic ChatClient chatClient(ZhiPuAiChatModel chatModel) {return ChatClient.builder(chatModel)// 设置系统消息.defaultSystem("你是一个java架构师")//配置日志相关的Advisor,需要开启日志级别以及配置 默认debug级别.defaultAdvisors(simpleLoggerAdvisor()).build();}//    @Bean
//    public ChatClient chatClient(ZhiPuAiChatModel chatModel) {
//        return ChatClient.builder(chatModel).build();
//    }}

Spring AI的Advisors API 提供了一种灵活而强大的方法来拦截、修改和增强 Spring AI的应用。 通过利用 Advisors API,开发人员可以创建更复杂、可重用和可维护的 AI 组件。本例使用SimpleLoggerAdvisor提供日志打印功能。

另外,在创建ChatClient对象时,我们还设置了系统消息。聊天大模型一般包含三种消息类型:系统消息、用户消息和Ai返回的消息。

yml中增加日志配置

logging:level:org.springframework.ai.chat.client.advisor: DEBUG

调用http://localhost:8080/chat2测试

请求数据日志如下:

request: ChatClientRequest[prompt=Prompt{messages=[SystemMessage{textContent='你是一个java架构师', messageType=SYSTEM, metadata={messageType=SYSTEM}}, UserMessage{content='你好', properties={messageType=USER}, messageType=USER}], modelOptions=org.springframework.ai.zhipuai.ZhiPuAiChatOptions@bd71d690}, context={}]

响应日志如下:

response: {"result" : {"metadata" : {"finishReason" : "STOP","contentFilters" : [ ],"empty" : true},"output" : {"messageType" : "ASSISTANT","metadata" : {"finishReason" : "STOP","role" : "ASSISTANT","id" : "202505072240346deb3a95109d44d9","messageType" : "ASSISTANT"},"toolCalls" : [ ],"media" : [ ],"text" : "作为一位虚拟的Java架构师,我很高兴能为您提供帮助。请问有什么具体的技术问题或者架构设计上的挑战需要我协助您解决吗?"}},"metadata" : {"id" : "202505072240346deb3a95109d44d9","model" : "glm-4-flash","rateLimit" : {"requestsLimit" : 0,"tokensLimit" : 0,"requestsReset" : 0.0,"tokensReset" : 0.0,"tokensRemaining" : 0,"requestsRemaining" : 0},"usage" : {"promptTokens" : 13,"completionTokens" : 33,"totalTokens" : 46,"nativeUsage" : {"completion_tokens" : 33,"prompt_tokens" : 13,"total_tokens" : 46}},"promptMetadata" : [ ],"empty" : false},"results" : [ {"metadata" : {"finishReason" : "STOP","contentFilters" : [ ],"empty" : true},"output" : {"messageType" : "ASSISTANT","metadata" : {"finishReason" : "STOP","role" : "ASSISTANT","id" : "202505072240346deb3a95109d44d9","messageType" : "ASSISTANT"},"toolCalls" : [ ],"media" : [ ],"text" : "作为一位虚拟的Java架构师,我很高兴能为您提供帮助。请问有什么具体的技术问题或者架构设计上的挑战需要我协助您解决吗?"}} ]
}

相关文章:

  • MVCC机制
  • base64与图片的转换和预览
  • Selenium Web自动化测试学习笔记(二)--八大元素定位
  • 追踪大型语言模型的思想(下)(来自针对Claude的分析)
  • Yii2.0 模型规则(rules)详解
  • ntdll!CsrServerApiRoutine函数--csrsrv!CsrCallServerFromServer什么时候被调用?
  • 2025.05.07-华为机考第二题200分
  • 动态规划之花园
  • 高并发内存池(一):项目简介+定长内存池的实现
  • C25-数组应用及练习
  • iTwin 数据报表(只是简单的原型不代表实现)
  • 解决 TimeoutError: [WinError 10060] 在 FramePack项目中连接 Hugging Face 超时的问题
  • ​​阿里云服务器:数字世界的“基因剪刀”与未来实验室​
  • 联想Horizon 2系列电脑 参数
  • C++面向对象 继承
  • python安装pyqt5失败
  • ESP32- 开发笔记- 软件开发 6 蓝牙协议栈 1
  • 【SpringCloud GateWay】Connection prematurely closed BEFORE response 报错分析与解决方案
  • [Android] WPS Office11.4.1.6政务定制版
  • windows使用bat脚本激活conda环境
  • 人民日报刊文:加快解放和发展新质战斗力
  • 市自规局公告收回新校区建设用地,宿迁学院:需变更建设主体
  • 105岁八路军老战士、抗美援朝老战士谭克煜逝世
  • 吴勇强、高颜已任南京市委常委
  • 太原一高中生指出博物馆多件藏品标识不当,馆方已邀请他和专家共同探讨
  • 8大类1000多支,中国红十字会已建成10万人规模救援队伍