网易首页 > 网易号 > 正文 申请入驻

SpringBoot 封装 AI 模块,快速实现智能化!

0
分享至

钓友宝 (微信小程序):一款专门为 钓友 开发的 免费的 分享钓点地图与实时天气的软件,地图中标记了所有野钓、钓场、公共水域等的精确位置,支持导航、 预测钓鱼位置的鱼情 等功能。

一、国内支持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平台同理

二、导入依赖


     

 cn.bigmodel.openapi groupId>     

 oapi-java-sdk artifactId>     

 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
     
     
  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
     
     
  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  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   doStreamRequest (String systemMessage, String userMessage, Float temperature)  {         List  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   doStreamRequest (List  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赋能项目

1. 设计Prompt的常用技巧

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

技巧一:定义 System Prompt

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

示例:

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

技巧二:让AI进行角色扮演

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

示例:

作为一个量子物理学家,解释量子物理学的基本原理,并简要介绍其在现代科技中的应用。

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

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

示例:

我对太阳系的行星非常感兴趣,特别是土星。请提供关于土星的基本信息,包括其大小、组成、环系统和任何独特的天文现象。

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

示例:

请基于以下内容: """ 要总结的文章内容""" 提炼核心观点和纲要

技巧五:思维链提示

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

示例:

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

技巧六:少样本学习

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

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

2. 项目中调用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 > 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 questionContentDTOList = JSONUtil.toList(json, QuestionContentDTO .class);
return ResultUtils.success(questionContentDTOList);

插播一下 Java精选面试题 (微信小程序):5000+道面试题和选择题,包含Java基础、并发、JVM、线程、MQ系列、Redis、Spring系列、Elasticsearch、Docker、K8s、Flink、Spark、架构设计、大厂真题等,在线随时刷题!
作者:hrhcode https://blog.csdn.net/hrh1234h/article/details/144217621

公众号“Java精选”所发表内容注明来源的,版权归原出处所有(无法查证版权的或者未注明出处的均来自网络,系转载,转载的目的在于传递更多信息,版权属于原作者。如有侵权,请联系,笔者会第一时间删除处理!

最近有很多人问,有没有读者交流群!加入方式很简单,公众号Java精选,回复“加群”,即可入群!

特别推荐:专注分享最前沿的技术与资讯,为弯道超车做好准备及各种开源项目与高效率软件的公众号,「大咖笔记」,专注挖掘好东西,非常值得大家关注。点击下方公众号卡片关注

文章有帮助的话,点在看,转发吧!

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
王石被限制出境!多名高管被带走!万科的清算开始了!

王石被限制出境!多名高管被带走!万科的清算开始了!

伊历史
2026-04-03 14:34:44
中国已无退路了!美军为中美选好了主战场,决心要跟中国打场大战

中国已无退路了!美军为中美选好了主战场,决心要跟中国打场大战

丁丁鲤史纪
2026-04-03 12:09:15
巨日禄杰夫:未来三个月,漫剧承制模式或将消失 70%

巨日禄杰夫:未来三个月,漫剧承制模式或将消失 70%

新腕儿
2026-04-03 10:00:00
东契奇经纪人正式发布声明:将申请特殊情况豁免 争取参与奖项评选

东契奇经纪人正式发布声明:将申请特殊情况豁免 争取参与奖项评选

林子说事
2026-04-04 14:27:14
日本舆论炸锅,东京知道麻烦大了,对中国的道歉,高市需要自己说

日本舆论炸锅,东京知道麻烦大了,对中国的道歉,高市需要自己说

小祁谈历史
2026-04-04 23:48:46
存储飙涨300%!手机涨价后没人买:高通联发科合计减产约2000万颗处理器

存储飙涨300%!手机涨价后没人买:高通联发科合计减产约2000万颗处理器

快科技
2026-04-03 10:18:17
英国人终于承认:中东打一仗才发现,中国这三张底牌,谁都学不来

英国人终于承认:中东打一仗才发现,中国这三张底牌,谁都学不来

何氽简史
2026-04-04 14:39:54
姆巴佩离谱2失单刀+带球出边线 近5场0球遭怒批:领袖气质远输C罗

姆巴佩离谱2失单刀+带球出边线 近5场0球遭怒批:领袖气质远输C罗

我爱英超
2026-04-05 06:56:39
热点问答|美军一天两次坠机 当前战事走向如何

热点问答|美军一天两次坠机 当前战事走向如何

新华社
2026-04-04 16:24:45
穷可以卑微到什么地步?网友:换我早身心崩溃了

穷可以卑微到什么地步?网友:换我早身心崩溃了

夜深爱杂谈
2026-03-12 21:00:23
54年,毛主席问关公姓什么,公安厅长回答姓关,毛主席:错了

54年,毛主席问关公姓什么,公安厅长回答姓关,毛主席:错了

铜臭的历史味
2026-04-04 10:27:56
伊朗革命卫队称两架美国“黑鹰”被伊朗山民击中

伊朗革命卫队称两架美国“黑鹰”被伊朗山民击中

界面新闻
2026-04-05 10:06:43
帕萨特凭什么可以霸榜

帕萨特凭什么可以霸榜

沙雕小琳琳
2026-04-05 09:35:35
战功赫赫的红军军团长,整编时竟无人愿收,主席震怒直言纯属瞎胡闹

战功赫赫的红军军团长,整编时竟无人愿收,主席震怒直言纯属瞎胡闹

磊子讲史
2026-03-30 15:41:41
别再争了!师大附中与昆八中:谁是昆明高中真王者?真相扎心了

别再争了!师大附中与昆八中:谁是昆明高中真王者?真相扎心了

音乐时光的娱乐
2026-04-05 08:10:44
女篮4月下旬开启长集训!放弃3名国手,召回5名实力球员是上策

女篮4月下旬开启长集训!放弃3名国手,召回5名实力球员是上策

冷桂零落
2026-04-04 21:37:37
张水华第四个代言官宣!50天狂签4家,收入登顶跑圈,公司已注册!

张水华第四个代言官宣!50天狂签4家,收入登顶跑圈,公司已注册!

马拉松跑步健身
2026-04-02 22:10:07
《浪7》5个名场面:王俊凯马天宇来了,全场只有她带大25岁老公来

《浪7》5个名场面:王俊凯马天宇来了,全场只有她带大25岁老公来

阿纂看事
2026-04-03 11:25:40
特朗普小儿子被呼吁参军,美媒:他身高2米多,可能因此不用服役

特朗普小儿子被呼吁参军,美媒:他身高2米多,可能因此不用服役

错过美好
2026-04-01 06:07:23
福建厦门惊现蒋介石秘密金库!曾为黄金转运枢纽,金银如山!

福建厦门惊现蒋介石秘密金库!曾为黄金转运枢纽,金银如山!

诺言卿史录
2026-03-19 09:05:46
2026-04-05 10:27:00
Java精选
Java精选
一场永远也演不完的戏
1782文章数 3859关注度
往期回顾 全部

科技要闻

小米、字节“老将”带队,Meta秘密布局AI新硬件

头条要闻

牛弹琴:伊朗民众拿枪上山搜寻 美军飞行员有四种结局

头条要闻

牛弹琴:伊朗民众拿枪上山搜寻 美军飞行员有四种结局

体育要闻

刹不住的泰格·伍兹,口袋里的两粒药丸

娱乐要闻

Q女士反击,否认逼宋宁峰张婉婷离婚

财经要闻

谁造出了优思益这头“怪物”?

汽车要闻

17万级海豹07EV 不仅续航长还有9分钟满电的快乐

态度原创

健康
数码
房产
手机
公开课

干细胞抗衰4大误区,90%的人都中招

数码要闻

苹果新AirPods Pro曝光,内置红外摄像头、升级 H3 芯片

房产要闻

小阳春全面启动!现房,才是这波行情里最稳的上车票

手机要闻

W13周:第一、第二没变,小米、OPPO互换,vivo、荣耀没变

公开课

李玫瑾:为什么性格比能力更重要?

无障碍浏览 进入关怀版