Spring AI 聊天模型

提示:如果不能访问 OpenAI,请点击 AiCode API 注册账号,通过代理访问。  

聊天模型(Chat Model)是一种基于人工智能(AI)技术的对话式交互系统,核心能力是理解人类自然语言,并以符合语境、逻辑和人类沟通习惯的方式生成回应,实现 “类人化” 的对话交互。它本质上是自然语言处理(NLP)与深度学习技术融合的产物,也是大语言模型(LLM,如 GPT、文心一言、Claude 等)在 “对话场景” 下的典型应用形态。

以下是一个使用 Spring AI 集成 OpenAI 聊天模型的完整示例,包含配置、实现及详细说明,帮助你快速理解 Spring AI 中聊天模型的使用方式。详细步骤如下:

依赖配置

创建 pom.xml 文件,内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" 
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>3.5.0</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.hxstrive.springai</groupId>
	<artifactId>springai_openai</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>springai_openai</name>
	<description>springai_openai</description>

	<properties>
		<java.version>17</java.version>
		<spring-ai.version>1.0.0</spring-ai.version>
	</properties>

	<dependencies>
		<!-- 会话记忆 -->
		<dependency>
			<groupId>org.springframework.ai</groupId>
			<artifactId>spring-ai-autoconfigure-model-chat-memory</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.ai</groupId>
			<artifactId>spring-ai-autoconfigure-model-chat-memory-repository-jdbc</artifactId>
			<version>1.0.0</version>
		</dependency>
		<!-- Spring Data JDBC -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-jdbc</artifactId>
		</dependency>
		<!-- mysql 驱动 -->
		<dependency>
			<groupId>com.mysql</groupId>
			<artifactId>mysql-connector-j</artifactId>
		</dependency>

		<!-- redis -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-redis</artifactId>
		</dependency>
		<!-- spring ai redis 向量存储依赖 -->
		<dependency>
			<groupId>org.springframework.ai</groupId>
			<artifactId>spring-ai-starter-vector-store-redis</artifactId>
			<version>1.0.0</version>
		</dependency>

		<!-- 引入 openai 依赖 -->
		<dependency>
			<groupId>org.springframework.ai</groupId>
			<artifactId>spring-ai-starter-model-openai</artifactId>
			<version>1.0.0</version>
		</dependency>
		<dependency>
			<groupId>org.springframework.ai</groupId>
			<artifactId>spring-ai-openai</artifactId>
			<version>1.0.0</version>
		</dependency>

		<!-- 引入其他依赖 -->
		<dependency>
			<groupId>org.springframework.ai</groupId>
			<artifactId>spring-ai-commons</artifactId>
			<version>1.0.0</version>
		</dependency>
		<dependency>
			<groupId>org.springframework.ai</groupId>
			<artifactId>spring-ai-template-st</artifactId>
			<version>1.0.0</version>
		</dependency>
		<dependency>
			<groupId>org.springframework.ai</groupId>
			<artifactId>spring-ai-model</artifactId>
			<version>1.0.0</version>
		</dependency>
		<dependency>
			<groupId>org.springframework.ai</groupId>
			<artifactId>spring-ai-vector-store</artifactId>
			<version>1.0.0</version>
		</dependency>
		<dependency>
			<groupId>org.springframework.ai</groupId>
			<artifactId>spring-ai-rag</artifactId>
			<version>1.0.0</version>
		</dependency>
		<dependency>
			<groupId>org.springframework.ai</groupId>
			<artifactId>spring-ai-advisors-vector-store</artifactId>
			<version>1.0.0</version>
		</dependency>
		<dependency>
			<groupId>org.springframework.ai</groupId>
			<artifactId>spring-ai-retry</artifactId>
			<version>1.0.0</version>
		</dependency>
		<dependency>
			<groupId>org.springframework.ai</groupId>
			<artifactId>spring-ai-client-chat</artifactId>
			<version>1.0.0</version>
		</dependency>
		<dependency>
			<groupId>org.springframework.ai</groupId>
			<artifactId>spring-ai-mcp</artifactId>
			<version>1.0.0</version>
		</dependency>
		<dependency>
			<groupId>org.springframework.ai</groupId>
			<artifactId>spring-ai-jsoup-document-reader</artifactId>
			<version>1.0.0</version>
		</dependency>
		<dependency>
			<groupId>org.springframework.ai</groupId>
			<artifactId>spring-ai-markdown-document-reader</artifactId>
			<version>1.0.0</version>
		</dependency>
		<dependency>
			<groupId>org.springframework.ai</groupId>
			<artifactId>spring-ai-pdf-document-reader</artifactId>
			<version>1.0.0</version>
		</dependency>
		<dependency>
			<groupId>org.springframework.ai</groupId>
			<artifactId>spring-ai-tika-document-reader</artifactId>
			<version>1.0.0</version>
		</dependency>
		<dependency>
			<groupId>org.springframework.ai</groupId>
			<artifactId>spring-ai-spring-cloud-bindings</artifactId>
			<version>1.0.0</version>
		</dependency>


		<!-- spring boot web 依赖 -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-webflux</artifactId>
		</dependency>

		<!-- fastjson2 -->
		<dependency>
			<groupId>com.alibaba.fastjson2</groupId>
			<artifactId>fastjson2</artifactId>
			<version>2.0.34</version>
		</dependency>

		<!-- spring boot 辅助开发依赖 -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-devtools</artifactId>
			<scope>runtime</scope>
			<optional>true</optional>
		</dependency>
		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
			<version>1.18.38</version>
			<optional>true</optional>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
			<version>1.18.38</version>
		</dependency>
	</dependencies>

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

	<repositories>
		<repository>
			<id>spring-milestones</id>
			<url>https://repo.spring.io/milestone</url>
		</repository>
	</repositories>

	<build>
		<plugins>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-compiler-plugin</artifactId>
				<configuration>
					<annotationProcessorPaths>
						<path>
							<groupId>org.projectlombok</groupId>
							<artifactId>lombok</artifactId>
						</path>
					</annotationProcessorPaths>
				</configuration>
			</plugin>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
				<configuration>
					<excludes>
						<exclude>
							<groupId>org.projectlombok</groupId>
							<artifactId>lombok</artifactId>
						</exclude>
					</excludes>
				</configuration>
			</plugin>
		</plugins>
	</build>

</project>

上面是一个很全的 Spring AI 项目依赖,其中常用依赖:

  • spring-ai-commons 是 Spring AI 的公共基础组件,包含通用工具类、抽象接口、异常处理等,为其他组件提供基础支持,保证各模块间的兼容性。

  • spring-ai-model 是 AI 模型的核心抽象组件,定义了模型调用的通用接口(如聊天模型、嵌入模型等),统一不同 AI 模型的访问方式。

  • spring-ai-openai 是 OpenAI 服务的实现组件,提供与 OpenAI API 交互的具体逻辑,包括模型调用、请求处理、响应解析等,供 starter 模块使用。

  • spring-ai-starter-openai 是 OpenAI 的 starter 组件,提供自动配置和依赖管理,简化 OpenAI 模型集成,引入后可快速使用 OpenAI 的大语言模型服务。

  • spring-ai-vector-store 是向量存储组件,提供向量数据的存储和检索能力,支持将文本等内容转换为向量后存储,常用于检索增强生成(RAG)场景。

  • spring-ai-rag 是检索增强生成(RAG)组件,整合检索和生成能力,能从知识库中检索相关信息并结合大语言模型生成更精准的回答。

  • spring-ai-retry 是重试机制组件,为 AI 模型调用等操作提供重试策略,处理网络波动、服务暂时不可用等场景,提高系统稳定性。

上面依赖包含了很多聊天模型用不到的依赖,是为了方便演示 Spring AI 功能。如果不需要这些多余的依赖可自行删除。

模型配置

配置文件采用 YAML 格式,在项目的 resources 目录中创建 application.yml 文件,内容如下:

spring:
  application:
    name: springai_demo1
  # 数据库配置
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/chat_db
    username: root
    password: aaaaaa
  # Redis 配置
  data:
    redis:
      host: localhost
      port: 6379
      password:
      timeout: 5000
      database: 0
      jedis:
        pool:
          enabled: true  # 显式启用连接池
          max-active: 16  # 最大活跃连接数(根据并发量调整,建议为 CPU核心数 * 2)
          max-wait: 2000  # 最大等待时间(添加时间单位,避免默认毫秒被误读)
          max-idle: 8  # 最大空闲连接(保持与 max-active 合理比例,避免资源浪费)
          min-idle: 4  # 最小空闲连接(保留核心连接,减少重建开销)
  # AI配置
  ai:
    # openai相关配置
    openai:
      # 基础地址
      # 访问 https://api.xty.app/register?aff=pO2q 地址注册账号即可访问 OpenAI 了
      base-url: https://api.xty.app
      # AI KEY
      # 高级接口key
      api-key: sk-vHTHX8D3wNZBfRya831***************
      # 聊天模型配置
      chat:
        options:
          model: gpt-4-turbo # gpt-3.5-turbo
      # 图片模型配置
      image:
        options:
          # 需要高级接口
          model: dall-e-3
    chat:
      memory:
        # 会话历史持久化
        repository:
          jdbc:
            # 启动时不自动执行初始化SQL脚本,手动创建数据表
            initialize-schema: never
      client:
        # true 开启,自动注入 ChatClient,false 关闭,需要手动创建 ChatClient
        enabled: true

# 日志配置
logging:
  charset:
    console: UTF-8
  level:
    root: info
    org.springframework.ai: debug

上述配置中,包含了数据库(存储聊天历史)、redis(存储向量)、模型和日志配置。

聊天服务

创建一个名为 ChatService 的服务类,通过调用 ChatClient API 实现具体聊天逻辑,代码如下:

package com.hxstrive.springai.springai_openai.example.chat_model;

import jakarta.annotation.Resource;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.messages.UserMessage;
import org.springframework.ai.chat.prompt.Prompt;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class ChatService {

    // 注入ChatClient.Builder,用于创建ChatClient实例
    @Resource
    private ChatClient.Builder builder;

    /**
     * 发送单轮消息并获取响应
     * @param message 用户输入的消息
     * @return 模型生成的响应文本
     */
    public String sendMessage(String message) {
        ChatClient chatClient = builder.build();
        
        // 1. 创建用户消息(UserMessage)
        UserMessage userMessage = new UserMessage(message);
        
        // 2. 构建 Prompt(包含消息内容)
        Prompt prompt = new Prompt(userMessage);
        
        // 3. 调用聊天客户端发送请求并获取响应
        ChatClient.CallResponseSpec response = 
            chatClient.prompt(prompt).messages(userMessage).call();
        
        // 4. 提取响应中的文本内容
        return response.content();
    }

    /**
     * 多轮对话示例(包含上下文)
     * @param message 当前用户消息
     * @param history 历史对话记录(格式:"用户: xxx\nAI: xxx")
     * @return 模型生成的响应文本
     */
    public String multiTurnChat(String message, String history) {
        ChatClient chatClient = builder.build();
        // 1. 构建包含历史上下文的提示词
        String fullPrompt = "历史对话:\n" + history + 
            "\n当前用户问: " + message + "\n请结合历史对话回答,保持连贯。";
        
        // 2. 发送请求
        return chatClient.prompt(fullPrompt).call().content();
    }
}

聊天 Controller

创建一个名为 ChatController 的控制器,暴露两个端点 /api/chat/single 和 /api/chat/multi 实现单轮对话和多轮对话,代码如下:

package com.hxstrive.springai.springai_openai.example.chat_model;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/api/chat")
public class ChatController {

    @Autowired
    private ChatService chatService;

    /**
     * 单轮对话接口
     * 示例请求: GET /api/chat/single?message=你好,介绍一下AI
     */
    @GetMapping("/single")
    public String singleChat(@RequestParam String message) {
        return chatService.sendMessage(message);
    }

    /**
     * 多轮对话接口
     * 示例请求: POST /api/chat/multi
     * 请求体: {"message": "它有哪些核心功能?", "history": "用户: 你好,介绍一下AI\nAI: Spring AI是..."}
     */
    @PostMapping("/multi")
    public String multiChat(@RequestBody MultiTurnRequest request) {
        return chatService.multiTurnChat(request.getMessage(), request.getHistory());
    }

    // 内部静态类,用于接收多轮对话请求参数
    public static class MultiTurnRequest {
        private String message;
        private String history;

        // getter 和 setter
        public String getMessage() { return message; }
        public void setMessage(String message) { this.message = message; }
        public String getHistory() { return history; }
        public void setHistory(String history) { this.history = history; }
    }
}

启动类

创建一个普通的 Spring Boot 启动类,如下:

package com.hxstrive.springai.springai_openai.example.chat_model;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RestController;

/**
 * 启动类
 * @author hxstrive
 */
@RestController
@SpringBootApplication
public class SpringAiApplication {

	public static void main(String[] args) {
		SpringApplication.run(SpringAiApplication.class, args);
	}

}

运行效果

如果应用启动正常,则可以打开浏览器,访问 /api/chat/single/api/chat/multi 地址,效果如下图:

Spring AI 聊天模型

Spring AI 聊天模型

通过这个示例,你可以快速上手 Spring AI 的聊天模型功能,后续可结合 RAG 模块实现 “检索增强生成”,让模型基于外部知识生成更精准的回答。

 

提示:如果不能访问 OpenAI,请点击 AiCode API 注册账号,通过代理访问。  

说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
其他应用
公众号