Springboot --- 使用国内的 AI 大模型 对话

  • 实在是不知道标题写什么了 可以在评论区给个建议哈哈哈哈 先用这个作为标题吧

尝试使用 国内给出的 AI 大模型做出一个 可以和 AI 对话的 网站出来

  • 使用 智普AI 只能 在控制台中输出 对应的信息 不如就做一个 maven 的 项目调用对应的API
    https://open.bigmodel.cn/dev/api#glm-4
    <dependency><groupId>cn.bigmodel.openapi</groupId><artifactId>oapi-java-sdk</artifactId><version>release-V4-2.0.0</version></dependency>
  • 使用 普通的 java – Maven项目 只能在控制台 查看结果 也就是 说没有办法在其他平台 使
    用 制作出来的 AI ChatRobot
  • 思来想去 不如 将这个东西写成 QQ 机器人
  • 但是因为我找到的 那个 不更新了 或者 腾讯不支持了 让我放弃了 写成 QQ 机器人的想法
  • 于是我就尝试将这个写成一个本地的 AI 对话机器人 但是 在翻看 官方给出的 Demo 我偶然发现了一个方法 他的 输出似乎是一个 json 转换成的 String
  • 这个方法并没有将这个String 返回出来 而是 直接在控制台打印
package com.codervibe.utils;import com.alibaba.fastjson.JSON;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.PropertyNamingStrategy;
import com.zhipu.oapi.ClientV4;
import com.zhipu.oapi.Constants;
import com.zhipu.oapi.service.v4.image.CreateImageRequest;
import com.zhipu.oapi.service.v4.image.ImageApiResponse;
import com.zhipu.oapi.service.v4.model.*;
import io.reactivex.Flowable;import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.atomic.AtomicBoolean;public class ChatAPIUtils {private static final String API_KEY = "cb11ad7f3b68ce03ed9be6e13573aa19";private static final String API_SECRET = "nG7UQrrXqsXtqD1S";private static final ClientV4 client = new ClientV4.Builder(API_KEY, API_SECRET).build();private static final ObjectMapper mapper = defaultObjectMapper();public static ObjectMapper defaultObjectMapper() {ObjectMapper mapper = new ObjectMapper();mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);mapper.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE);mapper.addMixIn(ChatFunction.class, ChatFunctionMixIn.class);mapper.addMixIn(ChatCompletionRequest.class, ChatCompletionRequestMixIn.class);mapper.addMixIn(ChatFunctionCall.class, ChatFunctionCallMixIn.class);return mapper;}// 请自定义自己的业务idprivate static final String requestIdTemplate = "mycompany-%d";/*** 同步调用*/public static String InvokeApi(String content) throws JsonProcessingException {List<ChatMessage> messages = new ArrayList<>();ChatMessage chatMessage = new ChatMessage(ChatMessageRole.USER.value(), content);messages.add(chatMessage);String requestId = String.format(requestIdTemplate, System.currentTimeMillis());// 函数调用参数构建部分List<ChatTool> chatToolList = new ArrayList<>();ChatTool chatTool = new ChatTool();chatTool.setType(ChatToolType.FUNCTION.value());ChatFunctionParameters chatFunctionParameters = new ChatFunctionParameters();chatFunctionParameters.setType("object");Map<String, Object> properties = new HashMap<>();properties.put("location", new HashMap<String, Object>() {{put("type", "string");put("description", "城市,如:北京");}});properties.put("unit", new HashMap<String, Object>() {{put("type", "string");put("enum", new ArrayList<String>() {{add("celsius");add("fahrenheit");}});}});chatFunctionParameters.setProperties(properties);ChatFunction chatFunction = ChatFunction.builder().name("get_weather").description("Get the current weather of a location").parameters(chatFunctionParameters).build();chatTool.setFunction(chatFunction);chatToolList.add(chatTool);ChatCompletionRequest chatCompletionRequest = ChatCompletionRequest.builder().model(Constants.ModelChatGLM4).stream(Boolean.FALSE).invokeMethod(Constants.invokeMethod).messages(messages).requestId(requestId).tools(chatToolList).toolChoice("auto").build();ModelApiResponse invokeModelApiResp = client.invokeModelApi(chatCompletionRequest);try {// 这里返回出去是一个 json return mapper.writeValueAsString(invokeModelApiResp);} catch (JsonProcessingException e) {e.printStackTrace();}return mapper.writeValueAsString(new ModelApiResponse());}public static void CreateImage(String content) {CreateImageRequest createImageRequest = new CreateImageRequest();createImageRequest.setModel(Constants.ModelCogView);createImageRequest.setPrompt(content);ImageApiResponse imageApiResponse = client.createImage(createImageRequest);System.out.println("imageApiResponse:" + JSON.toJSONString(imageApiResponse));}}
  • 工具类中 InvokeApi 方法 最后获得的是一个 ModelApiResponse类 这个类有点类似于 统一返回类型 但是我在这里 只需要里面的具体方法 请求状态和 信息 并不需要 (有另外一个统一返回类型定义 ) 所以在 后面我将这个方法 修改 改为 将我需要的数据返回给controller
  • 实际上这是不应该直接返回给 controller 的 而是 应该 通过 service 的 因为service中才是真正的业务代码
  • 修改后的方法 代码如下
    /*** 同步调用*/public static ModelData InvokeApi(String content) throwsJsonProcessingException{List<ChatMessage> messages = new ArrayList<>();ChatMessage chatMessage = new ChatMessage(ChatMessageRole.USER.value(), content);messages.add(chatMessage);String requestId = String.format(requestIdTemplate, System.currentTimeMillis());// 函数调用参数构建部分List<ChatTool> chatToolList = new ArrayList<>();ChatTool chatTool = new ChatTool();chatTool.setType(ChatToolType.FUNCTION.value());ChatFunctionParameters chatFunctionParameters = new ChatFunctionParameters();chatFunctionParameters.setType("object");Map<String, Object> properties = new HashMap<>();properties.put("location", new HashMap<String, Object>() {{put("type", "string");put("description", "城市,如:北京");}});properties.put("unit", new HashMap<String, Object>() {{put("type", "string");put("enum", new ArrayList<String>() {{add("celsius");add("fahrenheit");}});}});chatFunctionParameters.setProperties(properties);ChatFunction chatFunction = ChatFunction.builder().name("get_weather").description("Get the current weather of a location").parameters(chatFunctionParameters).build();chatTool.setFunction(chatFunction);chatToolList.add(chatTool);ChatCompletionRequest chatCompletionRequest = ChatCompletionRequest.builder().model(Constants.ModelChatGLM4).stream(Boolean.FALSE).invokeMethod(Constants.invokeMethod).messages(messages).requestId(requestId).tools(chatToolList).toolChoice("auto").build();ModelApiResponse invokeModelApiResp = client.invokeModelApi(chatCompletionRequest);ModelData data = invokeModelApiResp.getData();return data;
  • 而这里的信息实际上是一层层 抽丝剥茧 剥离出来的
    List<Choice> choices = data.getChoices();System.out.println("choices.toString() = " + choices.toString());for (Choice choice : choices) {ChatMessage message = choice.getMessage();System.out.println("message.getContent() = " + message.getContent());//本来这里想返回具体的信息类但是发现 上面的的那个ModelApiResponse类 也是一个 统一返回类型 也包含这 请求状态码 之类的定义return message;}return new ChatMessage();try {return mapper.writeValueAsString(invokeModelApiResp);} catch (JsonProcessingException e) {e.printStackTrace();}return mapper.writeValueAsString(new ModelApiResponse());    
  • 可以看到我的这段代码 有多个 return 所以这实际上是一段假 代码
  • 每一个return 实际上官方都 对应的 model 或者说 resoponse
  • controller 代码
    @PostMapping("/chat")public R chat(@RequestParam("content") String content) throws JsonProcessingException {/*** data 中的 choices 是一个 List<Choice> 类型但是实际上只有一个所以索性直接获取数组下标0的对象*/logger.info(ChatAPIUtils.InvokeApi(content).getChoices().get(0).getMessage().getContent().toString());return R.ok().data("content", ChatAPIUtils.InvokeApi(content));}
  • 修改 由 service 层 调用 工具类
  • service 代码
  • service 接口
package com.codervibe.server.service;import com.zhipu.oapi.service.v4.image.ImageResult;
import com.zhipu.oapi.service.v4.model.ModelData;public interface ChatService {/*** AI 对话*/ModelData AIdialogue(String content);/*** AI  画图*/ImageResult AIcreateimage(String content);
}
  • service 接口实现

package com.codervibe.server.Impl;import com.codervibe.server.service.ChatService;
import com.codervibe.utils.ChatAPIUtils;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.zhipu.oapi.service.v4.image.ImageResult;
import com.zhipu.oapi.service.v4.model.ModelData;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;@Service("chatService")
public class ChatServiceImpl implements ChatService {Logger logger = LoggerFactory.getLogger(ChatServiceImpl.class);/*** AI 对话* @param content*/@Overridepublic ModelData AIdialogue(String content) {logger.info(ChatAPIUtils.InvokeApi(content).getChoices().get(0).getMessage().getContent().toString());return ChatAPIUtils.InvokeApi(content);}/*** AI  画图** @param content*/@Overridepublic ImageResult AIcreateimage(String content) {logger.info(ChatAPIUtils.CreateImage(content).getData().get(0).getUrl());return ChatAPIUtils.CreateImage(content);}
}
  • controller 层调用 service
****package com.codervibe.web.controller;import com.codervibe.server.service.ChatService;
import com.codervibe.utils.ChatAPIUtils;
import com.codervibe.web.common.response.R;
import com.fasterxml.jackson.core.JsonProcessingException;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import javax.annotation.Resource;@RestController
@RequestMapping("/chat")
public class ChatController {Logger logger = LoggerFactory.getLogger(ChatController.class);@Resourceprivate ChatService chatService;@PostMapping("/content")public R chat(@RequestParam("content") String content) {return R.ok().data("content", chatService.AIdialogue(content));}@PostMapping("/AIcreateimage")public R AIcreateimage(@RequestParam("content") String content){return R.ok().data("image",chatService.AIcreateimage(content));}
}
  • 现在 虽然可以 和 AI 进行对话 但是 数据返回的速度实在是太慢 所以我打算 将 常见的问题和答案 存储在本地的数据库中以提升 数据返回的速度 这只是一个初步的想法
  • 最后的想法 还未实现 先这样
  • 粉丝群 企鹅 179469398

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

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

相关文章

Python 字符串格式化输出

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站零基础入门的AI学习网站~。 前言 字符串格式化是编程中一个常见的需求&#xff0c;它可以们将不同类型的数据&#xff08;如数字、文本、日…

JVM-JVM中对象的生命周期

申明&#xff1a;文章内容是本人学习极客时间课程所写&#xff0c;文字和图片基本来源于课程资料&#xff0c;在某些地方会插入一点自己的理解&#xff0c;未用于商业用途&#xff0c;侵删。 原资料地址&#xff1a;课程资料 对象的创建 常量池检查:检查new指令是否能在常量池…

openEuler 22.03 LTS 上源码安装 PostgreSQL 15

安装PostgreSQL 15 1 安装必要的依赖 #yum install -y readline-devel zlib-devel gcc2、下载源码 # wget https://ftp.postgresql.org/pub/source/v15.6/postgresql-15.6.tar.gz # tar -xzvf postgresql-15.6.tar.gz3 配置 # cd postgresql-15.6/ # ./configure4 编译安装…

Matlab|基于支持向量机的电力短期负荷预测【三种方法】

目录 主要内容 部分代码 结果一览 下载链接 主要内容 该程序主要是对电力短期负荷进行预测&#xff0c;采用三种方法&#xff0c;分别是最小二乘支持向量机&#xff08;LSSVM&#xff09;、标准粒子群算法支持向量机和改进粒子群算法支持向量机三种方法对负荷进行…

Nginx反向代理多虚拟主机节点服务器

IP规划: servera,serverd作为web服务器 serverb作为nginx负载均衡服务器 serverc域名映射服务器 servera(192.168.233.132)配置: # 安装Nginx yum install nginx -y# 进入Nginx配置文件目录 cd /etc/nginx/conf.d/# 编辑配置文件&#xf…

讲解用Python处理Excel表格

我们今天来一起探索一下用Python怎么操作Excel文件。与word文件的操作库python-docx类似&#xff0c;Python也有专门的库为Excel文件的操作提供支持&#xff0c;这些库包括xlrd、xlwt、xlutils、openpyxl、xlsxwriter几种&#xff0c;其中我最喜欢用的是openpyxl&#xff0c;这…

【天幕系列 02】开源力量:揭示开源软件如何成为技术演进与社会发展的引擎

文章目录 导言01 开源软件如何推动技术创新1.1 开放的创新模式1.2 快速迭代和反馈循环1.3 共享知识和资源1.4 生态系统的建设和扩展1.5 开放标准和互操作性 02 开源软件的商业模式2.1 支持和服务模式2.2 基于订阅的模式2.3 专有附加组件模式2.4 开源软件作为平台模式2.5 双重许…

【计算机网络】物理层|传输介质|物理层设备|宽带接入技术

目录 一、思维导图 二、传输介质 1.传输介质——导引型 2.传输介质——非导引型​编辑 三、物理层设备 1.物理层设备&#xff1a;中继器&集线器 2.宽带接入技术&#xff08;有线&#xff09; ​编辑 四、趁热打铁☞习题训练 五、物理层总思维导图 推荐 前些天发现…

【C++】友元、内部类和匿名对象

&#x1f497;个人主页&#x1f497; ⭐个人专栏——C学习⭐ &#x1f4ab;点击关注&#x1f929;一起学习C语言&#x1f4af;&#x1f4ab; 目录 1. 友元 1.1 友元函数 1.2 友元类 2. 内部类 2.1 成员内部类 2.2 局部内部类 3. 匿名对象 3.1 基本概念 3.1 隐式转换 1…

Node.js开发-MongoDB

MongoDB 1) Mongoose2) 插入文档3) 字段类型4) 字段值验证5) CRUD1) 增加2) 删除3) 更新4) 查询 6) 条件控制1) 运算符2) 逻辑运算3) 正则匹配 7) 个性化读取1) 字段筛选2) 数据排序3) 数据截取 1) Mongoose 介绍 Mongoose 是一个对象文档模型库&#xff0c;官网 http://www.…

在已有代码基础上创建Git仓库

在已有代码基础上创建Git仓库 背景方法处理问题 背景 先进行了代码编写&#xff0c;后续想放入仓库方便大家一起合作开发&#xff0c;此时需要在已有代码的基础上建立仓库。 方法 首先在Gitee或者GitHub上创建仓库&#xff0c;这里以Gitee为例。创建完后&#xff0c;我们可以…

各类有关于花卉的深度学习数据集

花卉的识别和分类在深度学习过程中是最常见的使用的案例&#xff0c;因此各类有关花卉分类、识别、计数的图像数据集是大家都常用的数据集。最近收集到各类有关花卉的各类数据集分享给大家&#xff01;&#xff01; 1、16种花常见的图像数据集 数据说明&#xff1a;我们看到我…

Blazor SSR/WASM IDS/OIDC 单点登录授权实例1-建立和配置IDS身份验证服务

目录: OpenID 与 OAuth2 基础知识Blazor wasm Google 登录Blazor wasm Gitee 码云登录Blazor SSR/WASM IDS/OIDC 单点登录授权实例1-建立和配置IDS身份验证服务Blazor SSR/WASM IDS/OIDC 单点登录授权实例2-登录信息组件wasmBlazor SSR/WASM IDS/OIDC 单点登录授权实例3-服务端…

1070A A. Find a Number bfs同时处理数和数位和 ,依次处理每一位数

Problem - 1070A - Codeforces A - Find a Number CodeForces - 1070A -记忆化广搜-同余定理_codeforces 1070a find a number(bfs)-CSDN博客 这个大佬的博客代码写的非常好看。 ———— &#xff08;其实第二个样例32位的数long long存不下&#xff0c;就知道这道题不是寻…

【实战】一、Jest 前端自动化测试框架基础入门(二) —— 前端要学的测试课 从Jest入门到TDD BDD双实战(二)

文章目录 一、Jest 前端自动化测试框架基础入门5.Jest 中的匹配器toBe 匹配器toEqual匹配器toBeNull匹配器toBeUndefined匹配器和toBeDefined匹配器toBeTruthy匹配器toBeFalsy匹配器数字相关的匹配器字符串相关的匹配器数组相关的匹配器异常情况的匹配器 6.Jest 命令行工具的使…

DSA 经典数据结构与算法 学习心得和知识总结(三) |有向无环图及其应用

目录结构 注&#xff1a;提前言明 本文借鉴了以下博主、书籍或网站的内容&#xff0c;其列表如下&#xff1a; 1、参考书籍&#xff1a;《算法导论》第三版 就是这本被封神的杰作&#xff0c;就是它&#x1f926; 2、参考书籍&#xff1a;《数据结构》严奶奶版 3、参考书…

DataX源码分析-插件机制

系列文章目录 一、DataX详解和架构介绍 二、DataX源码分析 JobContainer 三、DataX源码分析 TaskGroupContainer 四、DataX源码分析 TaskExecutor 五、DataX源码分析 reader 六、DataX源码分析 writer 七、DataX源码分析 Channel 八、DataX源码分析-插件机制 文章目录 系列文章…

基于GPT一键完成数据分析全流程的AI Agent: Streamline Analyst

大型语言模型&#xff08;LLM&#xff09;的兴起不仅为获取知识和解决问题开辟了新的可能性&#xff0c;而且催生了一些新型智能系统&#xff0c;例如旨在辅助用户完成特定任务的AI Copilot以及旨在自动化和自主执行复杂任务的AI Agent&#xff0c;使得编程、创作等任务变得高效…

Prompt Tuning:深度解读一种新的微调范式

阅读该博客&#xff0c;您将系统地掌握如下知识点&#xff1a; 什么是预训练语言模型&#xff1f; 什么是prompt&#xff1f;为什么要引入prompt&#xff1f;相比传统fine-tuning有什么优势&#xff1f; 自20年底开始&#xff0c;prompt的发展历程&#xff0c;哪些经典的代表…

【ASP.NET Core 基础知识】--最佳实践和进阶主题--微服务和容器化

Tip&#xff1a;想要了解并学习微服务和容器化的知识&#xff0c;请跳转到《Docker极简教程》 一、微服务概述 1.1 什么是微服务&#xff1f; 微服务&#xff08;Microservices&#xff09;是一种软件架构风格&#xff0c;其中软件系统被划分为一组小型、自治的服务单元&…