首页 > 其他分享 >Springboot封装通用AI模块实现平台智能化(封装和使用AI详细教程)

Springboot封装通用AI模块实现平台智能化(封装和使用AI详细教程)

时间:2024-12-04 11:57:46浏览次数:7  
标签:userMessage 封装 String AI param temperature return Springboot

目录

国内支持SDK调用的优秀开源AI平台

导入依赖

获取API key(注意保密)

测试Demo

封装通用AI模块

application.yml配置API key

定义AI配置类

封装通用的AI请求模块

使用AI赋能项目

设计Prompt的常用技巧

技巧一  定义 System Prompt

技巧二  让 AI 进行角色扮演

技巧三  提供具体的细节要求

技巧四  使用分隔符标示不同的输入部分

技巧五  思维链提示

技巧六  少样本学习

项目中调用AI(实战)

定义Prompt常量

业务逻辑中调用AI

调用AI,使用定义好的Prompt生成题目

完整代码


国内支持SDK调用的优秀开源AI平台

智谱AI(ZhipuAI):智谱AI是一家专注于大模型技术的公司,由清华大学计算机系知识工程实验室技术成果转化而来。智谱AI提供了包括对话模型、视觉模型、代码生成模型等多种AI模型,并提供了开放平台供开发者使用和集成。智谱AI的SDK可以用于快速集成其AI能力,如对话、图像识别等功能。

百度飞桨(PaddlePaddle):百度飞桨是中国首个开源深度学习平台,提供丰富的API和SDK,支持多种深度学习模型的开发和部署。

腾讯AI Lab:腾讯AI Lab提供了多种AI技术和服务,包括计算机视觉、语音识别、自然语言处理等领域的SDK和API。

阿里云机器学习平台PAI:阿里云提供的机器学习平台PAI支持多种机器学习算法和模型,提供了SDK供开发者调用。

华为ModelArts:华为云ModelArts是一个全流程模型生产服务,提供丰富的API和SDK,支持模型的训练、部署和管理。

注释:本文以智谱AI为例,其他开源AI平台同理

导入依赖

<dependency>
    <groupId>cn.bigmodel.openapi</groupId>
    <artifactId>oapi-java-sdk</artifactId>
    <version>release-V4-2.3.0</version>
</dependency>

获取API key(注意保密)

官网的个人中心,找到项目管理下的API keys。

测试Demo

测试是否调用AI成功,注意API key要换成自己的。

@SpringBootTest
public class ZhiPuAiTest {

    @Test
    public void test() {
        String apiKey = "自己的apikey";
        // 创建客户端
        ClientV4 client = new ClientV4.Builder(apiKey).build();
        // 构造请求
        List<ChatMessage> messages = new ArrayList<>();
        ChatMessage chatMessage = new ChatMessage(ChatMessageRole.USER.value(), "作为一名营销专家,请为智谱开放平台创作一个吸引人的slogan");
        messages.add(chatMessage);
        String requestId = String.valueOf(System.currentTimeMillis());
        ChatCompletionRequest chatCompletionRequest = ChatCompletionRequest.builder()
                .model(Constants.ModelChatGLM4)
                .stream(Boolean.FALSE)
                .invokeMethod(Constants.invokeMethod)
                .messages(messages)
                .requestId(requestId)
                .build();
        // 调用
        ModelApiResponse invokeModelApiResp = client.invokeModelApi(chatCompletionRequest);
        System.out.println("model output:" + invokeModelApiResp.getMsg());
    }
}

封装通用AI模块

application.yml配置API key

#  ai 配置
ai:
  api-key: 自己的key

定义AI配置类

@Configuration
@ConfigurationProperties(prefix = "ai")
@Data
public class AiConfig {

    /**
     * apiKey
     */

    private String apiKey;

    @Bean
    public ClientV4 getClientV4() {
        return new ClientV4.Builder(apiKey).build();
    }
}

封装通用的AI请求模块

AiManager类提供了多种方法来执行同步和流式请求,包括稳定和不稳定答案的同步请求,以及可以根据随机数温度参数自定义的同步请求。这些方法允许以简化的方式传递系统和用户消息,或者直接传递一个消息列表。

/**
 * 通用 AI 调用能力
 */
@Component
public class AiManager {

    @Resource
    private ClientV4 clientV4;

    // 稳定的随机数
    private static final float STABLE_TEMPERATURE = 0.05f;

    // 不稳定的随机数
    private static final float UNSTABLE_TEMPERATURE = 0.99f;

    /**
     * 同步请求(答案不稳定)
     *
     * @param systemMessage
     * @param userMessage
     * @return
     */
    public String doSyncUnstableRequest(String systemMessage, String userMessage) {
        return doRequest(systemMessage, userMessage, Boolean.FALSE, UNSTABLE_TEMPERATURE);
    }

    /**
     * 同步请求(答案较稳定)
     *
     * @param systemMessage
     * @param userMessage
     * @return
     */
    public String doSyncStableRequest(String systemMessage, String userMessage) {
        return doRequest(systemMessage, userMessage, Boolean.FALSE, STABLE_TEMPERATURE);
    }

    /**
     * 同步请求
     *
     * @param systemMessage
     * @param userMessage
     * @param temperature
     * @return
     */
    public String doSyncRequest(String systemMessage, String userMessage, Float temperature) {
        return doRequest(systemMessage, userMessage, Boolean.FALSE, temperature);
    }

    /**
     * 通用请求(简化消息传递)
     *
     * @param systemMessage
     * @param userMessage
     * @param stream
     * @param temperature
     * @return
     */
    public String doRequest(String systemMessage, String userMessage, Boolean stream, Float temperature) {
        List<ChatMessage> chatMessageList = new ArrayList<>();
        ChatMessage systemChatMessage = new ChatMessage(ChatMessageRole.SYSTEM.value(), systemMessage);
        chatMessageList.add(systemChatMessage);
        ChatMessage userChatMessage = new ChatMessage(ChatMessageRole.USER.value(), userMessage);
        chatMessageList.add(userChatMessage);
        return doRequest(chatMessageList, stream, temperature);
    }

    /**
     * 通用请求
     *
     * @param messages
     * @param stream
     * @param temperature
     * @return
     */
    public String doRequest(List<ChatMessage> messages, Boolean stream, Float temperature) {
        // 构建请求
        ChatCompletionRequest chatCompletionRequest = ChatCompletionRequest.builder()
                .model(Constants.ModelChatGLM4)
                .stream(stream)
                .temperature(temperature)
                .invokeMethod(Constants.invokeMethod)
                .messages(messages)
                .build();
        try {
            ModelApiResponse invokeModelApiResp = clientV4.invokeModelApi(chatCompletionRequest);
            return invokeModelApiResp.getData().getChoices().get(0).toString();
        } catch (Exception e) {
            e.printStackTrace();
            throw new BusinessException(ErrorCode.SYSTEM_ERROR, e.getMessage());
        }
    }

    /**
     * 通用流式请求(简化消息传递)
     *
     * @param systemMessage
     * @param userMessage
     * @param temperature
     * @return
     */
    public Flowable<ModelData> doStreamRequest(String systemMessage, String userMessage, Float temperature) {
        List<ChatMessage> chatMessageList = new ArrayList<>();
        ChatMessage systemChatMessage = new ChatMessage(ChatMessageRole.SYSTEM.value(), systemMessage);
        chatMessageList.add(systemChatMessage);
        ChatMessage userChatMessage = new ChatMessage(ChatMessageRole.USER.value(), userMessage);
        chatMessageList.add(userChatMessage);
        return doStreamRequest(chatMessageList, temperature);
    }


    /**
     * 通用流式请求
     *
     * @param messages
     * @param temperature
     * @return
     */
    public Flowable<ModelData> doStreamRequest(List<ChatMessage> messages, Float temperature) {
        // 构建请求
        ChatCompletionRequest chatCompletionRequest = ChatCompletionRequest.builder()
                .model(Constants.ModelChatGLM4)
                .stream(Boolean.TRUE)
                .temperature(temperature)
                .invokeMethod(Constants.invokeMethod)
                .messages(messages)
                .build();
        try {
            ModelApiResponse invokeModelApiResp = clientV4.invokeModelApi(chatCompletionRequest);
            return invokeModelApiResp.getFlowable();
        } catch (Exception e) {
            e.printStackTrace();
            throw new BusinessException(ErrorCode.SYSTEM_ERROR, e.getMessage());
        }
    }
}

使用AI赋能项目

设计Prompt的常用技巧

Prompt是一种向语言模型提供输入的方法,它通过特定的提示或指令引导模型生成预期的输出。在自然语言处理中,简而言之,Prompt是一种高效利用语言模型能力的技术手段。

技巧一  定义 System Prompt

用于设定AI助手行为模式的工具,包括角色设定、语言风格、任务模式和针对特定问题的具体行为指导。

示例:

  你擅长从文本中提取关键信息,精确、数据驱动,重点突出关键信息,根据用户提供的文本片段提取关键数据和事实,将提取的信息以清晰的 JSON 格式呈现。
技巧二  让 AI 进行角色扮演

让 AI 扮演角色、可以更准确地模仿该角色的行为和对话方式。

示例:

  作为一个量子物理学家,解释量子物理学的基本原理,并简要介绍其在现代科技中的应用。
技巧三  提供具体的细节要求

在 Prompt 中添加要求模型输出内容的细节和背景信息。

示例:

  我对太阳系的行星非常感兴趣,特别是土星。请提供关于土星的基本信息,包括其大小、组成、环系统和任何独特的天文现象。
技巧四  使用分隔符标示不同的输入部分

示例:

  请基于以下内容:
  """ 要总结的文章内容"""
  提炼核心观点和纲要
技巧五  思维链提示

要求模型分步骤解答问题,还要求其展示其推理过程的每个步骤。通过这种方式,可以减少不准确结果的可能性,并使用户更容易评估模型的响应。

示例:

  作为一个 AI 助手,你的任务是帮助用户解决复杂的数学问题。对于每个问题,你需要首先独立解决它,然后比较和评估用户的答案,并最终提供反馈。在这个过程中,请展示你的每一步推理过程。我有一个数学问题需要帮助:"""问题是:一个农场有鸡和牛共 35 头,脚总共有 94 只。鸡和牛各有多少头?我的答案是鸡有 23 头,牛有 12 头"""。
技巧六  少样本学习

可以作为进行少样本学习的示例。这些样本可以用来引导模型模仿特定的行为和语言风格。

  模仿这种风格
      ''' 1、三杯鸡在锅中欢跃,是岁月的篝火,是浪漫的乐章。
          2、炖排骨的滋味,是冬日的棉被,是乡土的回响。
          3、红烧勤鱼的鲜香,是海洋的密语,是大海的情书。'''
  生成新的句子。

项目中调用AI(实战)

定义Prompt常量

参考上文设计Prompt的常用技巧,根据自己的业务需求设计Prompt,示例代码是需要AI生成问卷题目,仅供参考。

    // AI Prompt
    private static final String GENERATE_QUESTION_SYSTEM_MESSAGE = "你是一位严谨的出题专家,我会给你如下信息:\n" +
            "```\n" +
            "应用名称,\n" +
            "【【【应用描述】】】,\n" +
            "应用类别,\n" +
            "要生成的题目数,\n" +
            "每个题目的选项数\n" +
            "```\n" +
            "\n" +
            "请你根据上述信息,按照以下步骤来出题:\n" +
            "1. 要求:题目和选项尽可能地短,题目不要包含序号,每题的选项数以我提供的为主,题目不能重复\n" +
            "2. 严格按照下面的 json 格式输出题目和选项\n" +
            "```\n" +
            "[{\"options\":[{\"value\":\"选项内容\",\"key\":\"A\"},{\"value\":\"\",\"key\":\"B\"}],\"title\":\"题目标题\"}]\n" +
            "```\n" +
            "title 是题目,options 是选项,每个选项的 key 按照英文字母序(比如 A、B、C、D)以此类推,value 是选项内容\n" +
            "3. 检查题目是否包含序号,若包含序号则去除序号\n" +
            "4. 返回的题目列表格式必须为 JSON 数组";
业务逻辑中调用AI
调用AI,使用定义好的Prompt生成题目
        // AI 生成
        String result = aiManager.doSyncRequest(GENERATE_QUESTION_SYSTEM_MESSAGE, userMessage, null);
完整代码
    /**
     * 生成题目的用户消息
     *
     * @param app
     * @param questionNumber
     * @param optionNumber
     * @return
     */
    private String getGenerateQuestionUserMessage(App app, int questionNumber, int optionNumber) {
        StringBuilder userMessage = new StringBuilder();
        userMessage.append(app.getAppName()).append("\n");
        userMessage.append(app.getAppDesc()).append("\n");
        userMessage.append(AppTypeEnum.getEnumByValue(app.getAppType()).getText() + "类").append("\n");
        userMessage.append(questionNumber).append("\n");
        userMessage.append(optionNumber);
        return userMessage.toString();
    }

    @PostMapping("/ai_generate")
    public BaseResponse<List<QuestionContentDTO>> aiGenerateQuestion(
            @RequestBody AiGenerateQuestionRequest aiGenerateQuestionRequest) {
        ThrowUtils.throwIf(aiGenerateQuestionRequest == null, ErrorCode.PARAMS_ERROR);
        // 获取参数
        Long appId = aiGenerateQuestionRequest.getAppId();
        int questionNumber = aiGenerateQuestionRequest.getQuestionNumber();
        int optionNumber = aiGenerateQuestionRequest.getOptionNumber();
        // 获取应用信息
        App app = appService.getById(appId);
        ThrowUtils.throwIf(app == null, ErrorCode.NOT_FOUND_ERROR);
        // 封装 Prompt
        String userMessage = getGenerateQuestionUserMessage(app, questionNumber, optionNumber);
        // AI 生成
        String result = aiManager.doSyncRequest(GENERATE_QUESTION_SYSTEM_MESSAGE, userMessage, null);
        // 截取需要的 JSON 信息
        int start = result.indexOf("[");
        int end = result.lastIndexOf("]");
        String json = result.substring(start, end + 1);
        List<QuestionContentDTO> questionContentDTOList = JSONUtil.toList(json, QuestionContentDTO.class);
        return ResultUtils.success(questionContentDTOList);
    }

标签:userMessage,封装,String,AI,param,temperature,return,Springboot
From: https://blog.csdn.net/hrh1234h/article/details/144217621

相关文章

  • AI开发平台ModelArts/ 将Notebook的Conda环境迁移到SFS磁盘
    前提条件创建一个Notebook,“资源类型”选择“专属资源池”,“存储配置”选择“SFS弹性文件服务器”,打开terminal。创建新的虚拟环境并保存到SFS目录创建新的conda虚拟环境。#shellcondacreate--prefix/home/ma-user/work/envs/user_conda/sfs-new-envpython=3.7.10-......
  • 基于springboot的付费问答系统的设计与实现论文
    系统简介在如今社会上,关于信息上面的处理,没有任何一个企业或者个人会忽视,如何让信息急速传递,并且归档储存查询,采用之前的纸张记录模式已经不符合当前使用要求了。所以,对问答信息管理的提升,也为了对问答信息进行更好的维护,付费问答系统的出现就变得水到渠成不可缺少。通过对......
  • 基于springboot的个人博客系统的设计与实现论文.
    系统简介随着国内市场经济这几十年来的蓬勃发展,突然遇到了从国外传入国内的互联网技术,互联网产业从开始的群众不信任,到现在的离不开,中间经历了很多挫折。本次开发的个人博客系统,有管理员,用户,博主三个角色。管理员功能有个人中心,用户管理,博主管理,文章分类管理,博主文章管理,系......
  • 基于springboot搭建的疫情管理系统论文
    系统简介现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本疫情管理系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信息,使用这种软件工具可以帮助管理人员提高事务处理效......
  • 基于springboot技术的美食烹饪互动平台的设计与实现论文
    系统简介如今社会上各行各业,都喜欢用自己行业的专属软件工作,互联网发展到这个时候,人们已经发现离不开了互联网。新技术的产生,往往能解决一些老技术的弊端问题。因为传统美食信息管理难度大,容错率低,管理人员处理数据费工费时,所以专门为解决这个难题开发了一个美食烹饪互动平......
  • 【工具篇】AI工具生态全景解析:提升生产力利器
    大家不必再东奔西走去找各种工具或者去AI导航站一个一个去试,下面挑选出来的就是各个领域最好的,省去大家的时间和精力。「工欲善其事,必先利其器。」 AI时代,掌握高效的智能工具,就是抢占技术制高点。本文将全面揭秘AI工具生态,为你开启智能生产力新世界。一、AI大语言模型:智能......
  • 【AIX】AIX系统安装教程及相关命令
    ⼀、安装教程1、unix是从MULTICS操作系统演变⽽来,MULTICS的特征是啥?终端!咱们通过串⼝去连接IBMP740吧,⾸先得准备USB转串⼝线2、就是这种了,按照下图连接3、连接正常后(这⾥⽤的是win10操作系统),可以在设备管理那⾥看到安装正确的串⼝(这⾥是COM3⼝)(没正确安装?⾃⼰下载驱动去安......
  • 李飞飞:Agent AI 多模态交互的前沿探索
    这份论文垫子版我已经拿到了,需要的小伙伴可以扫取。01—引言1.1研究背景与动机人工智能的发展源远流长,1956年达特茅斯会议定义了人工智能为可从环境收集信息并有效交互的人工生命形式。受此启发,米斯基团队1970年构建的“复制演示”机器人系统揭示了人工智能研究面临的......
  • 基于 SpringBoot 的校园失物招领系统:开启校园物品归位之旅
    1绪论1.1课题背景身处网络时代,随着网络系统体系发展的不断成熟和完善,人们的生活也随之发生了很大的变化。目前,人们在追求较高物质生活的同时,也在想着如何使自身的精神内涵得到提升,而读书就是人们获得精神享受非常重要的途径[1]。纸质版的书籍比较沉重,携带不方便,而由于手机......
  • SpringBoot 赋能校园失物招领:构建便捷寻物新生态
    1绪论1.1课题背景身处网络时代,随着网络系统体系发展的不断成熟和完善,人们的生活也随之发生了很大的变化。目前,人们在追求较高物质生活的同时,也在想着如何使自身的精神内涵得到提升,而读书就是人们获得精神享受非常重要的途径[1]。纸质版的书籍比较沉重,携带不方便,而由于手机......