数据人与超自然意识 发表于 2024-9-10 18:05:32

开源模型应用落地-工具使用篇-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
    https://i-blog.csdnimg.cn/blog_migrate/cdaa3c52bf6bf6ef0f51c729131d7021.png​
  
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:

[*]  openai要更换自己的api-key
[*]  模型参数根据实际环境调解
 4.2、汗青上下文对话转达

  # 方式一
  使用 UserMessage 和 AssistantMessage 指定上下文
https://i-blog.csdnimg.cn/blog_migrate/23d85d8ae928783381278ba6716c5491.png

  # 方式二
    使用 ChatMessage 指定上下文
https://i-blog.csdnimg.cn/blog_migrate/80ec0bd23365f0b70e55180649549019.png
 4.3、 调解模型参数

  # 方式一
  在配置文件中指定
  https://i-blog.csdnimg.cn/blog_migrate/37b52367847d4953384a1675f2e4a966.png
  # 方式二
  在代码中指定
https://i-blog.csdnimg.cn/blog_migrate/0cba2b1163c362bb24d2861d6e1454ad.png
五、测试

在代码中指定的上下文:
对话次数用户AI第一轮 你好 你好!很高兴能为你提供帮助。有什么问题可以问我吗? 第二轮 我家在广州,你呢? 我是一个人工智能助手,没有具体的居住地。不过我可以帮助你解答问题和提供信息。有什么我可以帮你的吗? 第三轮我家有什么特产 浏览器返回的结果:
https://i-blog.csdnimg.cn/blog_migrate/c3ffb78f6cd1ecc3fb62f117640433b1.png
idea返回的结果:
https://i-blog.csdnimg.cn/blog_migrate/9e7f4d16e2c3e8b294d5d4406bc665ef.png
  结论:
  AI能识别出我家在广州,并给出广州的特产
六、附带说明

6.1、更多的模型参数配置
OpenAI Chat :: Spring AI Reference
https://i-blog.csdnimg.cn/blog_migrate/ab4fdeebb557902f4ab4fe31ace0c4a6.png
https://i-blog.csdnimg.cn/blog_migrate/ac291d2f75c3a325208ae99fc37047d3.png
​https://i-blog.csdnimg.cn/blog_migrate/dcbd98d3a092862fe84b883911ba2597.png

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;    }}

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 开源模型应用落地-工具使用篇-Spring AI-高阶用法(九)