当前位置:   article > 正文

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

springai使用

一、前言

    通过“开源模型应用落地-工具使用篇-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

  1. <parent>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-parent</artifactId>
  4. <version>3.2.3</version>
  5. <relativePath/> <!-- lookup parent from repository -->
  6. </parent>

3.3、导入Maven依赖包

  1. <dependency>
  2. <groupId>org.projectlombok</groupId>
  3. <artifactId>lombok</artifactId>
  4. <optional>true</optional>
  5. </dependency>
  6. <dependency>
  7. <groupId>ch.qos.logback</groupId>
  8. <artifactId>logback-core</artifactId>
  9. </dependency>
  10. <dependency>
  11. <groupId>ch.qos.logback</groupId>
  12. <artifactId>logback-classic</artifactId>
  13. </dependency>
  14. <dependency>
  15. <groupId>cn.hutool</groupId>
  16. <artifactId>hutool-core</artifactId>
  17. <version>5.8.24</version>
  18. </dependency>
  19. <dependency>
  20. <groupId>org.springframework.ai</groupId>
  21. <artifactId>spring-ai-openai-spring-boot-starter</artifactId>
  22. <version>0.8.0</version>
  23. </dependency>

3.4、 科学上网的软件


四、技术实现

4.1、新增配置

  1. spring:
  2. ai:
  3. openai:
  4. 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、完整代码

  1. import cn.hutool.core.collection.CollUtil;
  2. import cn.hutool.core.map.MapUtil;
  3. import jakarta.servlet.http.HttpServletResponse;
  4. import lombok.extern.slf4j.Slf4j;
  5. import org.apache.commons.lang3.StringUtils;
  6. import org.springframework.ai.chat.Generation;
  7. import org.springframework.ai.chat.messages.*;
  8. import org.springframework.ai.chat.prompt.ChatOptions;
  9. import org.springframework.ai.chat.prompt.Prompt;
  10. import org.springframework.ai.chat.prompt.SystemPromptTemplate;
  11. import org.springframework.ai.openai.OpenAiChatClient;
  12. import org.springframework.ai.openai.OpenAiChatOptions;
  13. import org.springframework.beans.factory.annotation.Autowired;
  14. import org.springframework.web.bind.annotation.RequestMapping;
  15. import org.springframework.web.bind.annotation.RestController;
  16. import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
  17. import java.util.List;
  18. @Slf4j
  19. @RestController
  20. @RequestMapping("/api")
  21. public class OpenaiTestController {
  22. @Autowired
  23. private OpenAiChatClient openAiChatClient;
  24. @RequestMapping("/history")
  25. public SseEmitter history(HttpServletResponse response) {
  26. response.setContentType("text/event-stream");
  27. response.setCharacterEncoding("UTF-8");
  28. SseEmitter emitter = new SseEmitter();
  29. String systemPrompt = "{prompt}";
  30. SystemPromptTemplate systemPromptTemplate = new SystemPromptTemplate(systemPrompt);
  31. String userPrompt = "我家有什么特产?";
  32. Message userMessage = new UserMessage(userPrompt);
  33. Message systemMessage = systemPromptTemplate.createMessage(MapUtil.of("prompt", "you are a helpful AI assistant"));
  34. UserMessage userChatMessage1 = new UserMessage("你好");
  35. AssistantMessage assistantChatMessage1 = new AssistantMessage("你好!很高兴能为你提供帮助。有什么问题可以问我吗?");
  36. UserMessage userChatMessage2 = new UserMessage("我家在广州,你呢?");
  37. AssistantMessage assistantChatMessage2 = new AssistantMessage("我是一个人工智能助手,没有具体的居住地。不过我可以帮助你解答问题和提供信息。有什么我可以帮你的吗?");
  38. // ChatMessage userChatMessage2 = new ChatMessage(MessageType.USER, "你好");
  39. // ChatMessage assistantChatMessage2 = new ChatMessage(MessageType.ASSISTANT, "你好!很高兴能为你提供帮助。有什么问题可以问我吗?");
  40. //
  41. // ChatMessage userChatMessage2 = new ChatMessage(MessageType.USER, "我家在广州,你呢?");
  42. // ChatMessage assistantChatMessage2 = new ChatMessage(MessageType.ASSISTANT, "我是一个人工智能助手,没有具体的居住地。不过我可以帮助你解答问题和提供信息。有什么我可以帮你的吗?");
  43. OpenAiChatOptions openAiChatOptions = OpenAiChatOptions.builder()
  44. .withModel("gpt-3.5-turbo")
  45. .withTemperature(0.7f)
  46. .withMaxTokens(4096)
  47. .withN(1)
  48. .withTopP(0.9f)
  49. .build();
  50. Prompt prompt = new Prompt(List.of(userChatMessage1, assistantChatMessage1, userChatMessage2, assistantChatMessage2, userMessage, systemMessage), openAiChatOptions);
  51. log.info(prompt.toString());
  52. openAiChatClient.stream(prompt).subscribe(x -> {
  53. try {
  54. log.info("response: {}", x);
  55. List<Generation> generations = x.getResults();
  56. if (CollUtil.isNotEmpty(generations)) {
  57. for (Generation generation : generations) {
  58. AssistantMessage assistantMessage = generation.getOutput();
  59. String content = assistantMessage.getContent();
  60. if (StringUtils.isNotEmpty(content)) {
  61. emitter.send(content);
  62. } else {
  63. if (StringUtils.equals(content, "null"))
  64. emitter.complete(); // Complete the SSE connection
  65. }
  66. }
  67. }
  68. } catch (Exception e) {
  69. emitter.complete();
  70. log.error("流式返回结果异常", e);
  71. }
  72. });
  73. return emitter;
  74. }
  75. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/481915
推荐阅读
相关标签
  

闽ICP备14008679号