# chatgpt-web-java
# 介绍
- ChatGPT 说文解字前端的 Java 后台
- 前端-说文用户端开源代码 https://github.com/mjjh1717/chatgpt-shuowen
- 前端-解字管理端开源代码 https://github.com/hncboy/chatgpt-jiezi
# 注意
### 关于提问
有问题优先通过文档和 issue 解决,也许你遇到的问题已经有解决方案了,没有的话可以提新的 issue。
### 关于 ApiKey
当前网站免费提问,因 ApiKey 额度有限,限流频率会比较高,如果有大佬赞助供网站使用的话十分感激。
# 框架
- Spring Boot 3.0.5
- JDK 17
- MySQL 8.x
- SpringDoc 接口文档
- MyBatis Plus
- MapStruct
- Lombok
- [Hutool](https://hutool.cn/)
- [SaToken](https://sa-token.cc/) 权限校验
- [Grt1228 ChatGPT java sdk](https://github.com/Grt1228/chatgpt-java)
- ......
# 地址
- 接口文档:http://localhost:3002/swagger-ui.html
- 用户端:
- https://front.stargpt.top/ (失效)
- https://front1.stargpt.top/ (失效)
- https://front2.stargpt.top/
- https://front3.stargpt.top/
# 功能
## 已实现
### 上下文聊天
通过 MySQL 实现聊天数据存储来实现 apiKey 方式的上下文聊天,AccessToken 默认支持上下文聊天。可以通过配置参数 limitQuestionContextCount 来限制上下问问题的数量。
数据库存储了每次聊天对话的记录,在选择上下文聊天时,通过 parentMessageId 往上递归遍历获取历史消息,将历史问题以及回答消息都发送给 GPT。
![](pics/question_context_limit_test.png)
### 敏感词过滤
在项目启动时会将敏感词文件 sensitive_word_base64.txt 的数据导入到敏感词表,目前还未提供后台管理敏感词的接口,提供后这种方式可以去掉。在文件中敏感词以 base64 形式存放。并将敏感词表的数据构建到 HuTool 提供的 WordTree 类中。在发送消息调用方法判断是否属于敏感词,是的话消息发送不成功。为了兼容前端保持上下文关系,在消息内容属于敏感词的情况下会正常返回消息格式,但是带的是请求的的 conversationI 和 parentMessagId。
![](pics/sensitive_word_test.png)
### 限流
分为全局限流和 ip 限流,基于内存和双端队列实现滑动窗口限流。在限流过程会异步的将数据写入的文件中,在项目重启时会读取该文件恢复限流状态。
在配置文件中配置 maxRequest、maxRequestSecond、ipMaxRequest、ipMaxRequestSecond
![](pics/rate_limit_test.png)
### 登录注册
通过邮箱进行登录注册
![](pics/register_1.png)
## 待实现
- 目前聊天长度受上下文限制,后期调整为动态的控制上下文。
# 管理端
## 消息记录
展示消息的列表,问题和回答各是一条消息。通过父消息 id 关联上一条消息。父消息和当前消息一定是同一个聊天室的。
![](pics/chat_message_1.png)
## 限流记录
查看各个 ip 的限流记录,只记录在限流时间范围的限流次数。
![](pics/rate_limit_1.png)
## 聊天室管理
查看聊天室。这里的聊天室和客户端左边的对话不是同一个概念。在同一个窗口中,我们既可以选择关联上下文发送后者不关联上下文发送。如果不关联上下文发送每次发送消息都会产生一个聊天室。
![](pics/chat_room_1.png)
## 敏感词管理
查看敏感词列表,目前只提供了查询的功能,后期可以增加管理。
![](pics/sensitive_word_1.png)
# 运行部署
## IDEA 运行
前端代码使用 WebStom、Vs Code 或者 pnpm install & dev 运行,后端 IDEA 运行。
## Docker
需要 clone 仓库并在根目录下执行
### MySQL
通过 Dockerfile_mysql 构建带有数据库表结构的镜像并运行,本地有 MySQL 可以跳过
```shell
# 删除旧版 container (如果有的话)
docker stop mysql_gpt && docker rm mysql_gpt
# 构建 image
docker build -t mysql_gpt_img:latest . -f Dockerfile_mysql
# 运行 container
docker run -d -p 3309:3306 \
--name mysql_gpt \
-v ~/mydata/mysql_dummy/data:/var/lib/mysql \
-v ~/mydata/mysql_dummy/conf:/etc/mysql/conf.d \
-v ~/mydata/mysql_dummy/log:/var/log/mysql \
mysql_gpt_img:latest
```
### Java
通过 Docker 构建 Java 应用镜像并运行
```shell
# 删除旧版 container (如果有的话)
docker stop chatgpt-web-java && docker rm chatgpt-web-java
docker build -t chatgpt-web-java .
docker run -d -p 3002:3002 chatgpt-web-java
```
如果要显式指定参数,可以在 `docker run` 后添加 `-e` 选项,配置 `application.yml` 用到的参数。例如:
```shell
# 删除旧版 container (如果有的话)
docker stop chatgpt-web-java && docker rm chatgpt-web-java
docker build -t chatgpt-web-java .
# 如果这里要使用 java 的容器访问 mysql 容器,需要使用 host.docker.internal 而不是 localhost,才可以访问到宿主机的 3009 端口(mysql开放了3009端口)
docker run -d -p 3002:3002 \
-e JDBC_URL=jdbc:mysql://host.docker.internal:3309/chat?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai \
-e MYSQL_USER_NAME=root \
-e MYSQL_PASSWORD=123456 \
-e CHAT_OPENAI_API_KEY=xxx \
-e CHAT_OPENAI_ACCESS_TOKEN=xxx \
-e CHAT_OPENAI_API_BASE_URL=http://222.178.203.72:19005/whst/63/_wwwzbnl/ \
-e CHAT_HTTP_PROXY_HOST=127.0.0.1 \
-e CHAT_HTTP_PROXY_PORT=7890 \
chatgpt-web-java
```
![](pics/docker_run.png)
## docker-compose
在 `docker-compose.yml` 文件中配置好配置后,使用 `docker-compose up -d` 可一键启动。
# 数据库表
表结构路径:`chatgpt-bootstrap/src/main/resources/db`。 不需要额外数据库的可以自行连接 H2 地址,改下连接方式就可以。
- chat_message 聊天室表
- chat_room 聊天记录表
- email_verify_code 邮件验证码表
- front_user_base 前端基础用户表
- front_user_extra_binding 前端基础用户扩展绑定表
- front_user_extra_email 前端基础用户邮箱扩展
- sensitive_word 敏感词表
- sys_email_send_log 邮件发送日志表
- sys_front_user_login_log 前端用户登录日志表
# 风险声明
本项目仅供学习和研究使用,不鼓励用于商业用途。对于因使用本项目而导致的任何损失,我们不承担任何责任。
# 感谢&赞助
- 非常感谢大家对我们项目和开发工作的支持和认可。我们深知在开源软件开发过程中,用户和社区的反馈和支持是至关重要的。我们的项目代码已经提供了 README 和 issue,方便用户进行部署和解决问题,同时也可以促进我们项目的活跃度,会优先关注 issue 的问题。
- 然而,对于一些用户可能存在需要二次开发或部署方面的困难,我们在开发任务繁忙的情况下,难以抽出时间回答所有用户的问题,但我们会尽最大努力去回答用户的问题。同时,我们也可以提供付费的解答服务,为用户提供更多的支持。
- 我们的开发工作也在持续进行中,我们会不断迭代优化我们的技术设计方案和业务功能,项目不仅仅会提供所需的业务功能,也可以通过项目来学习一些技术的使用。如果您认为我们的开源项目有价值能帮助到您,并愿意支持我们的开发工作,可以为项目点个小星星或者请作者[喝一杯可乐发电](https://afdian.net/a/stargpt) 。我们将非常感谢。
# 参与贡献
- 代码规范:[阿里巴巴 Java 开发手册](https://github.com/alibaba/p3c/blob/master/Java%E5%BC%80%E5%8F%91%E6%89%8B%E5%86%8C(%E9%BB%84%E5%B1%B1%E7%89%88).pdf)
- 注释规范:[中文技术文档的写作规范](https://github.com/ruanyf/document-style-guide)
- Git Commit Message:[conventional-changelog 标准](https://www.conventionalcommits.org/en/v1.0.0/)
# 联系方式
技术交流添加微信,备注 Github ChatGPT 以及原因
<div style="display: flex; align-items: center; gap
牛马尼格
- 粉丝: 1316
- 资源: 375
最新资源
- 博途S7-1200主站与S7-200从站实现RS485通讯程序 S7-200可以当作一个仪表
- C#、C++分别开发的OPC DA CLIENT软件. 1、枚举服务器名称; 2、连接服务器以后枚举出TAG; 3、根据TAG名称自动读取服务器数据; 4、图片内有OPC SERVER和CLIENT实
- python-workspace.zip.005
- 龙门上下料样本程序,四轴 用台达AS228T和台达触摸屏编写 注意软件是用台达新款软件ISPSOFT ,借鉴价值高,程序有注释
- 一款window下的串口监视抓包工具
- 欧姆龙CP1H与3台力士乐VFC-x610变频器通讯程序 功能:原创程序,可直接用于现场程序 欧姆龙CP1H的CIF11通讯板,实现对3台力士乐VFC-x610变频器 设定频率,控制正反转,读取实际
- dp111113333
- CV-密集人群图像数据集(5800张图片).rar
- 福特汽车主观评价规范,性能开发参考,英文原版直译,评价条目、规则描述非常细致 包含平顺舒适性,转向,操稳,NVH,制动,加速感,驾驶性等等性能,并详细描述了评价的准备工作 评价条目细分至第四级,共
- 三菱FX3S两轴标准程序,XZ两轴,包含轴点动,回零,相对与绝对定位,只要弄明白这个程序,就可以非常了解整个项目的程序如何去编写,从哪里开始下手,可提供程序问题解答,程序流程清晰明了,注释完整
- MATLAB代码:考虑P2G与碳捕集机组的多能微网低碳经济调度 关键词:碳交易 阶梯碳交易 碳捕集 多能微网 低碳调度 仿真平台:MATLAB+yalmip+cplex 主要内容:代码主要做的是一个
- 本程序采用matlab编写,主要是实现电流注入型牛拉法 除此之外,本人还编写了很多种关于潮流计算的程序,主要有牛拉法,前推回代法,以还有相和三相潮流计算程序
- 智能门锁架构图,供大家参考
- 三菱FX3U六轴标准程序,程序包含本体3轴控制,扩展3个1PG定位模块,一共六轴 程序有轴点动控制,回零控制,相对定位,绝对定位 另有气缸数个,一个大是DD马达控制的转盘,整个是转盘多工位流水作业
- 批量登录到远程Linux服务器检查服务器时间差的shell
- MATLAB电动车七自由度整车模型 MATLAB Simulink电动车转弯制动abs模型asr转弯制动防抱死abs模型+模糊控制算法+七自由度整车模型+纵向运动+侧向运动+横摆运动+四轮魔术公式+四
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈