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

这篇具有很好参考价值的文章主要介绍了开源模型应用落地-工具使用篇-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

    org.springframework.ai,开源大语言模型-新手试炼,深度学习,人工智能,spring

  

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 指定上下文

org.springframework.ai,开源大语言模型-新手试炼,深度学习,人工智能,spring

  # 方式二

    使用 ChatMessage 指定上下文

org.springframework.ai,开源大语言模型-新手试炼,深度学习,人工智能,spring

 4.3、 调整模型参数

  # 方式一

  在配置文件中指定

  org.springframework.ai,开源大语言模型-新手试炼,深度学习,人工智能,spring

  # 方式二

  在代码中指定

org.springframework.ai,开源大语言模型-新手试炼,深度学习,人工智能,spring


五、测试

在代码中指定的上下文:

对话次数 用户 AI
第一轮
你好
你好!很高兴能为你提供帮助。有什么问题可以问我吗?
第二轮
我家在广州,你呢?
我是一个人工智能助手,没有具体的居住地。不过我可以帮助你解答问题和提供信息。有什么我可以帮你的吗?
第三轮 我家有什么特产

浏览器返回的结果:

org.springframework.ai,开源大语言模型-新手试炼,深度学习,人工智能,spring

idea返回的结果:

org.springframework.ai,开源大语言模型-新手试炼,深度学习,人工智能,spring

  结论:

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


六、附带说明

6.1、更多的模型参数配置

OpenAI Chat :: Spring AI Reference

org.springframework.ai,开源大语言模型-新手试炼,深度学习,人工智能,spring

org.springframework.ai,开源大语言模型-新手试炼,深度学习,人工智能,spring

org.springframework.ai,开源大语言模型-新手试炼,深度学习,人工智能,spring

6.2、完整代码文章来源地址https://www.toymoban.com/news/detail-838770.html

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


}

到了这里,关于开源模型应用落地-工具使用篇-Spring AI-高阶用法(九)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 开源模型应用落地-工具使用篇-向量数据库(三)

    一、前言     通过学习\\\"开源模型应用落地\\\"系列文章,我们成功地建立了一个完整可实施的AI交付流程。现在,我们要引入向量数据库,作为我们AI服务的二级缓存。本文将详细介绍如何使用Milvus Lite来为我们的AI服务部署一个前置缓存。 二、术语 2.1、向量数据库     向量数

    2024年02月19日
    浏览(55)
  • rk3588使用npu进行模型转换和推理,加速AI应用落地

    本文完成于2022-07-02 20:21:55 。博主在瑞芯微RK3588的开发板上跑了deepsort跟踪算法,从IP相机中的server拉取rtsp视频流,但是fps只有1.2,和放PPT一样卡顿,无法投入实际应用。本来想使用tensorrt进行加速推理,但是前提需要cuda,rk的板子上都是Arm的手机gpu,没有Nvidia的cuda,所以这条

    2023年04月12日
    浏览(43)
  • 开源模型应用落地-总述

            在当今社会,实际应用比纯粹理解原理和概念更为重要。即使您对某个领域的原理和概念有深入的理解,但如果无法将其应用于实际场景并受制于各种客观条件,那么与其一开始就过于深入,不如先从基础开始,实际操作后再逐步深入探索。         在这种实践至上

    2024年03月14日
    浏览(52)
  • 开源模型应用落地-业务整合篇(一)

    一、前言     经过对qwen-7b-chat的部署以及与vllm的推理加速的整合,我们成功构建了一套高性能、高可靠、高安全的AI服务能力。现在,我们将着手整合具体的业务场景,以实现完整可落地的功能交付。     作为上游部门,通常会采用最常用的方式来接入下游服务。为了调用

    2024年01月20日
    浏览(46)
  • 开源模型应用落地-业务优化篇(六)

    一、前言     经过线程池优化、请求排队和服务实例水平扩容等措施,整个AI服务链路的性能得到了显著地提升。但是,作为追求卓越的大家,绝不会止步于此。我们的目标是在降低成本和提高效率方面不断努力,追求最佳结果。如果你们在实施AI项目方面有经验,那一定会

    2024年02月22日
    浏览(46)
  • 开源模型应用落地-业务整合篇(四)

    一、前言     通过学习第三篇文章,我们已经成功地建立了IM与AI服务之间的数据链路。然而,我们目前面临一个紧迫需要解决的安全性问题,即非法用户可能会通过获取WebSocket的连接信息,顺利地连接到我们的服务。这不仅占用了大量的无效连接和资源,还对业务数据带来

    2024年01月24日
    浏览(42)
  • 开源模型应用落地-qwen模型小试-入门篇(三)

    一、前言     相信您已经学会了如何在Windows环境下以最低成本、无需GPU的情况下运行qwen大模型。现在,让我们进一步探索如何在Linux环境下,并且拥有GPU的情况下运行qwen大模型,以提升性能和效率。 二、术语     2.1. CentOS         CentOS是一种基于Linux的自由开源操作系统。

    2024年01月21日
    浏览(52)
  • 开源模型应用落地-baichuan2模型小试-入门篇(三)

            相信您已经学会了如何在Windows环境下以最低成本、无需GPU的情况下运行baichuan2大模型。现在,让我们进一步探索如何在Linux环境下,并且拥有GPU的情况下运行baichuan2大模型,以提升性能和效率。     CentOS是一种基于Linux的自由开源操作系统。它是从Red Hat Enterprise Li

    2024年04月17日
    浏览(52)
  • 开源模型应用落地-qwen2模型小试-入门篇(六)

        经过前五篇“qwen模型小试”文章的学习,我们已经熟练掌握qwen大模型的使用。然而,就在前几天开源社区又发布了qwen1.5版本,它是qwen2模型的测试版本。在基于transformers的使用方式上有较大的调整,现在,我们赶紧跟上脚步,去体验一下新版本模型的推理质量。    

    2024年03月17日
    浏览(70)
  • 开源模型应用落地-chatglm3-6b模型小试-入门篇(一)

         刚开始接触AI时,您可能会感到困惑,因为面对众多开源模型的选择,不知道应该选择哪个模型,也不知道如何调用最基本的模型。但是不用担心,我将陪伴您一起逐步入门,解决这些问题。      在信息时代,我们可以轻松地通过互联网获取大量的理论知识和概念。然

    2024年04月10日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包