开源模型应用落地-工具使用篇-Spring AI-高阶用法(九)

一、前言

通过"开源模型应用落地-工具使用篇-Spring AI-Function Call(八)-CSDN博客"文章的学习,已经掌握了如何通过Spring AI集成OpenAI以及如何进行function call的调用,现在将进一步学习Spring AI更高阶的用法,如:传递历史上下文对话,调整模型参数等。


二、术语

2.1、Spring AI

是 Spring 生态系统的一个新项目,它简化了 Java 中 AI 应用程序的创建。它提供以下功能:

  • 支持所有主要模型提供商,例如 OpenAI、Microsoft、Amazon、Google 和 Huggingface。
  • 支持的模型类型包括"聊天"和"文本到图像",还有更多模型类型正在开发中。
  • 跨 AI 提供商的可移植 API,用于聊天和嵌入模型。
  • 支持同步和流 API 选项。
  • 支持下拉访问模型特定功能。
  • AI 模型输出到 POJO 的映射。

三、前置条件

3.1、JDK 17+

下载地址:Java Downloads | Oracle

3.2、创建Maven项目

SpringBoot版本为3.2.3

复制代码
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>3.2.3</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>

3.3、导入Maven依赖包

复制代码
<dependency>
	<groupId>org.projectlombok</groupId>
	<artifactId>lombok</artifactId>
	<optional>true</optional>
</dependency>

<dependency>
	<groupId>ch.qos.logback</groupId>
	<artifactId>logback-core</artifactId>
</dependency>

<dependency>
	<groupId>ch.qos.logback</groupId>
	<artifactId>logback-classic</artifactId>
</dependency>

<dependency>
	<groupId>cn.hutool</groupId>
	<artifactId>hutool-core</artifactId>
	<version>5.8.24</version>
</dependency>

<dependency>
	<groupId>org.springframework.ai</groupId>
	<artifactId>spring-ai-openai-spring-boot-starter</artifactId>
	<version>0.8.0</version>
</dependency>

3.4、 科学上网的软件


四、技术实现

4.1、新增配置

复制代码
spring:
  ai:
    openai:
      api-key: sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

PS:

  1. openai要替换自己的api-key
  2. 模型参数根据实际情况调整

4.2、历史上下文对话传递

# 方式一

使用 UserMessage 和 AssistantMessage 指定上下文

# 方式二

使用 ChatMessage 指定上下文

4.3、 调整模型参数

# 方式一

在配置文件中指定

# 方式二

在代码中指定


五、测试

在代码中指定的上下文:

对话次数

用户

AI

第一轮

你好

你好!很高兴能为你提供帮助。有什么问题可以问我吗?

第二轮

我家在广州,你呢?

我是一个人工智能助手,没有具体的居住地。不过我可以帮助你解答问题和提供信息。有什么我可以帮你的吗?

第三轮

我家有什么特产

浏览器返回的结果:

idea返回的结果:

结论:

AI能识别出我家在广州,并给出广州的特产


六、附带说明

6.1、更多的模型参数配置

OpenAI Chat :: Spring AI Reference

6.2、完整代码

复制代码
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.map.MapUtil;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.ai.chat.Generation;
import org.springframework.ai.chat.messages.*;
import org.springframework.ai.chat.prompt.ChatOptions;
import org.springframework.ai.chat.prompt.Prompt;
import org.springframework.ai.chat.prompt.SystemPromptTemplate;
import org.springframework.ai.openai.OpenAiChatClient;
import org.springframework.ai.openai.OpenAiChatOptions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;

import java.util.List;

@Slf4j
@RestController
@RequestMapping("/api")
public class OpenaiTestController {
    @Autowired
    private OpenAiChatClient openAiChatClient;


    @RequestMapping("/history")
    public SseEmitter history(HttpServletResponse response) {
        response.setContentType("text/event-stream");
        response.setCharacterEncoding("UTF-8");
        SseEmitter emitter = new SseEmitter();

        String systemPrompt = "{prompt}";
        SystemPromptTemplate systemPromptTemplate = new SystemPromptTemplate(systemPrompt);

        String userPrompt = "我家有什么特产?";
        Message userMessage = new UserMessage(userPrompt);

        Message systemMessage = systemPromptTemplate.createMessage(MapUtil.of("prompt", "you are a helpful AI assistant"));

        UserMessage userChatMessage1 = new UserMessage("你好");
        AssistantMessage assistantChatMessage1 = new AssistantMessage("你好!很高兴能为你提供帮助。有什么问题可以问我吗?");

        UserMessage userChatMessage2 = new UserMessage("我家在广州,你呢?");
        AssistantMessage assistantChatMessage2 = new AssistantMessage("我是一个人工智能助手,没有具体的居住地。不过我可以帮助你解答问题和提供信息。有什么我可以帮你的吗?");

//        ChatMessage userChatMessage2 = new ChatMessage(MessageType.USER, "你好");
//        ChatMessage assistantChatMessage2 = new ChatMessage(MessageType.ASSISTANT, "你好!很高兴能为你提供帮助。有什么问题可以问我吗?");
//
//        ChatMessage userChatMessage2 = new ChatMessage(MessageType.USER, "我家在广州,你呢?");
//        ChatMessage assistantChatMessage2 = new ChatMessage(MessageType.ASSISTANT, "我是一个人工智能助手,没有具体的居住地。不过我可以帮助你解答问题和提供信息。有什么我可以帮你的吗?");

        OpenAiChatOptions openAiChatOptions = OpenAiChatOptions.builder()
                .withModel("gpt-3.5-turbo")
                .withTemperature(0.7f)
                .withMaxTokens(4096)
                .withN(1)
                .withTopP(0.9f)
                .build();

        Prompt prompt = new Prompt(List.of(userChatMessage1, assistantChatMessage1, userChatMessage2, assistantChatMessage2, userMessage, systemMessage), openAiChatOptions);

        log.info(prompt.toString());

        openAiChatClient.stream(prompt).subscribe(x -> {
            try {
                log.info("response: {}", x);
                List<Generation> generations = x.getResults();
                if (CollUtil.isNotEmpty(generations)) {
                    for (Generation generation : generations) {
                        AssistantMessage assistantMessage = generation.getOutput();
                        String content = assistantMessage.getContent();
                        if (StringUtils.isNotEmpty(content)) {
                            emitter.send(content);
                        } else {
                            if (StringUtils.equals(content, "null"))
                                emitter.complete(); // Complete the SSE connection
                        }
                    }
                }


            } catch (Exception e) {
                emitter.complete();
                log.error("流式返回结果异常", e);
            }
        });


        return emitter;
    }


}
相关推荐
数字融合7 分钟前
透明化视频孪生虚实映射一体化融合技术
人工智能·python·数码相机
杨杨杨大侠25 分钟前
从一次请求讲透 A2A:Agent 怎么选、怎么协作、记忆放在哪里
人工智能·agent
后端小肥肠39 分钟前
做公众号漫画还在纯手搓?这套工具从选题到复刻任意热门漫画一键搞定
人工智能·aigc·agent
xier_ran40 分钟前
【infra之路】AI 编译器学习笔记(二):重拾 C++——移动语义与 LLVM 风格的类型转换
人工智能·笔记·学习
paopaokaka_luck42 分钟前
滑雪场管理系统(AI智能助手流式对话,ECharts 运营数据分析、教练、雪具与场地一体化预约,钱包支付退款、订单核销与服务评价)
java·人工智能·spring boot·网络协议·数据分析·echarts
陈嘿萌1 小时前
ICML 2026|浙大 1D-Fusion:用 Tokenizer 将图像“压”成一维 Token,重构融合表示
图像处理·人工智能·计算机视觉·图像融合·计算机科学与技术·学术研究与理论基础·顶级期刊与会议
看着博客敲代码1 小时前
WorkBuddy 接上 Kali MCP 做自动化渗透:信息收集到初步验证的落地记录
linux·人工智能·安全·网络安全·自动化
szxinmai主板定制专家1 小时前
储能EMS + 协调控制器实战:RK3568/3576/3588+FPGA+AI 故障录波与诊断
人工智能·深度学习·机器学习·fpga开发·rk3588·rk3576·协调控制器
考虑考虑1 小时前
@JsonInclude注解使用
spring boot·后端·spring
俊哥V1 小时前
每日 AI 研究简报 · 2026-10-12
人工智能·ai