chatgpt-web-java - Java 开发的 ChatGPT 的项目,基于 Spring Boot 3 和 JDK 17,支持 AccessToken 和 ApiKey 模式。

Created at: 2023-03-22 23:23:13
Language: Java
License: MIT

chatgpt-web-java

介绍

注意

关于提问

有问题优先通过文档和 issue 解决,也许你遇到的问题已经有解决方案了,没有的话可以提新的 issue。

关于 ApiKey

当前网站免费提问,因 ApiKey 额度有限,限流频率会比较高,如果有大佬赞助供网站使用的话十分感激。

框架

地址

功能

已实现

上下文聊天

通过 MySQL 实现聊天数据存储来实现 apiKey 方式的上下文聊天,AccessToken 默认支持上下文聊天。可以通过配置参数 limitQuestionContextCount 来限制上下问问题的数量。

数据库存储了每次聊天对话的记录,在选择上下文聊天时,通过 parentMessageId 往上递归遍历获取历史消息,将历史问题以及回答消息都发送给 GPT。

敏感词过滤

在发送消息调用方法判断是否属于敏感词,是的话消息发送不成功。为了兼容前端保持上下文关系,在消息内容属于敏感词的情况下会正常返回消息格式,但是带的是请求的的 conversationId 和 parentMessagId,敏感词需要自己导入数据库。

限流

分为全局限流和 ip 限流,基于内存和双端队列实现滑动窗口限流。在限流过程会异步的将数据写入的文件中,在项目重启时会读取该文件恢复限流状态。

在配置文件中配置 maxRequest、maxRequestSecond、ipMaxRequest、ipMaxRequestSecond

登录注册

通过邮箱进行登录注册

待实现

  • 目前聊天长度受上下文限制,后期调整为动态的控制上下文。

管理端

消息记录

展示消息的列表,问题和回答各是一条消息。通过父消息 id 关联上一条消息。父消息和当前消息一定是同一个聊天室的。

限流记录

查看各个 ip 的限流记录,只记录在限流时间范围的限流次数。

聊天室管理

查看聊天室。这里的聊天室和客户端左边的对话不是同一个概念。在同一个窗口中,我们既可以选择关联上下文发送后者不关联上下文发送。如果不关联上下文发送每次发送消息都会产生一个聊天室。

敏感词管理

查看敏感词列表,目前只提供了查询的功能,后期可以增加管理。

运行部署

IDEA 运行

前端代码使用 WebStom、Vs Code 或者 pnpm install & dev 运行,后端 IDEA 运行。

Docker

需要 clone 仓库并在根目录下执行

MySQL

通过 Dockerfile_mysql 构建带有数据库表结构的镜像并运行,本地有 MySQL 可以跳过

  # 删除旧版 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 应用镜像并运行

  # 删除旧版 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 用到的参数。例如:

  # 删除旧版 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://xxx.com \
      -e CHAT_HTTP_PROXY_HOST=127.0.0.1 \
      -e CHAT_HTTP_PROXY_PORT=7890 \
      chatgpt-web-java

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 的问题。
  • 然而,对于一些用户可能存在需要二次开发或部署方面的困难,我们在开发任务繁忙的情况下,难以抽出时间回答所有用户的问题,但我们会尽最大努力去回答用户的问题。同时,我们也可以提供付费的解答服务,为用户提供更多的支持。
  • 我们的开发工作也在持续进行中,我们会不断迭代优化我们的技术设计方案和业务功能,项目不仅仅会提供所需的业务功能,也可以通过项目来学习一些技术的使用。如果您认为我们的开源项目有价值能帮助到您,并愿意支持我们的开发工作,可以为项目点个小星星或者请作者喝一杯可乐发电 。我们将非常感谢。

参与贡献

联系方式

添加微信备注 Github ChatGPT 以及原因,微信群请在 issue 查看

微信

LICENSE

MIT © hncboy