通过“开源模型应用落地-工具使用篇-Spring AI-Function Call(八)-CSDN博客”文章的学习,已经掌握了如何通过Spring AI集成OpenAI以及如何进行function call的调用,现在将进一步学习Spring AI更高阶的用法,如:传递历史上下文对话,调整模型参数等。
是 Spring 生态系统的一个新项目,它简化了 Java 中 AI 应用程序的创建。它提供以下功能:
下载地址:Java Downloads | Oracle
SpringBoot版本为3.2.3
org.springframework.boot spring-boot-starter-parent3.2.3
org.projectlombok lomboktrue ch.qos.logback logback-corech.qos.logback logback-classiccn.hutool hutool-core5.8.24 org.springframework.ai spring-ai-openai-spring-boot-starter0.8.0
spring: ai: openai: api-key: sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
PS:
# 方式一
使用 UserMessage 和 AssistantMessage 指定上下文
# 方式二
使用 ChatMessage 指定上下文
# 方式一
在配置文件中指定
# 方式二
在代码中指定
在代码中指定的上下文:
对话次数 | 用户 | 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); Listgenerations = 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; } }