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及以上版本。

XML 复制代码
<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:

XML 复制代码
<!--     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配置

javascript 复制代码
spring:
  ai:
    zhipuai:
      api-key: XXXXXXXXXXXXXX # 智谱的apikey
      chat:
        options:
          model: glm-4-flash
          temperature: 0.7

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

配置类

java 复制代码
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对象
    @Bean
    public ChatClient chatClient(ZhiPuAiChatModel chatModel) {
        return ChatClient.builder(chatModel).build();
    }

    
}

调用模型的代码

java 复制代码
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 {

    @Resource
    private ZhiPuAiChatModel chatModel;

    @Resource
    private 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等高级功能

打印请求和响应的日志

修改配置类

java 复制代码
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 {

    @Bean
    public SimpleLoggerAdvisor simpleLoggerAdvisor() {
        // 创建SimpleLoggerAdvisor实例,可以传递日志级别等配置参数(此处为默认配置)
        return new SimpleLoggerAdvisor();
    }

    @Bean
    public 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中增加日志配置

java 复制代码
logging:
  level:
    org.springframework.ai.chat.client.advisor: DEBUG

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

请求数据日志如下:

javascript 复制代码
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={}]

响应日志如下:

javascript 复制代码
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架构师,我很高兴能为您提供帮助。请问有什么具体的技术问题或者架构设计上的挑战需要我协助您解决吗?"
    }
  } ]
}
相关推荐
Moshow郑锴36 分钟前
sql-pipeline - 基于PostgreSQL的SQL健康检查与发布编排平台
java·sql
长三角智造观察1 小时前
中小制造ERP+MES选型避坑:对接集成VS原生一体化,深度对比TCO与落地痛点
大数据·人工智能·制造
一水鉴天7 小时前
映射、哈希表与哈斯图:计算机科学的三种基线 20261003(元宝)
开发语言·人工智能
198******126347 小时前
2026 企业 AI 办公产品选型指南:从场景匹配判断工具价值
人工智能
玫瑰互动GEO7 小时前
GEO优化学习九级模型:开发者从认知层切入
人工智能·ai·ai搜索·gem·生成式引擎优化·gem优化
海绵宝宝转agent7 小时前
learn-claude-code第1-5章开源学习笔记分享
人工智能·笔记·python·学习
每天都要写算法(努力版)8 小时前
【行业前沿报告】DAgger:让智能体在自己走到的状态上学习
人工智能·学习·机器学习
liron718 小时前
智能实体演化系统的统一性概念
人工智能·深度学习·神经网络
呆萌很8 小时前
常用骨干网络预训练输入尺寸
人工智能
Yolanda_20228 小时前
19.神经网络-最大池化的使用
人工智能·深度学习·神经网络