开源模型应用落地-业务整合篇(三)

一、前言

    在之前的两篇文章中,我们学习了如何构建基本的即时消息(IM)功能。今天,我们将进一步将IM模块与AI服务进行连接,实现用户提问并由模型进行回答,最后将结果展示在用户界面上。


二、术语

2.1. Spring Boot

    是一个用于快速构建基于Spring框架的Java应用程序的开源框架。它简化了Spring应用程序的初始化和配置过程,使开发人员能够更专注于业务逻辑的实现。

2.2. 读超时时间(Read Timeout)

    是指在进行网络通信时,接收数据的操作所允许的最长等待时间。当一个请求被发送到服务器,并且在规定的时间内没有收到服务器的响应数据,就会触发读超时错误。读超时时间用于控制客户端等待服务器响应的时间,以防止长时间的阻塞。

2.3. 写超时时间(Write Timeout)

    是指在进行网络通信时,发送数据的操作所允许的最长等待时间。当一个请求被发送到服务器,但在规定的时间内无法将数据完全发送完成,就会触发写超时错误。写超时时间用于控制客户端发送数据的时间,以防止长时间的阻塞。

2.4. 连接超时时间(Connection Timeout)

    是指在建立网络连接时,客户端尝试连接到服务器所允许的最长等待时间。当一个客户端尝试连接到服务器时,如果在规定的时间内无法建立连接,就会触发连接超时错误。连接超时时间用于控制客户端与服务器建立连接的时间,以防止长时间的等待。


三、前置条件

3.1. 调通最基本的WebSocket流程(参见开源模型应用落地-业务整合篇(二))

3.2. 已经部署至少单节点的AI服务


四、技术实现 

# 打通IM和AI服务之间的通道

4.1. 新增AI服务调用的公共类

import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import okhttp3.MediaType;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.util.Objects;@Slf4j
@Component
public class AIChatUtils {@Autowiredprivate AIConfig aiConfig;private Request buildRequest(Long userId, String prompt) throws Exception {//创建一个请求体对象(body)MediaType mediaType = MediaType.parse("application/json");RequestBody requestBody = RequestBody.create(mediaType, prompt);return buildHeader(userId, new Request.Builder().post(requestBody)).url(aiConfig.getUrl()).build();}private Request.Builder buildHeader(Long userId, Request.Builder builder) throws Exception {return builder.addHeader("Content-Type", "application/json").addHeader("userId", String.valueOf(userId)).addHeader("secret",generateSecret(userId))}/*** 生成请求密钥** @param userId 用户ID* @return*/private String generateSecret(Long userId) throws Exception {String key = aiConfig.getServerKey();String content = key + userId + key;MessageDigest digest = MessageDigest.getInstance("SHA-256");byte[] hash = digest.digest(content.getBytes(StandardCharsets.UTF_8));StringBuilder hexString = new StringBuilder();for (byte b : hash) {String hex = Integer.toHexString(0xff & b);if (hex.length() == 1) {hexString.append('0');}hexString.append(hex);}return hexString.toString();}public String chatStream(ApiReqMessage apiReqMessage) throws Exception {//定义请求的参数String prompt = JSON.toJSONString(AIChatReqVO.init(apiReqMessage.getContents(), apiReqMessage.getHistory()));log.info("【AIChatUtils】调用AI聊天,用户({}),prompt:{}",  apiReqMessage.getUserId(), prompt);//创建一个请求对象Request request = buildRequest(apiReqMessage.getUserId(), prompt);InputStream is = null;try {// 从线程池获取http请求并执行Response response =OkHttpUtils.getInstance(aiConfig).getOkHttpClient().newCall(request).execute();// 响应结果StringBuffer resultBuff = new StringBuffer();//正常返回if (response.code() == 200) {//打印返回的字符数据is = response.body().byteStream();byte[] 

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

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

相关文章

python 编写dll给c++调用

Python可以通过ctypes库将Python函数封装为DLL文件,以便C程序调用。下面是一个简单的示例: 创建一个Python脚本,其中包含要封装的函数,例如: def add(x, y): return x y 将该脚本编译为DLL文件。可以使用pyinstalle…

深入浅出AI落地应用分析:AI音乐生成之「Suno.ai」

接下来会每周集中体验一些通用或者垂直的AI落地应用,主要以一些全球或者国外国内排行较前的产品为研究对象,「AI 产品榜: aicpb.com」以专题的方式在博客进行分享。 本节主要介绍和体验AI音乐生成应用产品Suno AI,Suno来自目前最…

HQL,SQL刷题简单查询,基础,尚硅谷

今天刷SQL简单查询,大家有兴趣可以刷一下 目录 相关表数据: 题目及思路解析: 总结归纳: 知识补充: 关于LIKE操作符/运算符 LIKE其他使用场景包括 LIKE模糊匹配情况 相关表数据: 1、student_info表 2、sc…

Unity中URP下获取主灯信息

文章目录 前言一、计算BulinnPhone的函数有两个重载1、 目前最新使用的是该方法(这是我们之后主要分析的函数)2、 被淘汰的老方法,需要传入一堆数据 二、GetMainLight1、Light结构体2、GetMainLight具有4个方法重载3、1号重载干了什么&#x…

主动轮廓——计算机视觉中的图像分割方法

​ 一、说明 简单来说,计算机视觉就是为计算机提供类似人类的视觉。作为人类,我们很容易识别任何物体。我们可以很容易地识别山丘、树木、土地、动物等,但计算机没有眼睛,也没有大脑,因此它很难识别任何图像。计算机只…

Linux下软件安装的命令【RPM,YUM】及常用服务安装【JDK,Tomcat,MySQL】

Linux下软件安装的命令 源码安装 以源代码安装软件,每次都需要配置操作系统、配置编译参数、实际编译,最后还要依据个人喜好的方式来安装软件。这个过程很麻烦很累人。 RPM软件包管理 RPM安装软件的默认路径: 注意: /etc 配置文件放置目录…

docker network网络

网络分类 bridge网络 bridge是docker默认网络模式,docker安装后会选择一个私有网段作为bridge的子网,在我们创建容器时默认会将容器网络加入到这个子网中。 原理:Docker Daemon(后台进程) 利用 veth pair 技术&#…

502. IPO(贪心算法+优先队列/堆)

整体思想:在满足可用资金的情况下,选择其中利润最大的业务,直到选到k个业务为止,注意k可能比n大。 每次选择完一个业务,可用资金都会变动,这是可选择的业务也会变化,因此每次将可选择的业务放在…

3dmax渲不出模型是什么原因---模大狮模型网

3DMax无法渲染模型可能有多种原因。以下是一些常见的问题和解决方法: 材质设置错误:检查模型的材质设置是否正确,包括纹理贴图的路径、UV映射是否正确等。确保材质的属性设置正确,如颜色、反射率、透明度等。 灯光设置问题&#…

【JS逆向学习】某壁纸下载(ast混淆)

逆向目标 目标网址:https://bz.zzzmh.cn/index逆向接口一:https://api.zzzmh.cn/bz/v3/getData逆向接口二:https://cdn2.zzzmh.cn/wallpaper/origin/0d7d8d691e644989b72ddda5f695aca2.jpg?response-content-dispositionattachment&aut…

AnimatedDrawings:让绘图动起来

老样子,先上图片和官网。这个项目是让绘制的动画图片动起来,还能绑定人体的运动进行行为定制。 快速开始 1. 下载代码并进入文件夹,启动一键安装 git clone https://github.com/facebookresearch/AnimatedDrawings.gitcd AnimatedDrawingspip…

react18介绍

改进已有属性,如自动批量处理【setState】、改进Suspense、组件返回undefined不再报错等 支持Concurrent模式,带来新的API,如useTransition、useDeferredValue等 如何升级React 18 npm install reactlatest react-domlatestnpm install ty…

VS2022 在非Qt项目中引用QString、QList等方法

目录 一、新建项目 二、拷贝 三、工程属性设置 四、测试 一、新建项目 在VS中创建了一个c控制台项目,会默认打印“Hello world”; 二、拷贝 需要拷贝的包括QtCore相关的lib, dll, 以及头文件; 1、lib文件 在下述qt安装路径下拷贝Qt5…

[设计模式Java实现附plantuml源码~创建型] 对象的克隆~原型模式

前言: 为什么之前写过Golang 版的设计模式,还在重新写Java 版? 答:因为对于我而言,当然也希望对正在学习的大伙有帮助。Java作为一门纯面向对象的语言,更适合用于学习设计模式。 为什么类图要附上uml 因为很…

07章【常用类库API】

字符串操作 String类 String可以表示一个字符串。String类实际是使用字符数组存储的。 String类的两种赋值方式: 一种称为直接赋值: String name “小白” 通过关键字new调用String的构造方法赋值 String name new String(“小白”)String类的两…

c++学习理解之路——基类指针指向子类

参考:基类指针指向子类对象_基类指针可以指向子类-CSDN博客 笔记(基于自己的理解,欢迎讨论) 基类指针对象只存储跟基类中的成员函数、成员对象相关信息,子类指针对象存储了子类和基类中的信息。按道理来说&#xff0c…

【Github】作为程序员不得不知道的几款Github加速神器

背景 众所周知,近几年国内用户在访问Github时,经常间歇性无法访问Github。 接下来推荐几款 作为程序员不得不知道的Github加速神器。 推荐1:FastGithub FastGithub是一款Github加速神器,解决github打不开、用户头像无法加载、r…

【数据结构和算法】--- 二叉树(3)--二叉树链式结构的实现(1)

目录 一、二叉树的创建(伪)二、二叉树的遍历2.1 前序遍历2.2 中序遍历2.3 后序遍历 三、二叉树节点个数及高度3.1 二叉树节点个数3.2 二叉树叶子节点个数3.3二叉树第k层节点个数3.4 二叉树查找值为x的节点 四、二叉树的创建(真) 一、二叉树的创建(伪) 在学习二叉树的基本操作前…

使用Python基于metricbeat和heartbeat采集数据进行告警

一、系统架构 IP主机名角色备注11.0.1.11kafka1kafka和MySQL11.0.1.12kafka2kafka11.0.1.13kafka3kafka11.0.1.14demo1metricbeat和heartbeat 二、部署Kafka 省略 二、部署Metricbeat和Heartbeat metricbeat配置: metricbeat.config.modules:path: ${path.confi…

电商铺货上货接口API实现无货源上货(1688/淘宝/京东/拼多多)

获取商品列表接口 item_search 获取商品详情页数据接口 item_get 1688.item_get 公共参数 获取API测试权限和地址 名称类型必须描述keyString是调用key(必须以GET方式拼接在URL中)secretString是调用密钥api_nameString是API接口名称(包…