AI对话机器人简单实现--智谱BigModel+SpringBoot+Vue2+ElementUI

成品展示

一、首先去注册个账号然后申请个API keys

二、引入依赖 

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

三、后端代码 

此处参考的是这位大佬的文章Java(Spring boot)集成智谱AI聊天(简易版)_智谱ai问答springboot-CSDN博客

 ZhipuAIService.java:

import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.zhipu.oapi.ClientV4;
import com.zhipu.oapi.Constants;
import com.zhipu.oapi.service.v4.model.ChatCompletionRequest;
import com.zhipu.oapi.service.v4.model.ChatMessage;
import com.zhipu.oapi.service.v4.model.ModelApiResponse;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@Service
public class ZhipuAIService {private final ClientV4 client;private final ObjectMapper objectMapper;public ZhipuAIService(@Value("${bigmodel.api.key}") String apiKey) {this.client = new ClientV4.Builder(apiKey).build();this.objectMapper = new ObjectMapper();}//构建信息public String invokeChatCompletion(String userMessage) {List<ChatMessage> messages = new ArrayList<>();ChatMessage chatMessage = new ChatMessage("user", userMessage);messages.add(chatMessage);ChatCompletionRequest chatCompletionRequest = ChatCompletionRequest.builder()//表明使用的模型.model("glm-4-flash")//表示不使用流式响应.stream(Boolean.FALSE).invokeMethod(Constants.invokeMethod).messages(messages).requestId("request-id-" + System.currentTimeMillis()).build();ModelApiResponse response = client.invokeModelApi(chatCompletionRequest);try {// 将response的数据转换为MapString jsonString = objectMapper.writeValueAsString(response.getData());Map<String, Object> dataMap = objectMapper.readValue(jsonString, new TypeReference<Map<String, Object>>() {});// 提取内容if (dataMap.containsKey("choices")) {List<Map<String, Object>> choices = (List<Map<String, Object>>) dataMap.get("choices");if (!choices.isEmpty()) {Map<String, Object> firstChoice = choices.get(0);Map<String, Object> message = (Map<String, Object>) firstChoice.get("message");if (message != null && message.containsKey("content")) {return (String) message.get("content");}}}return "找不到内容";} catch (Exception e) {return "响应错误";}}
}

 ZhipuAiController.java:

import org.springframework.beans.factory.annotation.Autowired;
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 java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.nio.charset.StandardCharsets;@RestController
@RequestMapping("/app/chat")
public class ZhipuAiController {@Autowiredprivate final ZhipuAIService zhipuAiService;public ZhipuAiController(ZhipuAIService zhipuAiService) {this.zhipuAiService = zhipuAiService;}@PostMapping("/ask")public String chat(@RequestBody String userInput) {try {// 对接收到的userInput进行URL解码userInput = URLDecoder.decode(userInput, StandardCharsets.UTF_8.toString());} catch (UnsupportedEncodingException e) {return "解码错误";}String response = zhipuAiService.invokeChatCompletion(userInput);return response;}}

 四、前端代码

请求路径要换成自己的

<template><div class="ai-chat"><!-- 页面栏 --><van-nav-bar title="文章详情" left-text="返回" right-text="按钮" left-arrow @click-left="onClickLeft" /><div class="ai-chat-container"><div class="title">街健佳AI助手</div><el-card class="chat-card"><div v-for="(message, index) in messages" :key="index" class="message"><div :class="{ 'user-message': message.role === 'USER', 'ai-message': message.role === 'AI' }">{{ message.content }}</div></div><div v-if="isAnalyzing" class="analyzing">分析中...</div><div class="input-wrapper"><el-inputtype="textarea"v-model="inputMessage":rows="2"placeholder="请输入内容"class="chat-input"@keyup.enter.native="sendMessage"></el-input><el-button type="primary" @click="sendMessage">发送</el-button></div></el-card></div></div></template><script>import axios from 'axios';import { MessageBox } from 'element-ui';import { API_URL } from '../../config/config';export default {data() {return {messages: [],inputMessage: '',isAnalyzing: false,};},created() {// 页面加载时发送欢迎消息this.messages.push({ role: 'AI', content: '您好,我是小佳,请问您有什么问题呢?' });},methods: {async sendMessage() {if (this.inputMessage.trim()) {this.messages.push({ role: 'USER', content: this.inputMessage });this.isAnalyzing = true; // 显示“分析中”提示try {const response = await axios.post(API_URL + 'app/chat/ask', { message: this.inputMessage });this.isAnalyzing = false; // 隐藏“分析中”提示if (response.data) {this.messages.push({ role: 'AI', content: response.data });} else {MessageBox.alert('没有收到AI的回复', '提示', { type: 'warning' });}} catch (error) {this.isAnalyzing = false; // 隐藏“分析中”提示MessageBox.alert('发送失败: ' + error.message, '错误', { type: 'error' });}this.inputMessage = '';}},onClickLeft() {this.$router.go(-1);},},};</script><style scoped>.ai-chat {display: flex;flex-direction: column;height: 100vh;}.ai-chat-container {background: linear-gradient(to bottom, #007bff, #ffffff);max-width: 800px;height: calc(100vh - 50px); /* 减去顶部栏的高度 */margin: auto;padding: 20px;border-radius: 8px;box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);overflow: hidden;position: relative;overflow-y: auto; /* 允许垂直滚动 */}.title {position: absolute;top: 10px;left: 50%;transform: translateX(-50%);background-color: #007bff;color: #ffffff;padding: 5px 20px;border-radius: 999px;text-align: center;font-size: 20px;font-weight: bold;box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);}.chat-card {background-color: #fff;border-radius: 6px;box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);padding: 0px;margin-top: 50px;flex: 1;overflow-y: auto;}.message {margin-bottom: 20px;display: flex;align-items: flex-end;}.user-message {background-color: #e6f7ff;border-radius: 4px;padding: 10px;max-width: 60%;margin-left: auto;}.ai-message {background-color: #f3e5fd;border-radius: 4px;padding: 10px;max-width: 70%;margin-right: auto;text-align: left;}.input-wrapper {display: flex;align-items: center;position: fixed;bottom: 0;left: 0;right: 0;background-color: #f9f9f9;padding: 10px;box-shadow: 0 -2px 4px rgba(0, 0, 0, 0.1);}.chat-input {flex-grow: 1;margin-right: 10px;}.el-button {width: auto;padding: 10px 20px;}.analyzing {text-align: center;margin-top: 20px;color: #909399;}</style>

如果这篇文章帮助到了您,麻烦点个赞哦~ 

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

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

相关文章

FPGA多路红外相机视频拼接输出,提供2套工程源码和技术支持

目录 1、前言工程概述免责声明 2、相关方案推荐我已有的所有工程源码总目录----方便你快速找到自己喜欢的项目我这里已有的红外相机图像处理解决方案本博已有的已有的FPGA视频拼接叠加融合方案 3、工程详细设计方案工程设计原理框图红外相机FDMA多路视频拼接算法FDMA图像缓存视…

Navicat 连接 SQL Server 详尽指南

Navicat 是一款功能强大的数据库管理工具&#xff0c;它提供了直观的图形界面&#xff0c;使用户能够轻松地管理和操作各种类型的数据库&#xff0c;包括 SQL Server。本文将详尽介绍如何使用 Navicat 连接到 SQL Server 数据库&#xff0c;包括安装设置、连接配置、常见问题排…

【JAVA】Java常用注解汇总

一、注解的定义 Java注解是Java编程语言中的一种特殊形式的元数据&#xff0c;它们可以用于为程序的各个元素&#xff08;例如类、方法、字段等&#xff09;添加额外的信息和属性。注解是在Java 5中引入的&#xff0c;通过在代码中使用注解&#xff0c;开发人员可以提供关于程…

debian安装Nginx

编译安装Nginx sudo apt-get update 环境准备 编译Nginx需要gcc的环境支持&#xff0c;build-essential内包含gcc套件&#xff0c;所以我们安装build-essential即可&#xff1a; sudo apt-get install build-essential 因为nginx.conf中使用了正则表达式&#xff0c;所以编…

基于PLC的电梯控制系统(论文+源码)

1.系统设计 电梯采用了PLC控制方式&#xff0c;通过对PLC进行逻辑程序设计&#xff0c;电梯不仅在控制水平上得到了质的提升&#xff0c;同时在安全性上也得到了大大提高。控制系统在构造上实现了简洁化&#xff0c;不仅优化了硬件接线方便了线路施工&#xff0c;同时对控制要…

MySQL从入门到入土---MySQL表的约束 (内含实践)---详细版

目录 引入&#xff1a; null 与not null default&#xff1a; comment列描述 &#xff1a; not null 和 default&#xff1a; zerofill &#xff1a; 主键&#xff1a;primary key 复合主键&#xff1a; 自增长:auto_increment 唯一键&#xff1a;unique key 外键&a…

linux安装nginxs报错:openssl not found

系统&#xff1a; linux 版本&#xff1a;centOS7 nginx版本&#xff1a;nginx-1.20.2 linux安装nginx时 执行下面命令时报错&#xff1a; ./configure --with-http_stub_status_module --with-http_ssl_module --prefix/usr/local/nginxchecking for OpenSSL library ... not …

Flutter:打包apk,详细图文介绍

困扰了一天&#xff0c;终于能正常打包apk安装了&#xff0c;记录下打包的流程。建议参考我这篇文章时&#xff0c;同时看下官网的构建说明。 官网构建并发布 Android 应用详情 1、AS创建Flutter项目 2、cmd执行命令 生成一个sunluyi.jks的文件&#xff0c;可以自行把sunluyi替…

shell命令以及运行原理

目录 一、命令解释器 1、什么是命令行解释器 shell和bash联系 2、为什么用命令行解释器 作用 存在意义 二、Linux权限 1、用户分类 2、Linux权限管理 1&#xff09;权限身份 2&#xff09;文件类型和访问权限 3&#xff09;文件访问权限的相关设置方法 a. chmod …

精准识别花生豆:基于EfficientNetB0的深度学习检测与分类项目

精准检测花生豆&#xff1a;基于EfficientNet的深度学习分类项目 在现代农业生产中&#xff0c;作物的质量检测和分类是确保产品质量的重要环节。针对花生豆的检测与分类需求&#xff0c;我们开发了一套基于深度学习的解决方案&#xff0c;利用EfficientNetB0模型实现高效、准…

CSS利用浮动实现文字环绕右下角,展开/收起效果

期望实现 文字最多展示 N 行&#xff0c;超出部分截断&#xff0c;并在右下角显示 “…” “更多”&#xff1b; 点击更多&#xff0c;文字展开全部内容&#xff0c;右下角显示“收起”。效果如下&#xff1a; 思路 尽量使用CSS控制样式&#xff0c;减少JS代码复杂度。 利…

FOC控制原理-HALL传感器测量电角度

0、相关文章 【电机控制算法】基于霍尔位置传感器(HALL)估算连续电角度&#xff08;基于STM32F407CubeMXHAL&#xff09;_峰岹hall-CSDN博客 电机控制【FOC】_SimpleFOC_通过 Hall 计算电机角度和速度原理 - 大大通(简体站) (wpgdadatong.com.cn) STM32 FOC SDK2.0中使用hall传…

手机实时提取SIM卡打电话的信令声音-智能拨号器的SIP线路-双卡双待单通方案

手机实时提取SIM卡打电话的信令声音 --智能拨号器的SIP线路-双卡双待单通方案 一、前言 蓝牙电话的技术方案最初是从蓝牙耳机和车机蓝牙的使用领域延伸出来的技术方式。通过蓝牙的HFP协议&#xff0c;把手机通话的声音和通话事件状态提取出来进行复用和处理。但中国大陆现行…

C++--类与对象

1.封装 封装是c面向对象的三大特性之一 将属性和行为作为一个整体 将属性和行为加以权限控制 语法&#xff1a; class 类名{ 访问权限: 属性/行为 }; 访问权限 public 公共权限 类内类外均可以访问 protected 保护权限 类内可以访问&#xff0c;类外不可以访问 pr…

遗传算法与深度学习实战(29)——编码卷积自编码器架构

遗传算法与深度学习实战&#xff08;29&#xff09;——编码卷积自编码器架构 0. 前言1. 构建卷积自编码器2. 构建卷积自编码器基因序列3. 解析基因序列构建模型小结系列链接 0. 前言 使用遗传算法 (Genetic Algorithm, GA) 构建自编码器 (AutoEncoder, AE) 优化器时&#xff…

蓝桥杯(Java)(ing)

Java前置知识 输入流&#xff1a; &#xff08;在Java面向对象编程里面有提过相关知识&#xff09; // 快读快写 static BufferedReader in new BufferedReader(new InputStreamReader(System.in)); static BufferedWriter out new BufferedWriter(new OutputStreamWriter…

Ajax数据爬取

有时我们用requests 抓取页面得到的结果&#xff0c;可能和在浏览器中看到的不一样:在浏览器中可以看到正常显示的页面数据&#xff0c;而使用requests 得到的结果中并没有这些数据。这是因为 requests 获取的都是原始 HTML 文档&#xff0c;而浏览器中的页面是JavaScript 处理…

tcpdump 网络数据包分析工具

简介 用简单的话来定义tcpdump&#xff0c;就是&#xff1a;dump the traffic on a network&#xff0c;根据使用者的定义对网络上的数据包进行截获的包分析工具。 tcpdump可以将网络中传送的数据包的“头”完全截获下来提供分析。它支持针对网络层、协议、主机、网络或端口的…

手机发烫怎么解决?

在当今这个智能手机不离手的时代&#xff0c;手机发烫成了不少人头疼的问题。手机发烫不仅影响使用手感&#xff0c;长期过热还可能损害手机硬件、缩短电池寿命&#xff0c;甚至引发安全隐患。不过别担心&#xff0c;下面这些方法能帮你有效给手机 “降温”。 一、使用习惯方面…

BUUCTF Pwn ciscn_2019_es_2 WP

1.下载 checksec 用IDA32打开 定位main函数 发现了个假的后门函数&#xff1a; 看看vul函数&#xff1a; 使用read读取 想到栈溢出 但是只有48个 只能覆盖EBP和返回地址 长度不够构造 所以使用栈迁移&#xff1a; 栈迁移需要用到leave ret 使用ROPgadget找地址&#xff1a; …