Skip to content

Latest commit

 

History

2 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

基于 Golang + Gin 构建的 AI 应用服务平台,集成了 JWT 鉴权、邮箱验证码注册、会话式聊天、SSE 流式输出 等能力。

项目当前实现聚焦在两个核心场景:

  1. 智能对话:支持创建新会话、继续历史会话、查看历史消息,并支持普通返回与 SSE 流式返回两种模式。
  2. 图像识别:前端上传图片后,后端完成文件解析、图像解码、预处理、 推理与类别返回。

系统架构概览

项目整体可以分成四层:

  • Controller 层:处理 HTTP 请求与参数校验,对外返回统一响应结构。
  • Service 层:承接业务逻辑,例如登录注册、会话创建、AI 对话、图像识别。
  • DAO 层:封装数据库访问。
  • Common / Utils 层:提供 AIHelper、JWT、Redis、RabbitMQ、MySQL、图像识别等公共能力。

数据模型

user

用于保存用户信息。

关键字段:

  • id:主键
  • email:邮箱
  • username:账号,唯一索引
  • password:加密后的密码
  • created_at / updated_at / deleted_at

session

用于保存聊天会话。

关键字段:

  • id:会话 ID,使用 UUID
  • username:所属用户
  • title:会话标题,当前实现中创建会话时取首条问题
  • created_at / updated_at / deleted_at

message

用于保存消息内容。

关键字段:

  • id:自增主键
  • session_id:所属会话
  • username:所属用户
  • content:消息内容
  • is_user:是否为用户消息
  • created_at

核心实现说明

1)JWT 鉴权

  • 登录或注册成功后签发 JWT
  • token 中包含 idusername
  • 受保护接口统一通过中间件校验
  • 中间件解析成功后,将 userName 写入 Gin 上下文

2)AI 模型抽象

项目通过 AIModel 接口统一封装模型能力,并通过工厂模式支持不同模型实现。当前支持:

  • modelType = "1":OpenAI
  • modelType = "2":Ollama

3)AIHelper 与会话运行时

AIHelper 是会话级的运行时对象,负责维护:

  • 当前会话的消息上下文
  • 绑定的底层模型
  • 消息保存策略

系统通过 AIHelperManageruserName -> sessionID -> AIHelper 的方式统一管理会话运行时对象。

4)SSE 流式返回

在流式接口中,Controller 会设置:

Content-Type: text/event-stream
Cache-Control: no-cache
Connection: keep-alive

随后每拿到一个模型 chunk,就写入:

data: xxx

前端可以边接收边渲染。

5)RabbitMQ 异步写库

聊天消息不会直接阻塞式写入数据库,而是先推送到 RabbitMQ,由消费者异步写入 message 表,从而减少主链路阻塞,提高接口响应速度。

6)图像识别链路

图像识别的完整链路如下:

  1. 前端通过 multipart/form-data 上传图片
  2. Controller 使用 FormFile("image") 获取文件
  3. Service 读取文件字节流到内存
  4. ImageRecognizer 对图片进行解码
  5. 将图片缩放到 224x224
  6. 提取 RGB 并归一化到 [0, 1]
  7. NCHW 格式写入 ONNX 输入张量
  8. 执行 ONNX Runtime 推理
  9. 取最大概率下标并映射为标签名称
  10. 返回最终类别名给前端

返回结构

大多数接口都会返回统一响应结构:

{
  "status_code": 1000,
  "status_msg": "success"
}

常见状态码:

  • 1000:成功
  • 2001:请求参数错误
  • 2002:用户名已存在
  • 2003:用户不存在
  • 2004:用户名或密码错误
  • 2006:无效 Token
  • 2008:验证码错误
  • 4001:服务繁忙
  • 5003:模型运行失败

当前实现说明

以下内容是基于当前代码实现的真实情况:

  1. 会话列表当前来自内存中的 AIHelperManager,不是直接从 session 表查询。
  2. 会话标题在列表接口中暂时使用 sessionId 作为返回值,虽然创建会话时已经保存了首条问题作为 title,但当前列表接口未使用该字段。
  3. 图像识别模型路径与标签路径目前为硬编码,部署前需要手动准备。
  4. RabbitMQ 已实现异步落库能力,但若要进一步增强可靠性,可继续补充手动 ack、重试与幂等控制。
  5. Redis 当前用于验证码缓存;若要严格保证“校验成功后立即删除”的原子性,可进一步用 Lua 脚本实现校验与删除的一次性执行。

后续可优化方向

  • 将会话列表改为从数据库读取,并返回真实标题
  • 补充会话删除与会话过期清理机制
  • 为 RabbitMQ 增加手动 ack、死信队列与幂等消费
  • 将图像模型路径改为配置化
  • 为图像识别增加文件大小限制、格式白名单与置信度输出
  • 增加日志追踪、限流、熔断与监控能力

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages