【chatgpt】学习开源项目chatgpt-web,搭建自己的chatgpt服务,功能非常丰富有打字效果

news2024/11/26 2:23:57

目录

  • 前言
    • 1,开源的chatgpt项目
    • 2,项目可以直接使用docker-compose跑起来
    • 3,关于打字模式SSE, octet-stream (打字特效)
    • 4,关于内容存储
    • 5,总结

前言


本文的原文连接是:
https://blog.csdn.net/freewebsys/article/details/130438873

1,开源的chatgpt项目


项目地址:
https://github.com/Chanzhaoyu/chatgpt-web

也有gitee搬运的项目,不知道是不是作者,最近也在更新:
https://gitee.com/boomer001/chanzhaoyu-chatgpt-web

项目从23年2月份开始,到目前项目已经有了很高的星星 20K 了。
项目的前端使用的是vue进行开发的。
项目的后端使用的nodejs 进行开发的,全栈项目了。

而且也官方的docker 镜像,直接配置起来就可以了。

2,项目可以直接使用docker-compose跑起来


从第二步骤讲起,apikey 如何申请,不在这里讨论,大家可以自行解决。

官方也有简单的使用docker-compose 配置,这个整理了下就配置下apikey 就行了:

docker-compose.yaml 配置文件:

services:
  app:
    restart: always
    image: chenzhaoyu94/chatgpt-web # 总是使用 latest ,更新时重新 pull 该 tag 镜像即可
    ports:
      - 3002:3002
    #volumes: #要是想自己修改页面,可以吧dist映射到/app/pulbic目录即可。
    #  - ./chatgpt-web/dist:/app/public
    environment:
      # 二选一
      OPENAI_API_KEY: sk-xxxxxxx
      # 二选一
      # API接口地址,可选,设置 OPENAI_API_KEY 时可用
      OPENAI_API_BASE_URL: http://localhost:3002
      # API模型,可选,设置 OPENAI_API_KEY 时可用
      OPENAI_API_MODEL: gpt-3.5-turbo
      # 访问权限密钥,可选
      AUTH_SECRET_KEY: chat666
      # 超时,单位毫秒,可选
      TIMEOUT_MS: 60000

要是想自己修改页面,可以吧dist映射到/app/pulbic目录即
./chatgpt-web/dist:/app/public
chatgpt-web 就是这个github 项目下载后的地址。

当然也可以直接使用nodejs跑起来,分前后端的,前端项目也需要进行编译。

启动成功:
在这里插入图片描述
有登陆授权提示,需要输入配置的 auth 密码 比如chat666 。
要是错登陆不进去,当然这个是一个简单的授权。
在这里插入图片描述

登陆成功之后就可以使用了
在这里插入图片描述
带打字模式回答问题,这个地方就需要注意了。

3,关于打字模式SSE, octet-stream (打字特效)


SSE 是指“Server-Sent Events”,它是一种基于 HTTP 的服务器推送技术。使用 SSE 可以让服务器向客户端发送事件流,从而实现实时的数据更新和通知功能。SSE 协议基于 HTML5 标准,支持跨域通信,并且与 Web Sockets 不同,它是一种单向通信方式,即只能由服务器向客户端发送消息。在浏览器中,可以通过 JavaScript 的 EventSource API 来实现对 SSE 事件流的监听和处理。

H5的一个新协议,这里需要注意下,如果是直接暴露端口不用管。
但是要是需要使用nginx进行转发的就需要修改nginx配置了。

这里折腾了几天才弄明白,官方也给了解决办法,配置nginx的 octet-stream (打字特效)配置:

参考这个:
https://github.com/Chanzhaoyu/chatgpt-web/issues/402

也就是需要在nginx 配置后端接口:

	location ~ ^/api/chat-process {

        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "Upgrade";

		# 流式输出
		chunked_transfer_encoding on;  # 开启分块传输编码
		tcp_nopush on;  # 开启TCP NOPUSH选项,禁止Nagle算法
		tcp_nodelay on;  # 开启TCP NODELAY选项,禁止延迟ACK算法
		keepalive_timeout 300;  # 设定keep-alive超时时间为65秒
	
		proxy_pass http://app:3002;

	}

返回的数据格式是数组,照回车 \n 进行区分,然后才是数据。
返回一个或者几个字词然后,界面上就有打字效果了:

在这里插入图片描述

项目中的处理函数:

const fetchChatAPIOnce = async () => {
      await fetchChatAPIProcess<Chat.ConversationResponse>({
        prompt: message,
        options,
        signal: controller.signal,
        onDownloadProgress: ({ event }) => {
          const xhr = event.target
          const { responseText } = xhr
          // Always process the final line
          const lastIndex = responseText.lastIndexOf('\n', responseText.length - 2)
          let chunk = responseText
          if (lastIndex !== -1)
            chunk = responseText.substring(lastIndex)
          try {
            const data = JSON.parse(chunk)
            updateChat(
              +uuid,
              index,
              {
                dateTime: new Date().toLocaleString(),
                text: lastText + (data.text ?? ''),
                inversion: false,
                error: false,
                loading: true,
                conversationOptions: { conversationId: data.conversationId, parentMessageId: data.id },
                requestOptions: { prompt: message, options: { ...options } },
              },
            )

            if (openLongReply && data.detail.choices[0].finish_reason === 'length') {
              options.parentMessageId = data.id
              lastText = data.text
              message = ''
              return fetchChatAPIOnce()
            }
          }
          catch (error) {
            //
          }
        },
      })

项目中一共有4个接口:

/api/config 配置的接口,返回使用情况,配置信息。
/api/session 返回模型信息。这个成 功之后才可以进行聊天。
/api/verify 校验用户登陆状态。
/api/chat-process 最重要的用户聊天对话消息处理,使用了 SSE 模拟打字。

同时这个项目中还可以开启多个对话,记录上次对话内容。
比如先问上海的景点:
在这里插入图片描述
然后在问三个最好的,这时候chatgpt 就知道是上海的景点:
在这里插入图片描述

这个前端样式使用 naiveui

https://www.naiveui.com/zh-CN/os-theme
github 地址:
https://github.com/tusen-ai/naive-ui

只是手机端和pc端样式自适应。

4,关于内容存储


这个项目采取的是将相关的聊天信息存储到本地文件中。
在localstorage 中,优点是效率高,速度快。

在 uitls/storage/local.ts 使用的是

window.localStorage.setItem(key, json)
window.localStorage.getItem(key)
window.localStorage.removeItem(key)
window.localStorage.clear()

存储相关的信息,都存储到了一个字段中了。
分chat和 history 两个属性。
在这里插入图片描述
active 是激活的当前会话id

就是当前的时间戳:

  chatStore.addHistory({ title: 'New Chat', uuid: Date.now(), isEdit: false })

这里鉴权是做的写死的设置:

service.interceptors.request.use(
  (config) => {
    const token = useAuthStore().token
    if (token)
      config.headers.Authorization = `Bearer ${token}`
    return config
  },
  (error) => {
    return Promise.reject(error.response)
  },
)

直接在head里面写死的,但是这样并不安全。
服务器授权如果使用 jwt 可以修改 verify 接口。
服务端返回 jwt 的授权,然后本地存储。

在拦截器里面都使用 jwt的鉴权,或者是直接存储到 cookie当中也行,但是会有跨域的问题需要解决。

5,总结


最近在使用chatgpt发现确实可以非常方便的提高效率的。
对于开发上面的各种问题的解决也是帮助非常大的。
同时在使用大模型的服务上也会有很多的工程问题需要解决。
一些登陆授权的还是常用的软件知识,都需要掌握进行学习。

这个开源项目非常的好!非常值得推荐!

本文的原文连接是:
https://blog.csdn.net/freewebsys/article/details/130438873

在这里插入图片描述

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

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

相关文章

自动控制原理笔记-根轨迹法

目录 一&#xff0c;根轨迹的基本概念 1.根轨迹的基本概念 2.根轨迹方程 3.根轨迹方程的应用 二&#xff0c;根轨迹的绘制规则 【规则一】根轨迹有n条分支&#xff1a; 【规则二】根轨迹对称于实轴&#xff1a; 【规则三】根轨迹的起点和终点&#xff1a; 【规则四】…

BUUCTF-Web-[极客大挑战 2019]Upload

打开后可以看到是一个可以进行文件上传的页面&#xff0c;如下图所示 查看页面源代码&#xff0c;如下图所示&#xff0c;可以看到有js代码&#xff0c;说明存在前端验证的可能性 上传一个php文件&#xff0c;此处上传shell.php后页面如下图所示&#xff0c;显示不是图片 用bur…

前端存储 Cookie、Web Storage(localStorage 与 sessionStorage)

cookie 由来&#xff1a;cookie 最初的目的是为了维持前端存储的临时状态而产生的。原理&#xff1a; 浏览器发出无状态请求服务器返回响应&#xff0c;携带 cookie 信息浏览器发出接口请求&#xff0c;携带 cookie 信息之后就是前端与服务器建立完成连接后的接口返回了 生成机…

Qt 实现简单的tcp网络通信

文章目录 成品效果图&#xff1a;代码&#xff1a;工具头文件tool.hUI文件代码 ui_widget.h:窗口头文件 widget.h&#xff1a;窗口源文件widget.cpp: 相关代码说明&#xff1a;Qt获取本机ip:Qt 打开&#xff0c;监视服务端端口&#xff1a;Qt 客户端连接服务端&#xff1a;Qt 服…

自建小网站——在idea中如何运行一个vue项目完整过程

这些天Darren洋计划筹建一个属于自己的个人博客空间小网站&#xff0c;其中选择的就是vue项目类型的网站&#xff0c;因为在运行vue项目途中不是特别顺利&#xff0c;现整理了一下流程供大家参考学习。 一、从git上pull一个vue项目 先登录git官网&#xff0c;pull一个vue项目包…

【ElasticSearch】HTTP调用API

文章目录 数据格式HTTP操作索引操作映射操作文档操作(添加数据)高级查询定义数据查询所有文档匹配查询多字段匹配查询关键字精确查询多关键字精确查询指定查询字段过滤字段组合查询范围查询模糊查询*单字段排序多字段排序高亮查询分页查询聚合查询对某个字段取最大值 max对某个…

Channel Distillation: Channel-Wise Attention for Knowledge Distillation 原理与代码解析

paper&#xff1a;Channel Distillation: Channel-Wise Attention for Knowledge Distillation official implementation&#xff1a;https://github.com/zhouzaida/channel-distillation 存在的问题 教师模型传递的知识不够好&#xff0c;学生模型无法准确地从教师模型学习…

java基础语法总复习思维导图 + 重难点+面试题

前言 小亭子正在努力的学习编程&#xff0c;接下来将开启javaEE的学习~~ 分享的文章都是学习的笔记和感悟&#xff0c;如有不妥之处希望大佬们批评指正~~ 同时如果本文对你有帮助的话&#xff0c;烦请点赞关注支持一波, 感激不尽~~ 【需要可修改的思维导图可以私信我&#xff0…

Packet Tracer - 静态路由故障排除

Packet Tracer - 静态路由故障排除 地址分配表 设备 接口 IPv4 地址 子网掩码 默认网关 R1 G0/0 172.31.1.1 255.255.255.128 不适用 S0/0/0 172.31.1.194 255.255.255.252 不适用 R2 G0/0 172.31.0.1 255.255.255.0 不适用 S0/0/0 172.31.1.193 255.255…

Windows server 2012 R2系统怎么安装IIS管理器?

Windows server 2012 R2系统怎么安装IIS管理器&#xff1f;今天飞飞和你分享。服务器大本营&#xff0c;技术文章内容集合站发车啦&#xff01; 首先我们用电脑自带的远程连接桌面工具进入服务器&#xff0c;在任务栏左下角有个服务器管理器&#xff0c;单击打开 打开后在右上…

【致敬未来的攻城狮计划】— 连续打卡第十六天:FSP固件库系统定时器(滴答定时器SysTick)每2秒LED闪烁一次

系列文章目录 1.连续打卡第一天&#xff1a;提前对CPK_RA2E1是瑞萨RA系列开发板的初体验&#xff0c;了解一下 2.开发环境的选择和调试&#xff08;从零开始&#xff0c;加油&#xff09; 3.欲速则不达&#xff0c;今天是对RA2E1 基础知识的补充学习。 4.e2 studio 使用教程 5.…

跟着杰哥学强化学习:多臂老虎机问题

多臂老虎机问题 现在有3台外观一模一样的老虎机,每个老虎机的赔率是不同的,摇动一次需要1块钱,现在给你100块钱,如何获取最大的收益。 如果我们知道了每个老虎的赔率,那么只要选择收益最高的那个老虎机就可以了,但现在问题是并不知道每个老虎机的收益。为了简单,我们假…

linux 安装rocketmq

首先准备虚拟机一台 下载linux 64位 jdk1.8(自行百度资源) 下载 | RocketMQ (apache.org) cd /usr/local/ #这是我的本机的现有目录 mkdir rocketmq mkdir jdk 1.借助linux客户端工具,上传刚下载好的jdk安装包到java文件夹 2.借助linux客户端工具,上传刚下载好的二进制安装包…

「C/C++」C/C++软件跨平台思维

博客主页&#xff1a;何曾参静谧的博客 文章专栏&#xff1a;「C/C」C/C学习 目录 相关术语一、编写可移植的代码&#xff1a;二、使用跨平台的C库和框架&#xff1a;三、进行兼容性测试&#xff1a;四、用户界面设计&#xff1a; 相关术语 跨平台思维&#xff1a;是指在软件开…

D-Link DSL-2888A 远程命令执行漏洞(CVE-2020-24581/24579)

漏洞描述 D-Link DSL-2888A AU_2.31_V1.1.47ae55之前版本存在安全漏洞&#xff0c;该漏洞源于包含一个execute cmd.cgi特性(不能通过web用户界面访问)&#xff0c;该特性允许经过身份验证的用户执行操作系统命令。 在该版本固件中同时存在着一个不安全认证漏洞&#xff08;CVE…

【软考网络管理员】2023年软考网管初级常见知识考点(2)- 数据通信技术

【写在前面】也是趁着五一假期前再写几篇分享类的文章给大家&#xff0c;希望看到我文章能给软考网络管理员备考的您带来一些帮助&#xff0c;5月27号也是全国计算机软件考试统一时间&#xff0c;也就不用去各个地方找资料和代码了。紧接着我就把我整理的一些资料分享给大家哈&…

04 KVM虚拟化网络概述

文章目录 04 KVM虚拟化网络概述4.1 Linux Bridge4.2 Open vSwitch 04 KVM虚拟化网络概述 为了使虚拟机可以与外部进行网络通信&#xff0c;需要为虚拟机配置网络环境。KVM虚拟化支持Linux Bridge、Open vSwitch网桥等多种类型的网桥。如图1所示&#xff0c;数据传输路径为“虚…

InstructGPT 论文阅读笔记

目录 简介 数据集 详细实现 实验结果 参考资料 简介 InstructGPT 模型是在论文《Training language models to follow instructions with human feedback》被提出的&#xff0c;OpenAI在2022年1月发布了这篇文章。 论文摘要翻译&#x…

AttributeError: ‘Document‘ object has no attribute ‘pageCount‘ PyMuPDF库

这可能是由于PyMuPDF库更新导致的&#xff0c;里面的一些函数名发生了变化 1. AttributeError: Document object has no attribute pageCount 将 pageCount改为 page_count 2. AttributeError: Matrix object has no attribute preRotate 将preRotate改为prerotate 3.Attribut…

关于FFMPEG中的filter滤镜的简单介绍

滤镜的作用主要是对原始的音视频数据进行处理以实现各种各样的效果。比如叠加水印&#xff0c;翻转缩放视频等。 下图表示的正常转码流程&#xff0c;滤镜在解码和编码中间&#xff0c;虚线表示可有可无。 使用命令查看ffmpeg支持的滤镜 ffmpeg -filters 查看某个滤镜的详细参…