当前位置: 首页 > news >正文

把ChatGPT接入我的个人网站

效果图

在这里插入图片描述

详细内容和使用说明可以查看我的个人网站文章 把ChatGPT接入我的个人网站

献给有外网服务器的小伙伴

如果你本人已经有一台外网的服务器,并且页拥有一个OpenAI API Key,那么下面就可以参照我的教程来搭建一个自己的ChatGPT。

需要的环境

  • Centos7(其他服务器也行)
  • nodejs

这里主要用到了node环境,所有的代码也是由JavaScript编写

安装依赖库

首先需要安装OpenAI提供的js库——openai,使用npm安装即可

npm install openai

然后再安装一个用于后面管理js后台运行的库——forever

npm install forever

编写代码

const WebSocket = require('ws')
const {Configuration, OpenAIApi} = require('openai')const wss = new WebSocket.Server({port:8080})
const config = new Configuration({apiKey: 'OPENAI_API_KEY'}); //这里的OPENAI_API_KEY是你自己的keyconst openai = new OpenAIApi(config);const welcomeStr = "Hello,我是胡海龙,这是我基于OpenAI搭建的类似ChatWindow,你可以像使用ChatGPT一样来使用它,如何搭建以及源码可以联系我:hhlworkspace@qq.com";wss.on('connection', ws=>{ws.on('message', async (message)=>{if(message =='[$check$]'){ws.send('[$alive$]')}else{const completion = await openai.createCompletion({model: 'text-davinci-003',prompt: ''+message,max_tokens: 2048,stream: true,user: 'huhailong1121'},{responseType: 'stream'});completion.data.on("data",(data)=>{const lines = data?.toString()?.split("\n").filter((line) => line.trim() !== "");for (const line of lines) {const message = line.replace(/^data: /, "");if (message === "[DONE]") {break; // Stream finished}try {const parsed = JSON.parse(message);ws.send(parsed.choices[0].text)} catch (error) {console.error("Could not JSON parse stream message", message, error);}}})}})
})

上面的代码含义:开启一个Websocket服务,然后接收到用户发送的消息后,使用openai库发起请求,然后把返回的数据推给前端用户,前端用户接收的时候用解析markdown的组件接收就可以。下面主要说一下请求openai的部分

const {Configuration, OpenAIApi} = require('openai')
const config = new Configuration({apiKey: 'OPENAI_API_KEY'});const openai = new OpenAIApi(config);const completion = await openai.createCompletion({model: 'text-davinci-003',prompt: ''+message,max_tokens: 2048,stream: true,user: 'huhailong1121'},{responseType: 'stream'});completion.data.on("data",(data)=>{const lines = data?.toString()?.split("\n").filter((line) => line.trim() !== "");for (const line of lines) {const message = line.replace(/^data: /, "");if (message === "[DONE]") {break; // Stream finished}try {const parsed = JSON.parse(message);ws.send(parsed.choices[0].text)} catch (error) {console.error("Could not JSON parse stream message", message, error);}}})

首先是引入openai库中的 Configuration, OpenAIApi,然后配置apiKey,配置好以后创建请求——openai.createCompletion,注意,这里要使用同步去处理以下,参数的含义:

  • model:使用的模型,目前新的模型是text-davinci-003
  • prompt:用户的提问和需求
  • max_tokens:这个参数决定了能一次返回多少长度的结果,如果不是用stream的话这个设置的小可能会导致结果被截断
  • stream:是否使用流方式返回结果,我这里使用了流方式返回结果,因为这样可以给用户更全的数据,不会截断,而且不会造成长时间阻塞,可以实时的动态的生成结果,给用户的体验更好
  • user:用户标识,这个不设置也可以,还有其他更多的参数可以参考网上的资料

使用流后需要对data进行监听,监听中将返回的流先转为字符串,然后通过换行截取,去掉头部的data字符串后剩余的可以转为一个json对象,其中choices数组里面的text就是我们要的结果,所以将它发送给用户即可。

前端代码相对简单,就是单纯的websocket接收数据,然后渲染,只是样式上需要设计和调整,如果有需要前端代码的小伙伴也可以联系我,无偿分享,联系方式见文章上半部分。

相关文章:

把ChatGPT接入我的个人网站

效果图 详细内容和使用说明可以查看我的个人网站文章 把ChatGPT接入我的个人网站 献给有外网服务器的小伙伴 如果你本人已经有一台外网的服务器,并且页拥有一个OpenAI API Key,那么下面就可以参照我的教程来搭建一个自己的ChatGPT。 需要的环境 Cento…...

关于数字游民是未来年轻人工作趋势的一种思考

Q:我觉得未来,数字游民会是中国工作的一种主流方式,因为实体行业受到严重冲击,科技的发展是推导支持这样的远程工作形式,而且未来人的时间是越来越离散化、碎片化、原子化的,以订单交付的形式,P2P的形式会是…...

2022年 合肥市经开区信息学竞赛区赛 初中组

2022年 合肥市经开区信息学竞赛区赛 初中组T1.普通排序 题目描述 牛牛是一位编程爱好者,今天第一次参加初中组比赛,看到第一题,不要紧张,来一个简单的排序题做一做,牛牛学过了很多排序,一直想练个手,这回机会来了,给牛牛N个数(n<=100),每个数都在(0 ~ 1000)之间…...

【工作小札】自定义classloader实现热加载jar

文章目录楔子第一步&#xff1a;添加maven依赖第二步&#xff1a;创建jar包路径构造类第三步&#xff1a;定义需要被加载的jar的目录结构第四步&#xff1a;创建自定义类加载器1 继承ClassLoader并实现Closeable接口2 标记该加载器支持并行类加载机制3 私有化构造方法&#xff…...

spring—AOP

系列文章目录 Spring中AOP技术的学习 文章目录系列文章目录前言一、AOP核心概念二、AOP入门案例1.AOP入门案例思路分析2.AOP入门案例实现三、AOP工作流程四、AOP切入点表达式五、AOP通知类型六、案例&#xff1a;测量业务层接口万次执行效率1.项目结构2.实现类七、AOP获取通知…...

自己曾经的C++笔记【在c盘爆满的时候找到的回忆】

文章目录**C与C的区别** (二&#xff09;类和对象构造函数和析构函数C特殊成员C友元C类的继承C虚函数和多态C模板C可变参模板CSTL容器篇C迭代器C仿函数C函数适配器CSTL算法C智能指针C类型推断CIO流C正则表达式具有特殊意义的元字符量词元字符校验数字的表达式校验字符的表达式特…...

Nginx 实战-负载均衡

一、负载均衡今天学习一下Nginx的负载均衡。由于传统软件建构的局限性&#xff0c;加上一台服务器处理能里的有限性&#xff0c;在如今高并发、业务复杂的场景下很难达到咱们的要求。但是若将很多台这样的服务器通过某种方式组成一个整体&#xff0c;并且将所有的请求平均的分配…...

本周大新闻|128GB版Quest 2再降价,Mojo Vision完成“新A轮”融资

本周XR大新闻&#xff0c;AR方面&#xff0c;DigiLens推出SRG表面浮雕光栅衍射光波导&#xff1b;索尼成立Sony Research&#xff1b;NuEyes推出牙医场景AR眼镜NuLoupes&#xff1b;苹果EMG手环、AR/VR眼球追踪专利公布。 VR方面&#xff0c;128GB版Quest 2降至349美元&#x…...

【论文阅读】如何给模型加入先验知识

如何给模型加入先验知识 1. 基于pretain模型给模型加入先验 把预训练模型的参数导入模型中&#xff0c;这些预训练模型在另一个任务中已经p retrain好了模型的weight,往往具备了一些基本图片的能力 2. 基于输入给模型加入先验 比如说鸟类的头部是一个重要的区分部分&#x…...

arm系列交叉编译器各版本区别

目录交叉编译器命名规则具体编译器举例crosstool-ng交叉编译工具样本arm交叉编译器举例几个概念ABI与EABIgnueabi与gnueabihf参考交叉编译器命名规则 交叉编译器的命名规则&#xff1a;arch [-vendor] [-os] [-(gnu)eabi] [-language] arch - 体系架构&#xff0c; 如arm&…...

随笔记录工作日志

工作中遇到的问题随笔记录 1、将map集合中的key/value数据按照一定的需求过滤出来&#xff0c;并将过滤出来的map的key值存到list集合中 首先想到的是stream流&#xff0c;但是我对stream流的用法基本不熟&#xff0c;记不住方法&#xff0c;如果坚持用stream流去实现这个需求…...

LinkedHashMap源码分析以及LRU的应用

LinkedHashMap源码分析以及LRU的应用 LinkedHashMap简介 LinkedHashMap我们都知道是在HashMap的基础上&#xff0c;保证了元素添加时的顺序&#xff1b;除此之外&#xff0c;它还支持LRU可以当做缓存中心使用 源码分析目的 分析保持元素有序性是如何实现的 LRU是如何实现的…...

【每日一题Day166】LC1053交换一次的先前排列 | 贪心

交换一次的先前排列【LC1053】 给你一个正整数数组 arr&#xff08;可能存在重复的元素&#xff09;&#xff0c;请你返回可在 一次交换&#xff08;交换两数字 arr[i] 和 arr[j] 的位置&#xff09;后得到的、按字典序排列小于 arr 的最大排列。 如果无法这么操作&#xff0c;…...

Canal增量数据订阅和消费——原理详解

文章目录 简介工作原理MySQL主备复制原理canal 工作原理Canal-HA机制应用场景同步缓存 Redis /全文搜索 ES下发任务数据异构简介 canal 翻译为管道,主要用途是基于 MySQL 数据库的增量日志 Binlog 解析,提供增量数据订阅和消费。 早期阿里巴巴因为杭州和美国双机房部署,存…...

为什么要使用线程池

Java线程的创建非常昂贵&#xff0c;需要JVM和OS&#xff08;操作系统&#xff09;配合完成大量的工作&#xff1a; (1)必须为线程堆栈分配和初始化大量内存块&#xff0c;其中包含至少1MB的栈内存。 (2)需要进行系统调用&#xff0c;以便在OS&#xff08;操作系统&#xff09;…...

在云服务部署前后端以及上传数据库

1.上传数据库(sql文件) 首先建立一个目录&#xff0c;用于存放要部署的sql文件&#xff0c;然后在此目录中进入mysql 进入后建立一个数据库&#xff0c;create database 数据库名 完成后&#xff0c;通过select * from 表名可以查到数据说明导入成功。 2.部署Maven后端 将Ma…...

Onedrive for Business迁移方案 | 分享一

文章目录 前言 一、Onedrive for Business迁移方案应用范围? 1.准备目标平台 2.导出源平台数据 <...

pt01数据类型、语句选择

python01 pycharm常用快捷键 (1) 移动到本行开头&#xff1a;home键 (2) 移动到本行末尾&#xff1a;end键盘 (3) 注释代码&#xff1a;ctrl / (4) 复制行&#xff1a;ctrl d #光标放行上 (5) 删除行&#xff1a;shift delete (6) 选择列&#xff1a;shift alt 鼠标左键…...

ChatGPT 存在很大的隐私问题

当 OpenAI 发布时 2020 年 7 月的 GPT-3&#xff0c;它提供了用于训练大型语言模型的数据的一瞥。 根据一篇技术论文&#xff0c;从网络、帖子、书籍等中收集的数百万页被用于创建生成文本系统。 在此数据中收集的是您在网上分享的一些关于您自己的个人信息,这些数据现在让 O…...

图的迭代深度优先遍历

图的深度优先遍历(或搜索)类似于树的深度优先遍历(DFS)。这里唯一的问题是,与树不同,图可能包含循环,因此一个节点可能会被访问​​两次。为避免多次处理一个节点,请使用布尔访问数组。 例子: 输入: n = 4, e = 6 0 -> 1, 0 -> 2, 1 -> 2, 2 -> 0, …...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容

基于 ​UniApp + WebSocket​实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配​微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

【机器视觉】单目测距——运动结构恢复

ps&#xff1a;图是随便找的&#xff0c;为了凑个封面 前言 在前面对光流法进行进一步改进&#xff0c;希望将2D光流推广至3D场景流时&#xff0c;发现2D转3D过程中存在尺度歧义问题&#xff0c;需要补全摄像头拍摄图像中缺失的深度信息&#xff0c;否则解空间不收敛&#xf…...

C++ 基础特性深度解析

目录 引言 一、命名空间&#xff08;namespace&#xff09; C 中的命名空间​ 与 C 语言的对比​ 二、缺省参数​ C 中的缺省参数​ 与 C 语言的对比​ 三、引用&#xff08;reference&#xff09;​ C 中的引用​ 与 C 语言的对比​ 四、inline&#xff08;内联函数…...

基于Docker Compose部署Java微服务项目

一. 创建根项目 根项目&#xff08;父项目&#xff09;主要用于依赖管理 一些需要注意的点&#xff1a; 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件&#xff0c;否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...

DBAPI如何优雅的获取单条数据

API如何优雅的获取单条数据 案例一 对于查询类API&#xff0c;查询的是单条数据&#xff0c;比如根据主键ID查询用户信息&#xff0c;sql如下&#xff1a; select id, name, age from user where id #{id}API默认返回的数据格式是多条的&#xff0c;如下&#xff1a; {&qu…...

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战

在现代战争中&#xff0c;电磁频谱已成为继陆、海、空、天之后的 “第五维战场”&#xff0c;雷达作为电磁频谱领域的关键装备&#xff0c;其干扰与抗干扰能力的较量&#xff0c;直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器&#xff0c;凭借数字射…...

管理学院权限管理系统开发总结

文章目录 &#x1f393; 管理学院权限管理系统开发总结 - 现代化Web应用实践之路&#x1f4dd; 项目概述&#x1f3d7;️ 技术架构设计后端技术栈前端技术栈 &#x1f4a1; 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 &#x1f5c4;️ 数据库设…...

Docker 本地安装 mysql 数据库

Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker &#xff1b;并安装。 基础操作不再赘述。 打开 macOS 终端&#xff0c;开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...

[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】&#xff0c;分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...

【Android】Android 开发 ADB 常用指令

查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...