把ChatGPT接入我的个人网站

news2025/1/12 9:37:50

效果图

在这里插入图片描述

详细内容和使用说明可以查看我的个人网站文章 把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是你自己的key

const 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接收数据,然后渲染,只是样式上需要设计和调整,如果有需要前端代码的小伙伴可以前往我的个人网站进行下载,注册登录后点击资源即可下载:

在这里插入图片描述
如果对你有帮助记得要点赞哦~~~。

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

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

相关文章

让我们一起解密组播、IGMP、IGMP监听

前言:一直对组播这个概念迷迷糊糊,特别是交换机处理组播的方式,非常想搞懂但是懒癌发作。这几天终于耐心地看了下有关组播的资料,大致了解了一下同一广播域内组播的相关知识。组播占了计算机网络的一大部分,特别是组播…

ChatGPT 被大面积封号,到底发生什么了?

意大利数据保护机表示 OpenAI 公司不但非法收集大量意大利用户个人数据,没有设立检查 ChatGPT 用户年龄的机制。 ChatGPT 似乎正在遭遇一场滑铁卢。 3月31日, 大量用户在社交平台吐槽,自己花钱开通的 ChatGPT 账户已经无法登录,更…

举一反三学python(9)—excel基础

一、导论: 操作 excel 表格的Python 第三方库有openpyxl、xlrd、xlwt等,它们的功能都相同,就是语法有差异,今天我就带领大家学习用openpyxl模块操作实用的excel文件。 openpyxl模块为第三方库,首先要安装:p…

electron+vue3全家桶+vite项目搭建【九】集成vite-plugin-mock-server 模拟后端请求

文章目录引入1.引入依赖2.集成插件3.测试接口请求引入 后端接口出的太慢?问题不大,咱们可以借助vite-plugin-mock-server插件自己写接口,返回商量好的格式,后续联调直接切换环境即可 vite-plugin-mock-server官网 mock.js官网 …

uniapp人脸识别解决方案

APP端: 因为APP端无法使用uni的camera组件,最开始考虑使用内嵌webview的方式,通过原生dom调用video渲染画面然后通过canvas截图。但是此方案兼容性在ios几乎为0,如果app只考虑安卓端的话可以采用此方案。后面又想用live-pusher组件…

【Linux】vi编辑器——插入模式

目录 插入模式 光标移动命令 a A i I o O命令 a----------------在光标后附加文本 A----------------在文本行末附加文本 i------------------在光标前插入文本 I-------------------在文本开始插入文本 o----------------在光标下插入新行 O---------------在…

陶泓达:4.11黄金原油白银最新走势分析及操作策略!

黄金行情走势分析:   周一(4月10日),国际金价一度跌约1%,重回2000美元干口下方。此前公布的美国3月非农就业数据显示劳动力市场吃紧,并提高了美联储5月再次加息的预期。金属公司MKS PAMP在一份报告中表示:“金价自20…

Doris(5):数据导入(Load)之Broker load

为适配不同的数据导入需求,Doris系统提供了五种不同的数据导入方式,每种数据导入方式支持不同的数据源,存在不同的方式(异步,同步) Broker load 通过Broker进程访问并读取外部数据源(HDFS&#…

elasticsearch之DSL查询文档

目录 DSL查询分类 全文检索查询 match查询: multi_match: 精准查询 地理坐标查询 矩形范围查询 中心点范围 组合查询 elasticsearch中的相关性打分算法是什么? 案例——给“如家”这个品牌的酒店排名靠前一些 function score query…

ChatGPT写新闻-ChatGPT写文章

ChatGPT写新闻 ChatGPT可以用于生成新闻稿件,但需要注意的是,由ChatGPT生成的新闻稿件可能存在语义、逻辑、事实准确性等方面的问题,因此需要进行人工审核和编辑,确保其准确性。 下面是一个示例过程,大致了解如何使用…

GPT3.5 , InstructGPT和ChatGPT的关系

GPT-3.5 GPT-3.5 系列是一系列模型,从 2021 年第四季度开始就使用文本和代一起进行训练。以下模型属于 GPT-3.5 系列: code-davinci-002 是一个基础模型,非常适合纯代码完成任务text-davinci-002 是一个基于 code-davinci-002 的 InstructG…

PixiJS 文字模糊处理策略

pixijs介绍 PixiJS是一个用于创建交互式2D图形和动画的JavaScript库。它是一个快速、轻量级、易于使用的库,可以在WebGL和Canvas上运行。支持WebGL和Canvas两种渲染方式。WebGL是一种基于OpenGL的3D图形API,可以在GPU上进行高效的图形渲染。Canvas是一种…

基于神经辐射场NeRF的SLAM方法

随着2020年NeRF[1]的横空出世,神经辐射场方法(Neural Radiance Fields)如雨后春笋般铺天盖地卷来。NeRF最初用来进行图像渲染,即给定相机视角,渲染出该视角下的图像。NeRF是建立在已有相机位姿的情况下,但在…

Android kotlin (仿淘宝app收藏)用RecyclerView(androidx+BRVAH3.0.6)实现单选/多选/全选/反选/批量删除功能

文章目录 一、实现效果二、引入依赖三、实现源码1、实体类2、适配器3、提示框(关闭和确定)4、视图实现一、实现效果 二、引入依赖 在app的build.gradle在添加以下代码 implementation com.github.CymChad:BaseRecyclerViewAdapterHelper:3.0

使用采集工具,轻松获取目标受众的数据,让您的市场营销更加精准

【数据采集神器】使用采集工具,轻松获取目标受众的数据,让您的市场营销更加精准! 在当前这个信息化社会中,数据已经成为了企业发展和市场营销的必要手段。企业需要通过数据来了解市场的需求,了解自己产品的竞争优势&a…

你真的懂docker吗?25个试题,学过你就来

前言:遇到不会的,答案偷偷放在评论区了哦~ 1.什么是Docker A 虚拟机 B 半虚拟化技术 C 开源的应用容器引擎 D 后端软件 2. 如何搜索Nginx镜像 A docker search nginx B docker rm nginx C doc…

剑指 Offer II 024. 反转链表(经典题型)

时间是伟大的作者,她能写出未来的结局。 ——卓别林 目录 题目描述: 方法1:迭代法(翻指针) 方法2:头插法 方法3:递归法 题目描述: 给定单链…

【工作感悟】老程序员总结的四条工作经验教训

文章目录前言1. 不要做小需求2. 要做大需求3. 定期同步工作进度4. 项目结束,主动复盘总结前言 想来从事互联网工作已经很多年了,已经从当初的懵懂少年逐渐退化成老油条。刚毕业的时候,真是个愣头青,什么都不懂,也什么…

SegGPT: Segmenting Everything In Context

目录摘要本文方法上下文着色Context EnsembleIn-Context Tuning消融实验摘要 最近基于大规模数据的模型越来越火了,chat GPT以及seg everything,感觉后面很多像目标检测,图像恢复等等都会出现这种泛化能力强,基于大规模数据的模型…

[2019.01.24]JNI经验积累

[1 jobject<--->jclass|jstring](1)jobject向上转型jclass|jstring:jclass jcls static_cast<jclass>(jobject);jstring jstr static_cast<jclass>(jobject);(2)jclass|jstring向下转型jobject:默认情况下是自动转换的[2 jstring<--->const char*](1…