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架构师,我很高兴能为您提供帮助。请问有什么具体的技术问题或者架构设计上的挑战需要我协助您解决吗?"
    }
  } ]
}
相关推荐
AI黑客4 分钟前
恶心的win11更新DIY 设置win11更新为100年
人工智能·游戏·微信·everything·火绒安全
冼紫菜5 分钟前
Spring 项目无法连接 MySQL:Nacos 配置误区排查与解决
java·spring boot·后端·mysql·docker·springcloud
Data-Miner8 分钟前
满分PPT | 基于数据运营的新型智慧城市实践与思考智慧城市数据中台解决方案智能建筑与智慧城市建设方案
人工智能·智慧城市
LitchiCheng18 分钟前
复刻低成本机械臂 SO-ARM100 标定篇
人工智能·机器人
巷95528 分钟前
常见的卷积神经网络列举
人工智能·神经网络·cnn
诸葛小猿32 分钟前
Pdf转Word案例(java)
java·pdf·word·格式转换
yuren_xia36 分钟前
Spring MVC中跨域问题处理
java·spring·mvc
每天都要写算法(努力版)42 分钟前
【神经网络与深度学习】VAE 在解码前进行重参数化
人工智能·深度学习·神经网络
计算机毕设定制辅导-无忧学长1 小时前
ActiveMQ 源码剖析:消息存储与通信协议实现(二)
java·activemq·java-activemq
一个憨憨coder1 小时前
Spring 如何解决循环依赖问题?
java·后端·spring