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/680293.shtml

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

相关文章

C++ Qt框架开发 | 基于Qt框架开发实时成绩显示排序系统(2)折线图显示

对上一篇的工作C学习笔记 | 基于Qt框架开发实时成绩显示排序系统1-CSDN博客继续优化&#xff0c;增加一个显示运动员每组成绩的折线图。 1&#xff09;在Qt Creator的项目文件&#xff08;.pro文件&#xff09;中添加对Qt Charts模块的支持&#xff1a; QT charts 2&#xf…

鸿蒙开发第3篇__大数据量的列表加载性能优化

列表 是最常用到的组件 一 ForEach 渲染控制语法————Foreach Foreach的作用 遍历数组项&#xff0c;并创建相同的布局组件块在组件加载时&#xff0c; 将数组内容数据全部创建对应的组件内容&#xff0c; 渲染到页面上 const swiperImage: Resource[] {$r("app.me…

django实现外键

一&#xff1a;介绍 在Django中&#xff0c;外键是通过在模型字段中使用ForeignKey来实现的。ForeignKey字段用于表示一个模型与另一个模型之间的多对一关系。这通常用于关联主键字段&#xff0c;以便在一个模型中引用另一个模型的相关记录。 下面是一个简单的例子&#xff0…

【go语言】一个简单HTTP服务的例子

一、Go语言安装 Go语言&#xff08;又称Golang&#xff09;的安装过程相对简单&#xff0c;下面是在不同操作系统上安装Go语言的步骤&#xff1a; 在Windows上安装Go语言&#xff1a; 访问Go语言的官方网站&#xff08;golang.org&#xff09;或者使用国内镜像站点&#xff0…

pythontimer模块使用教程_Python time模块详解(常用函数实例讲解,非常好)

pythontimer模块使用教程_Python time模块详解&#xff08;常用函数实例讲解,非常好&#xff09; weixin_39870664 于 2020-12-13 04:37:56 发布 阅读量709 收藏 点赞数 文章标签&#xff1a; pythontimer模块使用教程 版权 在开始之前&#xff0c;首先要说明这几点&#xff1…

使用遗传算法解决微分方程的参数估算问题

目录 前言 一、使用传染病模型SIR模型 二、使用步骤 1.使用SIR模型

HeidiSQL安装配置(基于小皮面板(phpstudy))连接MySQL

下载资源 对于这款图形化工具&#xff0c;博主建议通过小皮面板&#xff08;phpstudy&#xff09;来下载即可&#xff0c;也是防止你下载到钓鱼软件&#xff0c;小皮面板&#xff08;phpstudy&#xff09;如果你不懂是什么&#xff0c;请看下面链接这篇博客 第二篇&#xff1a;…

车载诊断协议DoIP系列 —— OSI模型DoIP参考

车载诊断协议DoIP系列 —— OSI模型DoIP参考 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师(Wechat:gongkenan2013)。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 本就是小人物,输了就是输了,不要在意别人怎么看自己。江湖一碗茶,喝完再…

nodejs学习计划--(十)会话控制及https补充

一、会话控制 1.介绍 所谓会话控制就是 对会话进行控制 HTTP 是一种无状态的协议&#xff0c;它没有办法区分多次的请求是否来自于同一个客户端&#xff0c; 无法区分用户 而产品中又大量存在的这样的需求&#xff0c;所以我们需要通过 会话控制 来解决该问题 常见的会话控制…

Java编程练习之类的继承

1.创建银行卡类&#xff0c;并分别设计两个储蓄卡和信用卡子类。 import javax.swing.plaf.BorderUIResource;import java.util.Scanner;class Card {int Id; //银行卡&#xff1b;int password; //密码&#xff1b;double balance2000; //账户存款金额&#xff1b;String A…

JavaScript 设计模式之外观模式

外观模式 我们为啥要使用外观模式呢&#xff0c;其实我们在使用各种 js 库的时候常常会看到很多的外观者模式&#xff0c;也正是这些库的大量使用&#xff0c;所以使得兼容性更广泛&#xff0c;通过外观者模式来封装多个功能&#xff0c;简化底层操作方法 const A {g: functi…

正则表达式与正则可视化工具:解密文本处理的利器

正则表达式与正则可视化工具&#xff1a;解密文本处理的利器 引言 在计算机科学和软件开发领域&#xff0c;正则表达式是一种强大而灵活的文本处理工具。然而&#xff0c;对于初学者来说&#xff0c;正则表达式的语法和规则可能会显得晦涩难懂。为了帮助初学者更好地理解和学…

Ubuntu Desktop 开机数字小键盘

Ubuntu Desktop 开机数字小键盘 1. 开机数字小键盘References 1. 开机数字小键盘 一般情况下&#xff0c;Ubuntu 开机后小键盘区是控制方向键而非数字键&#xff0c;每次开机后若用到数字键都需要按下 NumLock 键。 References [1] Yongqiang Cheng, https://yongqiang.blog…

ubuntu快速安装miniconda

ubuntu快速安装miniconda 环境 ubuntu.22.04 显卡 RTX 3050 关于选择Miniconda还是Anaconda的问题&#xff0c;Anaconda安装包比较大&#xff0c;耗时比较长&#xff0c;如果你是绝对的初学者&#xff0c;选择Anaconda会比较稳妥一些&#xff1b;否则建议你还是选择Miniconda安…

前端性能优化的策略和技术手段总结

前端性能优化是提高用户体验和网站运行效率的重要环节。以下是一些常见的策略和技术手段&#xff0c;用于优化前端性能&#xff1a; 1. 优化资源加载 - 合并资源&#xff1a;将多个文件合并为一个文件&#xff0c;减少HTTP请求次数。 - 压缩资源&#xff1a;压缩CSS、J…

linux系统下vscode portable版本的python环境搭建003:venv

这里写自定义目录标题 python安装方案一. 使用源码安装&#xff08;有[构建工具](https://blog.csdn.net/ResumeProject/article/details/136095629)的情况下&#xff09;方案二.使用系统包管理器 虚拟环境安装TESTCG 本文目的&#xff1a;希望在获得一个新的系统之后&#xff…

LeetCode:67.二进制求和

67. 二进制求和 - 力扣&#xff08;LeetCode&#xff09; 又是一道求和题&#xff0c;% / 在求和的用途了解了些&#xff0c; 目录 题目&#xff1a; 思路分析&#xff1a; 博主代码: 官方代码&#xff1a; 每日表情包&#xff1a; 题目&#xff1a; 思路分析&#xf…

2024-02-12 Unity 编辑器开发之编辑器拓展3 —— EditorGUI

文章目录 1 GUILayout2 EditorGUI 介绍3 文本、层级、标签、颜色拾取3.1 LabelField3.2 LayerField3.3 TagField3.4 ColorField3.5 代码示例 4 枚举选择、整数选择、按下按钮4.1 EnumPopup / EnumFlagsField4.2 IntPopup4.3 DropdownButton4.4 代码示例 5 对象关联、各类型输入…

Linux基础I/O(三)——缓冲区和文件系统

文章目录 什么是C语言的缓冲区理解文件系统理解软硬链接 什么是C语言的缓冲区 C语言的缓冲区其实就是一部分内存 那么它的作用是什么&#xff1f; 下面有一个例子&#xff1a; 你在陕西&#xff0c;你远在山东的同学要过生日了&#xff0c;你打算送给他一份生日礼物。你有两种方…

Centos9部署LAMP

配置LAMP 参考文档 https://blog.csdn.net/weixin_51432789/article/details/112254685 首先安装 yum install -y libxml2-devel 安装apr-1.7.4 解压 tar xf apr-1.7.4.tar.gz 安装以来 yum -y install gcc cd apr-1.7.4/ 预编译 ./configure --prefix/usr/local/…