一个支持个人对话和群组对话的在线聊天应用,具有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启动脚本
-
users - 用户表
- id, username, hashed_password, created_at
-
conversations - 个人对话表
- id, title, owner_id, created_at, updated_at
-
messages - 消息表
- id, conversation_id, content, role, created_at, ai_call_success, ai_error_message
-
tags - 标签表
- id, name, created_at
-
conversation_tags - 对话标签关联表(多对多)
-
bot_roles - 机器人角色表
- id, name, personality, system_prompt, is_active
-
group_conversations - 群组对话表
- id, title, owner_id, created_at
-
group_members - 群组成员表
- id, group_id, user_id, bot_role_id, joined_at
-
group_messages - 群组消息表
- id, group_id, sender_id, bot_role_id, content, created_at
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.shWindows:
start.bat# 开发环境
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。
cd backend
pip install -r requirements.txt# 复制环境变量示例文件
cd backend
cp .env.example .env
# 编辑.env文件,配置你的密钥
# 至少需要修改 SECRET_KEY 为一个强随机字符串如果需要预创建测试用户:
cd backend
python init_db.py这将创建两个测试账号:
- 用户1:
testuser1/password123 - 用户2:
testuser2/password123
cd backend
python main.py后端服务将在 http://localhost:8000 启动
直接在浏览器中打开 frontend/index.html 文件,或使用本地服务器:
cd frontend
python -m http.server 3000然后访问 http://localhost:3000
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如果未运行初始化脚本,首次使用需要自行注册账号:
- 用户名: 任意(至少3个字符)
- 密码: 至少6个字符
为什么选择FastAPI?
- 现代化、高性能的Python Web框架
- 自动生成OpenAPI文档(访问
/docs查看) - 内置数据验证(Pydantic)
- 支持异步操作,适合处理AI API调用
- 类型提示友好,代码可读性高
为什么选择SQLite?
- 零配置,无需安装数据库服务
- 适合项目演示和快速原型开发
- 文件数据库,便于备份和迁移
- 在生产环境可轻松切换到PostgreSQL/MySQL
设计思路:
- 使用多对多关系存储对话和标签的关联
- 支持一个对话有多个标签,一个标签可被多个对话使用
- 提供标签筛选功能,方便用户管理对话
存储方案:
tags表存储所有标签conversation_tags关联表存储对话和标签的关系- SQLAlchemy的
relationship自动处理关联查询
设计思路:
- 实现重试机制:失败后自动重试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_success和ai_error_message字段 - 前端根据这些字段显示错误信息
设计选择:随机选择一个机器人回复
为什么选择这个策略?
- 避免消息过多,保持对话简洁
- 不同的机器人提供不同的视角
- 用户可以创建多个群组,每个群组使用不同的机器人组合
其他可选策略:
- 所有机器人都回复(适合需要多角度讨论的场景)
- 轮流回复(确保每个机器人都有机会发言)
- 基于内容触发(根据消息内容选择合适的机器人)
设计思路:
- 检查最近的消息历史
- 统计连续的机器人消息数量
- 如果连续机器人消息超过阈值(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转义)
-
性能优化
- ✅ 为常用查询添加数据库索引
- ✅ 实现消息分页功能
- ✅ 添加AI响应缓存机制(避免重复调用)
-
安全性和稳定性
- ✅ 密码加密从SHA-256+salt升级为bcrypt
- ✅ 添加环境变量配置支持(.env文件)
- ✅ 实现完整的日志记录系统
- ✅ 日志同时输出到控制台和文件
-
代码质量
- ✅ 添加基础单元测试
- ✅ 优化前端错误处理和加载状态
- ✅ 添加加载指示器UI
-
部署支持
- ✅ 添加Docker配置
- ✅ 添加docker-compose配置
- ✅ 添加数据库初始化脚本
-
功能增强
- ⏳ 支持流式响应
- ⏳ 添加文件上传功能
- ⏳ 实现对话搜索
- ⏳ 添加用户头像
-
部署优化
- ⏳ 使用PostgreSQL替代SQLite
- ⏳ 配置Nginx反向代理
- ⏳ 实现监控和告警系统
-
测试完善
- ⏳ 提升测试覆盖率
- ⏳ 添加集成测试
- ⏳ 添加端到端测试
本项目仅用于演示和学习目的。
如有问题,请通过测试工作群联系。