Skip to content

StormMineTown/ChatGPT_Study

Repository files navigation

在线聊天应用

一个支持个人对话和群组对话的在线聊天应用,具有AI回复功能和多机器人交互能力。

项目概述

本项目实现了类似ChatGPT的基本交互体验,包括:

  • 多用户认证与授权
  • 个人对话管理(支持标签功能)
  • 消息交互(带AI回复)
  • 群组对话功能(多机器人、防循环机制)

技术栈

后端

  • 语言: Python 3.8+
  • 框架: FastAPI 0.124.4
  • 数据库: SQLite
  • ORM: SQLAlchemy 2.0.25
  • 认证: JWT (python-jose)
  • 密码加密: Passlib (bcrypt)

前端

  • 技术: 原生 HTML5, CSS3, JavaScript (ES6+)
  • 风格: 渐变色现代设计,响应式布局

项目结构

ChatGPT2/
├── backend/
│   ├── main.py                 # FastAPI应用入口
│   ├── database.py             # 数据库配置
│   ├── models.py               # SQLAlchemy数据库模型
│   ├── schemas.py              # Pydantic数据模型
│   ├── auth.py                 # 认证相关逻辑
│   ├── logger.py               # 日志配置模块
│   ├── init_db.py              # 数据库初始化脚本
│   ├── .env.example            # 环境变量示例文件
│   ├── requirements.txt        # Python依赖
│   ├── routes/
│   │   ├── __init__.py
│   │   ├── auth.py             # 认证路由
│   │   ├── conversations.py    # 个人对话路由
│   │   └── groups.py           # 群组对话路由
│   ├── services/
│   │   ├── ai_service.py       # AI服务模拟(含缓存)
│   │   └── group_logic.py      # 群组逻辑(机器人交互)
│   └── tests/                  # 单元测试
│       ├── __init__.py
│       ├── conftest.py         # 测试配置
│       ├── test_auth.py        # 认证测试
│       ├── test_ai_service.py  # AI服务测试
│       └── test_conversations.py # 对话功能测试
├── frontend/
│   ├── index.html              # 主页面
│   ├── styles.css              # 样式文件(含加载指示器)
│   └── app.js                  # 前端逻辑(含加载状态)
├── logs/                       # 日志目录(自动创建)
├── README.md                   # 项目文档
├── DEPLOYMENT.md               # 部署指南
├── cs.md                       # 测评题目文档
├── Dockerfile                  # Docker配置
├── docker-compose.yml          # Docker Compose配置
├── nginx.conf.example          # Nginx配置示例
├── .dockerignore               # Docker忽略文件
├── .gitignore                  # Git忽略文件
├── start.sh                    # Linux/Mac启动脚本
└── start.bat                   # Windows启动脚本

数据库设计

核心表结构

  1. users - 用户表

    • id, username, hashed_password, created_at
  2. conversations - 个人对话表

    • id, title, owner_id, created_at, updated_at
  3. messages - 消息表

    • id, conversation_id, content, role, created_at, ai_call_success, ai_error_message
  4. tags - 标签表

    • id, name, created_at
  5. conversation_tags - 对话标签关联表(多对多)

  6. bot_roles - 机器人角色表

    • id, name, personality, system_prompt, is_active
  7. group_conversations - 群组对话表

    • id, title, owner_id, created_at
  8. group_members - 群组成员表

    • id, group_id, user_id, bot_role_id, joined_at
  9. group_messages - 群组消息表

    • id, group_id, sender_id, bot_role_id, content, created_at

API 端点列表

认证相关

  • POST /api/auth/register - 用户注册
  • POST /api/auth/login - 用户登录
  • GET /api/auth/me - 获取当前用户信息

个人对话相关

  • POST /api/conversations - 创建对话
  • GET /api/conversations - 获取对话列表(支持标签筛选)
  • GET /api/conversations/{id} - 获取对话详情
  • PUT /api/conversations/{id} - 更新对话标题
  • DELETE /api/conversations/{id} - 删除对话
  • POST /api/conversations/{id}/messages - 发送消息
  • GET /api/conversations/{id}/messages - 获取消息列表

标签相关

  • POST /api/conversations/tags - 创建标签
  • GET /api/conversations/tags/all - 获取所有标签
  • POST /api/conversations/{id}/tags/{tag_name} - 为对话添加标签
  • DELETE /api/conversations/{id}/tags/{tag_name} - 从对话移除标签

群组对话相关

  • POST /api/groups/bot-roles - 创建机器人角色
  • GET /api/groups/bot-roles - 获取所有机器人角色
  • POST /api/groups - 创建群组
  • GET /api/groups - 获取群组列表
  • GET /api/groups/{id} - 获取群组详情
  • DELETE /api/groups/{id} - 删除群组
  • POST /api/groups/{id}/messages - 发送群组消息
  • GET /api/groups/{id}/messages - 获取群组消息列表

快速启动

方式一:使用启动脚本(推荐)

Linux/Mac:

./start.sh

Windows:

start.bat

方式二:使用Docker

# 开发环境
docker-compose up -d

# 生产环境(包含Nginx)
docker-compose --profile production up -d

# 初始化数据库(预创建测试用户)
docker-compose exec backend python init_db.py

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

服务将在 http://localhost:8000 启动。

方式三:手动启动

详细说明请查看下方"本地启动和运行"部分。

详细部署说明请查看 DEPLOYMENT.md

本地启动和运行

1. 安装Python依赖

cd backend
pip install -r requirements.txt

2. 配置环境变量

# 复制环境变量示例文件
cd backend
cp .env.example .env

# 编辑.env文件,配置你的密钥
# 至少需要修改 SECRET_KEY 为一个强随机字符串

3. 初始化数据库(可选)

如果需要预创建测试用户:

cd backend
python init_db.py

这将创建两个测试账号:

  • 用户1: testuser1 / password123
  • 用户2: testuser2 / password123

4. 启动后端服务

cd backend
python main.py

后端服务将在 http://localhost:8000 启动

5. 访问前端页面

直接在浏览器中打开 frontend/index.html 文件,或使用本地服务器:

cd frontend
python -m http.server 3000

然后访问 http://localhost:3000

6. 运行测试

cd backend

# 运行所有测试
pytest tests/ -v

# 运行特定测试文件
pytest tests/test_auth.py -v

# 运行特定测试函数
pytest tests/test_auth.py::test_register_user -v

# 查看测试覆盖率
pytest tests/ --cov=. --cov-report=html

7. 测试账号

如果未运行初始化脚本,首次使用需要自行注册账号:

  • 用户名: 任意(至少3个字符)
  • 密码: 至少6个字符

核心功能设计说明

1. 技术选型

为什么选择FastAPI?

  • 现代化、高性能的Python Web框架
  • 自动生成OpenAPI文档(访问 /docs 查看)
  • 内置数据验证(Pydantic)
  • 支持异步操作,适合处理AI API调用
  • 类型提示友好,代码可读性高

为什么选择SQLite?

  • 零配置,无需安装数据库服务
  • 适合项目演示和快速原型开发
  • 文件数据库,便于备份和迁移
  • 在生产环境可轻松切换到PostgreSQL/MySQL

2. 对话标签功能

设计思路:

  • 使用多对多关系存储对话和标签的关联
  • 支持一个对话有多个标签,一个标签可被多个对话使用
  • 提供标签筛选功能,方便用户管理对话

存储方案:

  • tags 表存储所有标签
  • conversation_tags 关联表存储对话和标签的关系
  • SQLAlchemy的 relationship 自动处理关联查询

3. AI API调用健壮性

设计思路:

  • 实现重试机制:失败后自动重试1-2次
  • 错误处理:捕获所有可能的异常
  • 数据一致性:即使AI调用失败,用户消息仍会保存
  • 用户反馈:在消息中标记AI调用失败状态

实现细节:

# 带重试机制的AI调用
async def call_ai_with_retry(user_message, max_retries=2, retry_delay=1.0):
    for attempt in range(max_retries + 1):
        try:
            # 模拟10%的失败率
            if random.random() < 0.1:
                raise Exception("AI服务暂时不可用")
            # 生成回复
            response = generate_response(user_message)
            return {'success': True, 'response': response}
        except Exception as e:
            if attempt < max_retries:
                await asyncio.sleep(retry_delay)
    # 所有重试都失败
    return {'success': False, 'response': "抱歉,AI服务暂时无法响应"}

数据一致性保证:

  • 用户消息始终保存,不受AI调用影响
  • AI回复消息包含 ai_call_successai_error_message 字段
  • 前端根据这些字段显示错误信息

4. 群组对话核心逻辑

机器人交互策略

设计选择:随机选择一个机器人回复

为什么选择这个策略?

  • 避免消息过多,保持对话简洁
  • 不同的机器人提供不同的视角
  • 用户可以创建多个群组,每个群组使用不同的机器人组合

其他可选策略:

  • 所有机器人都回复(适合需要多角度讨论的场景)
  • 轮流回复(确保每个机器人都有机会发言)
  • 基于内容触发(根据消息内容选择合适的机器人)

防循环机制

设计思路:

  • 检查最近的消息历史
  • 统计连续的机器人消息数量
  • 如果连续机器人消息超过阈值(3条),则不再触发机器人回复

实现代码:

def should_bot_reply(group_id, bot_role_id, db):
    # 获取最近的5条消息
    recent_messages = db.query(GroupMessage).filter(
        GroupMessage.group_id == group_id
    ).order_by(GroupMessage.created_at.desc()).limit(5).all()

    # 统计连续的机器人消息数量
    consecutive_bot_messages = 0
    for msg in reversed(recent_messages):
        if msg.bot_role_id is not None:
            consecutive_bot_messages += 1
        else:
            break

    # 如果连续机器人消息超过3条,则不再让机器人回复
    return consecutive_bot_messages < 3

确保回复机制

设计思路:

  • 如果机器人策略没有产生回复(如触发防循环),强制第一个机器人回复
  • 确保用户发送消息后至少有一个机器人响应
  • 回复内容可以是简单的确认或"我不知道"

实现代码:

# 确保至少有一个机器人回复
if not bot_responses and bot_members:
    first_bot = bot_members[0]
    response_content = BotRoleService.get_bot_response(
        first_bot.bot_role.name,
        user_message
    )
    bot_message = GroupMessage(
        group_id=group_id,
        bot_role_id=first_bot.bot_role.id,
        content=response_content
    )
    db.add(bot_message)
    db.commit()

测试用户信息

首次使用需要自行注册,推荐创建两个测试账号:

  • 用户1: testuser1 / password123
  • 用户2: testuser2 / password123

加分项实现

前端部分编写 - 完整的单页应用,支持所有核心功能 ✅ 数据库Schema设计 - 合理的关系设计,支持标签和群组功能 ✅ 错误处理 - 完善的错误处理,特别是AI调用失败的处理 ✅ 输入验证 - 使用Pydantic进行数据验证 ✅ API文档 - FastAPI自动生成Swagger文档(访问 /docs) ✅ 防循环机制 - 群组对话中防止机器人无限循环 ✅ 确保回复机制 - 保证用户消息后至少有一个机器人回复 ✅ 标签功能 - 支持对话标签和标签筛选

安全考虑

  • 密码使用bcrypt加密存储
  • JWT token认证
  • 用户数据隔离(严格的ACL)
  • SQL注入防护(使用ORM)
  • XSS防护(前端HTML转义)

后续优化方向

已实现的优化 ✅

  1. 性能优化

    • ✅ 为常用查询添加数据库索引
    • ✅ 实现消息分页功能
    • ✅ 添加AI响应缓存机制(避免重复调用)
  2. 安全性和稳定性

    • ✅ 密码加密从SHA-256+salt升级为bcrypt
    • ✅ 添加环境变量配置支持(.env文件)
    • ✅ 实现完整的日志记录系统
    • ✅ 日志同时输出到控制台和文件
  3. 代码质量

    • ✅ 添加基础单元测试
    • ✅ 优化前端错误处理和加载状态
    • ✅ 添加加载指示器UI
  4. 部署支持

    • ✅ 添加Docker配置
    • ✅ 添加docker-compose配置
    • ✅ 添加数据库初始化脚本

待实现的优化 ⏳

  1. 功能增强

    • ⏳ 支持流式响应
    • ⏳ 添加文件上传功能
    • ⏳ 实现对话搜索
    • ⏳ 添加用户头像
  2. 部署优化

    • ⏳ 使用PostgreSQL替代SQLite
    • ⏳ 配置Nginx反向代理
    • ⏳ 实现监控和告警系统
  3. 测试完善

    • ⏳ 提升测试覆盖率
    • ⏳ 添加集成测试
    • ⏳ 添加端到端测试

许可证

本项目仅用于演示和学习目的。

联系方式

如有问题,请通过测试工作群联系。

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors