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的能力。

总结

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

社交媒体数据恢复:Weico

一、从备份中恢复数据 云备份 希望这篇教程能帮助你恢复Weico中的聊天记录和文件。如有其他问题&#xff0c;请随时联系我们。 三、注意事项 在尝试恢复数据的过程中&#xff0c;请避免执行任何可能导致数据进一步丢失的操作。 数据恢复的效果取决于多种因素&#xff0c;包…

GPU的最佳拍档HBM到底是什么

在AI界&#xff0c;英伟达的大名无人不知&#xff0c;无人不晓。然而即使在AI芯片界占据绝对霸主地位的英伟达&#xff0c;依旧受制于人。 众所周知&#xff0c;算力与带宽是制衡AI应用的两大关键因素&#xff0c;长期以来高速发展的算力受困于有限的带宽限制了其性能的最大发…

信息系统项目管理师0142:管理新实践(9项目范围管理—9.1管理基础—9.1.2管理新实践)

点击查看专栏目录 文章目录 9.1.2 管理新实践 9.1.2 管理新实践 需求一直是项目管理的关注重点&#xff0c;需求管理过程结束于需求关闭&#xff0c;即把产品、服务或成果移交给接收方&#xff0c;以便长期测量、监控、实现并维持收益。随着全球项目环境变得日益复杂&#xff0…

【人工智能Ⅱ】实验8:生成对抗网络

实验8&#xff1a;生成对抗网络 一&#xff1a;实验目的 1&#xff1a;理解生成对抗网络的基本原理。 2&#xff1a;学会构建改进的生成对抗网络&#xff0c;如DCGAN、WGAN、WGAN-GP等。 3&#xff1a;学习在更为真实的数据集上应用生成对抗网络的方法。 二&#xff1a;实验…

Java反序列化-RMI流程分析

RMI 在反序列化里漏洞里面是很常用的&#xff0c;它是一个分布式的思想。 RMI概述 RMI 通常包含两个独立的程序&#xff0c;一个服务端 和 一个客户端。服务端通过绑定这个远程对象类&#xff0c;它可以封装网络操作。客户端层面上只需要传递一个名字&#xff0c;还有地址。 …

LNMP 环境下使用 Zstd 压缩优化网站备份脚本

网站的备份一直都是网站运营、服务器运维中很重要的一环&#xff0c;明月无论是在自己的服务器还是客户的代运维服务器上都是非常重视网站备份的&#xff0c;尤其热衷于优化网站备份这块儿&#xff0c;毕竟明月自己的服务器配置一直都是最低的 1H1G 呀&#xff0c;就这配置常年…

(函数)空格填充(C语言)

一、运行结果&#xff1b; 二、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h>//声明空格填充函数&#xff1b; void space(char a[100]);int main() {//初始化变量值&#xff1b;char a[100] { 0 };//获取用户输入的数据&#xff1b;print…

人工智能学习笔记(1):了解sklearn

sklearn 简介 Sklearn是一个基于Python语言的开源机器学习库。全称Scikit-Learn&#xff0c;是建立在诸如NumPy、SciPy和matplotlib等其他Python库之上&#xff0c;为用户提供了一系列高质量的机器学习算法&#xff0c;其典型特点有&#xff1a; 简单有效的工具进行预测数据分…

Kafka生产者消息异步发送并返回发送信息api编写教程

1.引入依赖&#xff08;pox.xml文件&#xff09; <dependencies> <dependency> <groupId>org.apache.kafka</groupId> <artifactId>kafka-clients</artifactId> <version>3.6.2</version> </dependency> </depende…

泰中完成潜艇采购谈判:有三个亮点值得关注

泰中完成潜艇采购谈判&#xff1a;有三个亮点值得关注 --如何写好产品采购制造类合同&#xff08;或协议&#xff09;才能有效维护你的利益 据新华网消息&#xff1a;泰国和中国已经完成关于泰国皇家海军购买中国制造的S26T元级潜艇的谈判。这份交易正在等待内阁的最终批准。…

WALT算法简介

WALT(Windows-Assist Load Tracing)算法是由Qcom开发&#xff0c; 通过把时间划分为窗口&#xff0c;对 task运行时间和CPU负载进行跟踪计算的方法。为任务调度、迁移、负载均衡及CPU调频 提供输入。 WALT相对PELT算法&#xff0c;更能及时反映负载变化&#xff0c; 更适用于…

黄金期货与现货黄金有什么区别?

如今&#xff0c;黄金成为了众多投资者的热门选择。在黄金投资市场中&#xff0c;有多种形式可供选择&#xff0c;比如纸黄金、实物黄金、黄金期货以及现货黄金等。其中&#xff0c;纸黄金和实物黄金虽然具有其特点&#xff0c;但所需资金量较大且收益表现相对不明显。相对而言…

哈希重要思想续——布隆过滤器

布隆过滤器 一 概念1.1布隆过滤器的提出2.概念 二 模拟实现2.1 三个仿函数setTest 全代码三 实际应用 一 概念 1.1布隆过滤器的提出 我们在使用新闻客户端看新闻时&#xff0c;它会给我们不停地推荐新的内容&#xff0c;它每次推荐时要去重&#xff0c;去掉那些已经看过的内容…

Java面试八股之守护线程和普通线程的区别

守护线程和普通线程的区别 生命周期差异&#xff1a; 普通线程&#xff08;也称为用户线程&#xff09;&#xff1a;这类线程的生命周期与程序的生命周期独立。它们会一直运行直到完成自己的任务或主动结束&#xff0c;如果一个程序中只剩下普通线程在运行&#xff0c;即使主…

JavaScript、Kotlin、Flutter可以开发鸿蒙APP吗?

自从去年华为宣布推出「鸿蒙Next」版本开始&#xff0c;标志着其操作系统的全面革新。鸿蒙Next将摒弃所有基于AOSP的代码&#xff0c;与Android系统彻底分离&#xff0c;实现完全自主的研发路径。通过精简约40%的冗余代码&#xff0c;鸿蒙Next致力于构建一个更高效、更流畅的系…

混合动力电动汽车介绍(二)

接续前一章内容&#xff0c;本篇文章介绍混合动力汽车串联、并联和混联的系统组成和工作原理。 一、串联混合动力电动汽车的系统组成和工作原理 上图为串联混合动力电动汽车的结构简图。汽车由电动机-发电机驱动行驶&#xff0c;电机控制器的动力来自油箱-发动机-发电机-发电机…

Python画图(多图展示在一个平面)

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

上位机图像处理和嵌入式模块部署(f407 mcu vs f103)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 对于一部分嵌入式场景来说&#xff0c;f103其实已经足够了&#xff0c;特别是要求不高的低速场合。如果开发的代码比较多&#xff0c;还可以选用更…

Java面试八股之线程池中submit和execute方法的区别

线程池中submit和execute方法的区别 接口和返回值类型: execute()方法属于Executor接口&#xff0c;它接收一个实现了Runnable接口的任务&#xff0c;并不返回任何结果。它的主要目的是异步执行任务&#xff0c;不关心任务的执行结果。 submit()方法则是ExecutorService接口…

Vue渲染函数与JSX指南

title: Vue渲染函数与JSX指南 date: 2024/6/3 下午6:43:53 updated: 2024/6/3 下午6:43:53 categories: 前端开发 tags:Vue渲染JSX基础性能优化组件对比React JSX大项目测试策略 第1章&#xff1a;Vue.js入门 Vue.js的历史和背景 Vue.js是一个用于构建用户界面的JavaScript框…