Spring boot集成通义千问大模型实现智能问答

Spring boot集成通义千问大模型实现智能问答

背景

我在用idea进行java开发时发现了通义灵码这款免费的智能代码补全插件,用了一段时间了,感觉很不错。就想着在自己的项目中也能集成通义千问大模型实现智能回答,毕竟对接openai需要解决网络问题,这个问题是真烦。

开通阿里云账号

访问阿里云官网,如果没注册就注册登录进去,然后搜索通义千问。
在这里插入图片描述
如果你之前还没有开通,就点击立即开通,开通是免费的,无脑操作就行。开通之后,进入产品控制台
在这里插入图片描述
可以看到,每期都有一定的免费额度,对于个人来说肯定是够了。当然对于第一次进来的人,是看不到这个信息,你还需要申请api_key,操作过程如下
在这里插入图片描述
再之后,我们可以点击文档中心,查看具体集成过程了。
在这里插入图片描述我们进入操作指南下的模型体验中心,进入页面点击通义千问API详情,这里就有具体的api和java代码的操作方式。
在这里插入图片描述

代码实操

引入maven依赖

java无论用什么第三方功能,第一步就是引入依赖。

        <!-- 对接通义千问大模型 --><dependency><groupId>com.alibaba</groupId><artifactId>dashscope-sdk-java</artifactId><version>2.14.4</version></dependency>
配置api_key

把key配置到yml中,按官方的意思,key应该放环境变量中,我这只是演示,就直接放这里了,要是生产环境使用,要放环境变量中,或者在配置中加密保存。

# 通义千问的apikey
ai:api_key: sk-************
代码实现

我就在controller层实现对话功能,代码如下

package org.syx.dts.controller;import com.alibaba.dashscope.aigc.generation.Generation;
import com.alibaba.dashscope.aigc.generation.GenerationParam;
import com.alibaba.dashscope.aigc.generation.GenerationResult;
import com.alibaba.dashscope.common.Message;
import com.alibaba.dashscope.common.Role;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.syx.dts.dto.Dto;import java.util.Arrays;@RestController
@RequestMapping("chat")
@Slf4j
public class ChatController {@Value("${ai.api_key}")private String apiKey;@PostMapping("ask")public String ask(@RequestBody Dto dto) throws Exception {Generation generation = new Generation();Message userMessage = Message.builder().role(Role.USER.getValue()).content(dto.getAsk()).build();GenerationParam param = GenerationParam.builder().model("qwen-turbo").messages(Arrays.asList(userMessage)).resultFormat(GenerationParam.ResultFormat.MESSAGE).topP(0.8).apiKey(apiKey).enableSearch(true).build();GenerationResult generationResult =generation.call(param);;return generationResult.getOutput().getChoices().get(0).getMessage().getContent();}}
前端代码

我在这里使用了thymeleaf,所以Spring boot跟前端都需要借助thymeleaf的支持。前端支持thymeleaf比较简单,直接在html页面中添加这一行就行。Spring boot支持thymeleaf需要引入依赖。

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html xmlns:th="http://www.thymeleaf.org"><head><title>aaaaa</title><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><link rel="stylesheet" type="text/css"th:href="@{/css/style.css}" /><script src="https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script></head><body><div id="wrap"><div id="top_content"><div id="header"><div id="rightheader"><p>2024/07/20<br /></p></div><div id="topheader"><h1 id="title"><a href="#">aaaa</a></h1></div><div id="navigation"></div></div><div id="content"><p id="whereami"></p><h1>大模型:</h1>条件: <input id="query_name" type="text"  name="ask" /><input type="button" class="button"  id="query_submit" value="查询" /><br><textarea rows="20" cols="100" id="response" name="response" readonly="readonly"></textarea><p><a href="employee/lists">返回列表</a></p><script>$(function(){$('#query_submit').click(function(){var ask = $('#query_name').val();$.ajax({url: '[[@{/chat/ask}]]',type: 'POST',contentType: 'application/json',data: JSON.stringify({ask:ask}),success: function(data) {$('#response').val(data);},error: function(data) {$('#response').val(data);}});});});</script></div></div><div id="footer"><div id="footer_bg">aaaaa.com</div></div></div></body>
</html>
效果展示

在这里插入图片描述

附录

这次开发这个功能,借助了thymeleaf的能力。

总结

总体集成过程还是比较简单的,官方文档也是很充实的,更多高级功能,后面再探索吧。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/22288.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SQL注入-时间盲注

SQL时间盲注&#xff08;Time-based Blind SQL Injection&#xff09;&#xff0c;又叫延时注入&#xff0c;是一种SQL注入攻击技术&#xff0c;用于在无法直接获取查询结果或查看响应内容变化的情况下&#xff0c;通过引入时间延迟来推断数据库的信息&#xff1b;时间盲注依赖…

什么是真正的高效阅读,高效阅读的方法和技巧

一、教程描述 查理芒格说他认识的厉害的人没有一个不读书的&#xff0c;为什么我们也读书却成不了厉害的那个人呢&#xff1f;所以这绝对不是书的问题&#xff0c;而是人的问题。阅读应该带有目的性&#xff0c;要帮我们解决实际问题。如果读一本书只是读完它&#xff0c;那读…

如何理解与学习数学分析——第一部分——数学分析概观

第1 部分&#xff1a;数学分析概观(Studying Analysis) 1. 数学分析之面目(What is Analysis like?) 本章说明了分析中的定义、定理和证明。 它介绍了一些符号&#xff0c;并解释了如何使用数学分析中的这些数学符号和数学词汇、以及应该把它们读成什么。它指出了这种类型的…

CANDela studio的State

State主要用来查看&#xff0c;点击State Groups&#xff0c;可以看到session和security下面有多少个会话和security level&#xff0c;所以删除和新建都不能在这里操作。 Dependencies没有安装插件&#xff0c;看不到图形不要紧&#xff0c;点击下面那个图标&#xff0c;就能编…

【好物推荐】夏日肌肤守护者:护肤皂

随着夏日的到来&#xff0c;高温、潮湿和紫外线成为了肌肤的三大挑战。在这个季节里&#xff0c;护肤不仅仅是为了美观&#xff0c;更是对肌肤健康的一种保护。在众多护肤产品中&#xff0c;护肤皂因其清洁力强、使用方便等特点&#xff0c;成为了夏季护肤的得力助手。今天&…

【Java基础】字符集

【Java基础】字符集 0. 预备知识1.计算机中的存储规则2. Unicode、UTF-83. 为什么出现乱码4. 如何防止产生乱码 0. 预备知识 字符集&#xff08;Character Set&#xff09;是多个字符的集合&#xff0c;它规定了字符在计算机中的编码方式。 字符集的定义与作用 字符集是各种…

11 - 员工奖金(高频 SQL 50 题基础版)

11- 员工奖金 -- join和left join的区别 -- 如果是join则右侧的数据有的就插&#xff0c;没的就啥也不干&#xff0c;交白卷&#xff0c;也不留null -- 但是left join让右侧数据在没有对应数据时补上了null select e.name,b.bonus from Employee e left join bonus b on e.empI…

SpringBoot 统一返回格式

目录 一、为什么要统一返回&#xff1f; 二、全局异常处理代码 三、统一返回对象代码 四、使用方法 五、结果展示 一、为什么要统一返回&#xff1f; 在Spring Boot应用中&#xff0c;为了保持API接口的响应格式统一&#xff0c;通常会采用全局异常处理和自定义返回对象的方…

Java进制转换

进制介绍 二进制&#xff1a;0B开头&#xff0c;0-1 八进制&#xff1a;0开头&#xff0c;0-7 十进制&#xff1a;0-9 十六进制&#xff1a;0x开头&#xff0c;0-9和A-F public class Binary{public static void main(String[] args){//二进制 10int n10B1010//十进制 1010int…

[协议]TCP协议

TCP,UDP协议工作在传输层 TCP基于连接&#xff1b; UDP基于非连接 TCP三次握手 UDP:不能保证丢包&#xff0c;传输稳定性不如TCP;

场外期权怎么做?

对于中国的投资者而言&#xff0c;场外期权交易目前主要由特定的券商提供&#xff0c;并且仅对机构开放。个人投资者无法直接参与此类交易&#xff0c;但可以通过与这些券商合作的机构公司进行询价和下单。场外期权交易涉及一系列严谨的步骤&#xff0c;以下是其基本流程&#…

QT中将资源文件(image、qss、qm等)封装到静态库中,程序该如何引用静态库中的资源文件

1、静态库 2、主程序中使用第三方库中的资源文件 核心代码: int main(int argc, char *argv[]) {QApplication a(argc, argv

【C++】优先级队列仿函数

目录 一.priority_queue的使用 二.仿函数 三、priority_queue的模拟实现 首先&#xff0c;我们先来了解一下什么是优先级队列 priority_queue&#xff0c;翻译为优先级队列&#xff0c;是一种容器适配器 底层容器可以是任何标准容器类模板&#xff0c;也可以是其他特定设计…

面试一个多月,我上岸了!

大家好&#xff0c;我是枫哥&#xff0c;&#x1f31f;阿里云技术专家、&#x1f4dd;资深面试官、&#x1f339;Java跳槽网课堂创始人。拥有多年一线研发经验&#xff0c;曾就职过科大讯飞、美团网、平安等公司。目前组建的团队&#xff0c;专注Java技术分享&#xff0c;一对一…

PromptPort:为大模型定制的创意AI提示词工具库

PromptPort&#xff1a;为大模型定制的创意AI提示词工具库 随着人工智能技术的飞速发展&#xff0c;大模型在各行各业的应用越来越广泛。而在与大模型交互的过程中&#xff0c;如何提供精准、有效的提示词成为了关键。今天&#xff0c;就为大家介绍一款专为大模型定制的创意AI…

九、从0开始卷出一个新项目之瑞萨RZN2L生产烧录固件(jflash擦写读外挂flash)

目录 七、生产烧录固件(jflash擦/写/读外挂flash) 7.1 flash母片读写 7.2 jflash擦/写/读外挂flash 九、从0开始卷出一个新项目之瑞萨RZN2L 七、生产烧录固件(jflash擦写读外挂flash) 七、生产烧录固件(jflash擦/写/读外挂flash) 7.1 flash母片读写 略 7.2 jflash擦/写/读…

【Java】使用 BeanUtils.copyProperties 11个坑(注意事项)

目录 背景 坑1&#xff1a;类型不匹配 坑2&#xff1a;属性名称不一致 坑3&#xff1a;BeanUtils.copyProperties 是浅拷贝 坑4&#xff1a;Null 值覆盖 坑5&#xff1a;注意引入的包 坑6&#xff1a;Boolean 类型数据 is 开头属性的坑 坑7&#xff1a;查不到字段引用 …

【Linux】常用基本指令汇总

前言&#xff1a; 本章将介绍Linux操作系统常用的基本指令&#xff0c;另外&#xff0c;使用这些指令编辑一个shell脚本&#xff0c;方便大家理解使用。 目录 常用指令whoamipwdls关于iNode的解释验证标识文件的方式 cdtouchmkdir&#xff08;重要&#xff09;treemdir指令 &a…

Jmeter断言、关联、脚本录制

Jmeter断言 断言&#xff1a;让程序自动判断预期结果和实际结果是否一致 提示: Jmeter在请求的返回层面有个自动判断机制&#xff08;响应状态码 2xx:成功&#xff0c;4xx/5xx:失败&#xff09;但是请求成功了&#xff0c;并不代表结果一定正确&#xff0c;因此需要检测机制…

【保姆级图文教程】QT下载、安装、入门、配置VS Qt环境

【保姆级图文教程】QT下载、安装、入门、配置VS Qt环境-CSDN博客 0.QT介绍 QT 是一个跨平台的应用程序开发框架&#xff0c;它提供了丰富的工具和类库&#xff0c;用于开发图形用户界面&#xff08;GUI&#xff09;程序。Qt 提供了 C 编程语言接口&#xff0c;同时也支持其他…