2026-02-03 20:51:36 +08:00
2026-02-03 20:51:36 +08:00
2026-02-03 16:35:47 +08:00
2025-12-02 20:03:39 +08:00
2026-02-02 21:41:47 +08:00
2025-12-08 16:17:56 +08:00
2026-02-02 21:41:47 +08:00
2025-12-08 15:55:41 +08:00
2026-02-02 22:17:14 +08:00

AI-CS 智能客服系统

一个融合 AI 技术与人工客服的现代化智能客服解决方案

🌐 在线演示

Demo 站点: https://demo.cscorp.top

核心特性

  • 🤖 AI 客服支持:支持多厂商 AI 模型,可配置 API 和模型选择
  • 🔍 RAG 智能检索:基于向量数据库的知识库检索,AI 对话自动使用知识库内容
  • 📚 知识库管理:完整的文档管理、知识库组织、批量导入功能
  • 👥 人工客服:实时在线状态显示,支持多客服协作
  • 💬 实时通信:基于 WebSocket 的双向实时消息推送
  • 📁 文件传输:支持图片、文档上传和预览
  • 📖 FAQ 管理:知识库管理,支持向量检索和关键词搜索
  • 👤 用户管理:完整的用户权限管理系统
  • 🎨 现代化 UI:基于 Shadcn UI 的响应式设计
  • 🔌 访客小窗插件:可嵌入任何网站的客服小窗组件
  • 🌐 产品官网:内置产品展示页面

🚀 快速开始

方式一:预构建镜像一键部署(推荐,最简单)

最简单快捷的方式,直接使用预构建的 Docker 镜像,无需构建,一行命令启动

前置要求

  • Docker DesktopWindows/Mac)或 Docker + Docker ComposeLinux

部署步骤

  1. 克隆项目并进入目录
git clone https://github.com/2930134478/AI-CS.git
cd AI-CS
  1. 配置环境变量
# 复制环境变量模板
cp .env.example .env

# 编辑 .env 文件,至少修改以下配置:
# - MYSQL_ROOT_PASSWORD: MySQL root 密码
# - ADMIN_PASSWORD: 管理员密码(首次登录使用)
# - ENCRYPTION_KEY: 加密密钥(生成 64 位十六进制字符串)

生成加密密钥:

# Linux/Mac
openssl rand -hex 32

# Windows PowerShell
-join ((48..57) + (97..102) | Get-Random -Count 64 | ForEach-Object {[char]$_})
  1. 一键启动
# 使用预构建镜像启动(自动从 Docker Hub 拉取镜像)
docker-compose -f docker-compose.prod.yml up -d

就这么简单!🎉

  1. 访问应用

端口配置

默认端口:后端 18080,前端 3000

修改端口:在 .env 文件中设置 BACKEND_PORTFRONTEND_PORT

⚠️ 注意:预构建镜像的图片加载已硬编码为 18080 端口,如需修改端口,请使用方式二(本地构建)重新构建镜像。

常用命令

# 查看日志
docker-compose -f docker-compose.prod.yml logs -f

# 查看服务状态
docker-compose -f docker-compose.prod.yml ps

# 停止服务
docker-compose -f docker-compose.prod.yml stop

# 停止并删除容器(保留数据)
docker-compose -f docker-compose.prod.yml down

# 完全重置(删除所有数据)
docker-compose -f docker-compose.prod.yml down -v

方式二:Docker 本地构建部署

适合需要自定义构建或网络无法访问 Docker Hub 的情况。

前置要求

  • Docker DesktopWindows/Mac)或 Docker + Docker ComposeLinux
  • Git

部署步骤

  1. 克隆项目
git clone https://github.com/2930134478/AI-CS.git
cd AI-CS
  1. 配置环境变量
# 复制环境变量模板
cp .env.example .env

# 编辑 .env 文件,至少修改以下配置:
# - MYSQL_ROOT_PASSWORD: MySQL root 密码
# - ADMIN_PASSWORD: 管理员密码(首次登录使用)
# - ENCRYPTION_KEY: 加密密钥(生成 64 位十六进制字符串)

生成加密密钥:

# Linux/Mac
openssl rand -hex 32

# Windows PowerShell
-join ((48..57) + (97..102) | Get-Random -Count 64 | ForEach-Object {[char]$_})
  1. 构建并启动服务
# 构建并启动所有服务(首次构建需要一些时间)
docker-compose up -d --build

# 查看日志
docker-compose logs -f

# 查看服务状态
docker-compose ps
  1. 访问应用

端口配置

默认端口:后端 18080,前端 3000

修改端口:在 .env 文件中设置 BACKEND_PORTFRONTEND_PORT,然后重新构建:

docker-compose up -d --build

常用命令

# 停止服务
docker-compose stop

# 停止并删除容器(保留数据)
docker-compose down

# 完全重置(删除所有数据)
docker-compose down -v

# 查看日志
docker-compose logs -f backend
docker-compose logs -f frontend

方式三:传统部署(手动安装)

环境要求

  • Go 1.24 或更高版本
  • Node.js 18+ 和 npm/yarn
  • MySQL 8.0 或更高版本

1. 克隆项目

git clone https://github.com/2930134478/AI-CS.git
cd AI-CS

2. 配置后端

cd backend

# 创建 .env 文件
cat > .env << EOF
# 数据库配置
DB_HOST=localhost
DB_PORT=3306
DB_USER=root
DB_PASSWORD=your_password
DB_NAME=ai_cs

# 管理员账号配置(必填)
ADMIN_USERNAME=admin
ADMIN_PASSWORD=your_admin_password

# 服务器配置
SERVER_HOST=0.0.0.0
SERVER_PORT=18080        # 默认端口 18080,可修改
GIN_MODE=debug

# 加密密钥(用于加密 AI API Keys,可选)
ENCRYPTION_KEY=$(openssl rand -hex 32)

# Milvus 向量数据库配置(知识库功能需要)
MILVUS_HOST=localhost
MILVUS_PORT=19530

# 嵌入服务配置(知识库功能需要)
# 方式一:使用 OpenAI 嵌入服务
EMBEDDING_TYPE=api
EMBEDDING_API_URL=https://api.openai.com/v1
EMBEDDING_API_KEY=your_openai_api_key
EMBEDDING_MODEL=text-embedding-3-small

# 方式二:使用本地 BGE 嵌入服务
# EMBEDDING_TYPE=local
# BGE_API_URL=http://localhost:8080
# BGE_MODEL_NAME=bge-small-zh-v1.5
EOF

# 安装依赖
go mod tidy

# 启动服务(默认端口 8080
go run main.go

⚠️ 重要ADMIN_PASSWORD 是必填项,如果不设置,系统不会创建默认管理员账号。

3. 配置前端

cd frontend

# 安装依赖
npm install

# 启动开发服务器(默认端口 3000)
npm run dev

端口配置

  • 后端端口:修改 backend/.env 中的 SERVER_PORT(默认 8080
  • 前端端口:启动时通过 PORT 环境变量修改,如 PORT=4000 npm run dev
  • 图片加载端口:创建 frontend/.env.local,设置 NEXT_PUBLIC_BACKEND_PORT=你的后端端口

4. 访问应用

5. 默认管理员账号

⚠️ 重要说明

系统会在首次启动时自动创建管理员账号(如果不存在),但必须先在 backend/.env 文件中配置 ADMIN_PASSWORD 环境变量

配置步骤

  1. backend/.env 文件中设置:

    ADMIN_USERNAME=admin          # 可选,默认为 admin
    ADMIN_PASSWORD=your_password  # ⚠️ 必填,首次登录后请立即修改密码
    
  2. 启动后端服务,系统会自动创建管理员账号

  3. 使用配置的用户名和密码登录

安全提示

  • 生产环境请使用强密码
  • 首次登录后请立即修改密码
  • ADMIN_PASSWORD 是必填项,如果不设置,系统不会创建管理员账号

后端环境变量

backend/.env 中配置:

# 数据库配置
DB_HOST=localhost          # 数据库主机
DB_PORT=3306              # 数据库端口
DB_USER=root              # 数据库用户名
DB_PASSWORD=your_password # 数据库密码
DB_NAME=ai_cs             # 数据库名称

# 管理员账号配置
ADMIN_USERNAME=admin                    # 管理员用户名(可选,默认为 admin)
ADMIN_PASSWORD=your_admin_password      # ⚠️ 管理员密码(必填)

# 服务器配置
SERVER_HOST=0.0.0.0                    # 服务器监听地址
SERVER_PORT=8080                        # 服务器端口
GIN_MODE=debug                          # 运行模式(debug/release

# 加密密钥(用于加密 AI API Keys)
ENCRYPTION_KEY=your_32_byte_key         # 使用 openssl rand -hex 32 生成

重要提示

  • ADMIN_PASSWORD 是必填项,如果不设置,系统不会创建默认管理员账号
  • 生产环境请使用强密码并设置 GIN_MODE=release

🔌 集成客服插件到你的网站

步骤 1:在 HTML 中添加代码

在你的网站 HTML 的 </body> 标签之前添加:

<!-- 浮动按钮和聊天窗口 -->
<div id="ai-cs-widget" style="position: fixed; bottom: 20px; right: 20px; z-index: 9999;">
  <!-- 浮动按钮 -->
  <button 
    id="ai-cs-toggle-btn" 
    style="width: 56px; height: 56px; border-radius: 50%; background: #3b82f6; color: white; border: none; cursor: pointer; box-shadow: 0 4px 12px rgba(0,0,0,0.15);"
    onclick="toggleChat()"
  >
    <svg width="24" height="24" fill="none" stroke="currentColor" viewBox="0 0 24 24">
      <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M8 12h.01M12 12h.01M16 12h.01M21 12c0 4.418-4.03 8-9 8a9.863 9.863 0 01-4.255-.949L3 20l1.395-3.72C3.512 15.042 3 13.574 3 12c0-4.418 4.03-8 9-8s9 3.582 9 8z"></path>
    </svg>
  </button>
  
  <!-- 聊天窗口 iframe -->
  <iframe 
    id="ai-cs-chat-iframe"
    src="https://demo.cscorp.top/chat" 
    style="display: none; position: fixed; bottom: 80px; right: 20px; width: 400px; height: 600px; max-width: calc(100vw - 40px); max-height: calc(100vh - 100px); border: none; border-radius: 12px; box-shadow: 0 20px 25px -5px rgba(0,0,0,0.1);"
    allow="microphone"
  ></iframe>
</div>

<script>
  function toggleChat() {
    const iframe = document.getElementById('ai-cs-chat-iframe');
    const btn = document.getElementById('ai-cs-toggle-btn');
    const isVisible = iframe.style.display !== 'none';
    
    iframe.style.display = isVisible ? 'none' : 'block';
    
    // 切换按钮图标
    if (isVisible) {
      btn.innerHTML = '<svg width="24" height="24" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M8 12h.01M12 12h.01M16 12h.01M21 12c0 4.418-4.03 8-9 8a9.863 9.863 0 01-4.255-.949L3 20l1.395-3.72C3.512 15.042 3 13.574 3 12c0-4.418 4.03-8 9-8s9 3.582 9 8z"></path></svg>';
    } else {
      btn.innerHTML = '<svg width="24" height="24" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12"></path></svg>';
    }
  }
</script>

步骤 2:修改域名

将代码中的 https://demo.cscorp.top 替换为你的实际域名(部署 AI-CS 的域名)。

示例

<!-- 如果你的 AI-CS 部署在 https://cs.example.com -->
<iframe src="https://cs.example.com/chat" ...></iframe>

响应式设计

插件会自动适配不同设备:

  • 移动端:小窗宽度自适应,最大高度优化
  • 平板端:中等尺寸窗口
  • 桌面端:完整尺寸窗口

自定义样式

如果需要自定义样式,可以通过 CSS 覆盖:

/* 自定义浮动按钮 */
#ai-cs-toggle-btn {
  background-color: #your-color !important;
  width: 60px !important;
  height: 60px !important;
}

/* 自定义聊天窗口 */
#ai-cs-chat-iframe {
  border-radius: 16px !important;
  box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25) !important;
}

🤝 贡献

欢迎提交 Issue 和 Pull Request

📄 许可证

MIT © 2025 2930134478

🙏 致谢

感谢所有为这个项目做出贡献的开发者!


最后更新: 2025-01-12

S
Description
No description provided
Readme MIT 5.2 MiB
Languages
TypeScript 57.8%
Go 40.3%
JavaScript 0.8%
CSS 0.5%
Shell 0.3%
Other 0.3%