Skip to content

liewstar/BullModelAI

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

52 Commits
 
 
 
 
 
 
 
 

Repository files navigation

🐂 BullModelAI

智能3D模型生成平台

License Java Spring Boot Vue.js TypeScript Vite Three.js Build Status Code Quality Coverage Release

🎥 视频演示

BullModelAI 演示视频

📖 项目简介

BullModelAI 是一个基于人工智能的3D模型生成平台,致力于为创作者提供智能化的3D内容创作工具。

✨ 核心特性

  • 🎨 AI驱动的3D模型生成 - 基于Meshy AI的智能3D模型创建
  • 🌐 现代化Web界面 - Vue.js + Three.js打造的3D可视化体验
  • 🔒 完整的用户系统 - 基于SA-Token的权限管理
  • 📱 响应式设计 - 支持桌面端和移动端访问
  • 🚀 高性能架构 - Spring Boot + Redis + PostgreSQL技术栈

🏗️ 技术架构

后端技术栈

  • Framework: Spring Boot 3.0.2
  • Language: Java 17
  • Database: PostgreSQL + Redis
  • Authentication: SA-Token
  • AI Integration: LangChain4j
  • Task Scheduling: Quartz
  • Monitoring: Actuator + Prometheus

前端技术栈

  • Framework: Vue.js 3.5.21
  • Language: TypeScript 5.3.3
  • Build Tool: Vite 7.1.6
  • UI Library: Element Plus + Tailwind CSS
  • 3D Rendering: Three.js 0.158.0
  • State Management: Pinia
  • HTTP Client: Axios

📁 项目结构

后端目录结构 (BullModelAI-backend)

BullModelAI-backend/
├── src/main/java/com/qiniu/bullmodelaibackend/
│   ├── BullModelAiBackendApplication.java    # Spring Boot 主应用程序入口
│   ├── annotation/                           # 自定义注解
│   │   └── MeshyTaskCache.java              # Meshy 任务缓存注解
│   ├── aspect/                              # AOP 切面编程
│   │   └── MeshyTaskCacheAspect.java        # 缓存切面实现
│   ├── config/                              # 配置类
│   │   ├── CorsConfig.java                  # 跨域配置
│   │   ├── JacksonConfig.java               # JSON序列化配置
│   │   ├── RedisConfig.java                 # Redis配置
│   │   ├── RetrofitConfig.java              # HTTP客户端配置
│   │   ├── SaTokenConfig.java               # 权限认证配置
│   │   ├── SecurityConfig.java              # 安全配置
│   │   └── WebMvcConfig.java                # Web MVC配置
│   ├── controller/                          # REST API 控制器
│   │   ├── AuthController.java              # 用户认证API
│   │   ├── CacheController.java             # 缓存管理API
│   │   ├── CategoryController.java          # 分类管理API
│   │   ├── ChatController.java              # 聊天功能API
│   │   ├── CommentController.java           # 评论系统API
│   │   ├── CommunityController.java         # 社区功能API
│   │   ├── MeshyController.java             # Meshy AI 集成API
│   │   ├── MeshyWebhookController.java      # Meshy Webhook处理
│   │   ├── ModelController.java             # 3D模型管理API
│   │   ├── QualityEvaluationController.java # 质量评估API
│   │   ├── TipController.java               # 打赏系统API
│   │   └── UserFollowController.java        # 用户关注API
│   ├── dto/                                 # 数据传输对象
│   │   ├── cache/                           # 缓存相关DTO
│   │   ├── request/                         # 请求参数DTO
│   │   ├── response/                        # 响应结果DTO
│   │   └── webhook/                         # Webhook事件DTO
│   ├── entity/                              # JPA 实体类
│   │   ├── User.java                        # 用户实体
│   │   ├── Model.java                       # 3D模型实体
│   │   ├── MeshyTaskDetail.java             # Meshy任务详情
│   │   ├── Category.java                    # 分类实体
│   │   ├── Comment.java                     # 评论实体
│   │   └── ...                              # 其他业务实体
│   ├── repository/                          # JPA 数据访问层
│   │   ├── UserRepository.java              # 用户数据访问
│   │   ├── ModelRepository.java             # 模型数据访问
│   │   ├── MeshyTaskDetailRepository.java   # 任务数据访问
│   │   └── ...                              # 其他Repository
│   ├── service/                             # 业务逻辑层
│   │   ├── MeshyService.java                # Meshy AI 集成服务
│   │   ├── ImprovedMeshyWebhookService.java # Webhook处理服务
│   │   ├── ModelQualityEvaluationService.java # 模型质量评估
│   │   ├── MeshyAssetStorageService.java    # 资源存储服务
│   │   ├── AuthService.java                 # 认证服务
│   │   ├── UserService.java                 # 用户服务
│   │   └── ...                              # 其他业务服务
│   └── util/                                # 工具类
│       └── RequestHashCalculator.java       # 请求哈希计算工具
├── src/main/resources/
│   ├── application.yml                      # 应用配置文件
│   ├── env.example                          # 环境变量示例
│   ├── prompts/                             # AI提示词模板
│   └── static/                              # 静态资源
├── storage/                                 # 本地文件存储
│   └── meshy/                               # Meshy AI 生成的资源
│       ├── models/                          # 3D模型文件
│       ├── textures/                        # 材质贴图
│       ├── thumbnails/                      # 缩略图
│       └── videos/                          # 预览视频
├── logs/                                    # 应用日志
└── pom.xml                                  # Maven 构建配置

前端目录结构 (BullModelAI-fronted)

BullModelAI-fronted/
├── src/
│   ├── App.vue                              # 主应用组件
│   ├── main.ts                              # 应用入口文件
│   ├── style.css                            # 全局样式
│   ├── vite-env.d.ts                        # Vite 类型声明
│   ├── assets/                              # 静态资源
│   │   ├── animations_data.json             # 动画数据配置
│   │   └── vue.svg                          # Vue.js 图标
│   ├── client/                              # API 客户端(自动生成)
│   │   ├── client.gen.ts                    # HTTP 客户端
│   │   ├── types.gen.ts                     # TypeScript 类型定义
│   │   ├── sdk.gen.ts                       # SDK 封装
│   │   └── core/                            # 核心API功能
│   ├── components/                          # Vue 组件
│   │   ├── 3D/                              # 3D 渲染组件
│   │   │   └── Scene3D.vue                  # Three.js 3D场景
│   │   ├── admin/                           # 管理员组件
│   │   │   ├── AdminDashboard.vue           # 管理员仪表板
│   │   │   ├── ModelManagement.vue          # 模型管理
│   │   │   ├── UserManagement.vue           # 用户管理
│   │   │   └── ...                          # 其他管理组件
│   │   ├── layout/                          # 布局组件
│   │   │   ├── DarkHeader.vue               # 深色主题头部
│   │   │   └── DarkSidebar.vue              # 深色主题侧边栏
│   │   ├── ui/                              # 通用UI组件
│   │   │   └── Button.vue                   # 自定义按钮组件
│   │   └── workspace/                       # 工作空间组件
│   │       ├── DarkRenderArea.vue           # 3D渲染区域
│   │       ├── DarkToolbar.vue              # 工具栏
│   │       ├── ModelViewer.vue              # 模型查看器
│   │       └── ...                          # 其他工作空间组件
│   ├── config/                              # 配置文件
│   │   └── api.ts                           # API 配置
│   ├── router/                              # Vue Router 路由
│   │   └── index.ts                         # 路由配置
│   ├── services/                            # 业务服务层
│   │   ├── modelService.ts                  # 模型相关服务
│   │   ├── categoryService.ts               # 分类服务
│   │   ├── commentService.ts                # 评论服务
│   │   ├── communityService.ts              # 社区服务
│   │   ├── evaluationService.ts             # 评估服务
│   │   ├── tipService.ts                    # 打赏服务
│   │   └── userService.ts                   # 用户服务
│   ├── stores/                              # Pinia 状态管理
│   │   └── auth.ts                          # 认证状态管理
│   ├── types/                               # TypeScript 类型定义
│   │   ├── animations.ts                    # 动画类型
│   │   └── index.ts                         # 通用类型
│   ├── utils/                               # 工具函数
│   │   ├── animationStorage.ts              # 动画存储工具
│   │   ├── api.ts                           # API 工具
│   │   └── assets.ts                        # 资源处理工具
│   └── views/                               # 页面组件
│       ├── admin/                           # 管理员页面
│       │   ├── EvaluationDashboard.vue      # 评估仪表板
│       │   └── EvaluationTestPage.vue       # 评估测试页面
│       ├── auth/                            # 认证页面
│       │   ├── LoginPage.vue                # 登录页面
│       │   └── RegisterPage.vue             # 注册页面
│       ├── DarkWorkspacePage.vue            # 深色工作空间
│       ├── DashboardPage.vue                # 用户仪表板
│       ├── GeneratePage.vue                 # AI生成页面
│       ├── HomePage.vue                     # 首页
│       ├── LandingPage.vue                  # 落地页
│       ├── ModelDetailPage.vue              # 模型详情页
│       ├── ModelsPage.vue                   # 模型列表页
│       └── NotFoundPage.vue                 # 404页面
├── public/                                  # 公共静态资源
│   ├── models/examples/                     # 示例模型文件
│   └── vite.svg                             # Vite 图标
├── dist/                                    # 构建输出目录
├── node_modules/                            # NPM 依赖包
├── package.json                             # NPM 包配置
├── package-lock.json                        # NPM 锁定文件
├── vite.config.ts                           # Vite 构建配置
├── tsconfig.json                            # TypeScript 配置
├── tsconfig.app.json                        # 应用 TS 配置
├── tsconfig.node.json                       # Node.js TS 配置
├── tailwind.config.js                       # Tailwind CSS 配置
├── postcss.config.js                        # PostCSS 配置
├── openapi-ts.config.ts                     # OpenAPI TypeScript 生成配置
└── index.html                               # HTML 入口文件

🚀 快速开始

前置要求

  • Java 17+
  • Node.js 18+
  • PostgreSQL 12+
  • Redis 6+
  • Maven 3.6+

后端启动

# 克隆项目
git clone https://github.com/liewstar/BullModelAI.git
cd BullModelAI

# 进入后端目录
cd BullModelAI-backend

# 配置环境变量
cp src/main/resources/env.example src/main/resources/.env

# 编辑配置文件
vim src/main/resources/.env

# 启动服务
mvn spring-boot:run

前端启动

# 进入前端目录
cd BullModelAI-fronted

# 安装依赖
npm install

# 启动开发服务器
npm run dev

📝 环境配置

后端环境变量

# 环境变量配置示例文件
# 复制此文件为 .env 并修改为实际值

# 数据库配置
DB_URL=jdbc:postgresql://pgm-uf62ry5xx4p28s62eo.pg.rds.aliyuncs.com:5432/bullmodelai
DB_USERNAME=postgres
DB_PASSWORD=your_db_password

# SA-Token JWT密钥
JWT_SECRET_KEY=bullmodelai-jwt-secret-key-2024

# 邮件配置 - 126邮箱
MAIL_HOST=smtp.126.com
MAIL_PORT=25
MAIL_USERNAME=[email protected]
MAIL_PASSWORD=your_126_auth_code
MAIL_FROM_NAME=BullModelAI

# Meshy API 配置
MESHY_API_KEY=msy_dummy_api_key_for_test_mode_12345678
MESHY_API_BASE_URL=https://api.meshy.ai/
MESHY_API_TIMEOUT=60
MESHY_API_LOG_LEVEL=BASIC

# Meshy WebHook 配置
MESHY_WEBHOOK_SECRET=your_webhook_secret_here
MESHY_WEBHOOK_VERIFY=false
MESHY_WEBHOOK_TIMEOUT=1800000

# Redis 配置
REDIS_HOST=your_redis_host
REDIS_PORT=6379
REDIS_USERNAME=your_redis_username
REDIS_PASSWORD=your_redis_password

# OpenAI API 配置 (LangChain4j)
OPENAI_API_KEY=your_openai_api_key_here
OPENAI_BASE_URL=https://api.openai.com/v1
OPENAI_MODEL=gpt-3.5-turbo
OPENAI_TEMPERATURE=0.7
OPENAI_MAX_TOKENS=2000
OPENAI_TIMEOUT=PT60S

# Milvus 向量数据库配置
MILVUS_HOST=localhost
MILVUS_PORT=19530
MILVUS_USERNAME=
MILVUS_PASSWORD=
MILVUS_DATABASE=default
MILVUS_CONNECT_TIMEOUT=10000
MILVUS_KEEP_ALIVE_TIME=30000
MILVUS_KEEP_ALIVE_TIMEOUT=20000
MILVUS_RETRY_ENABLED=true
MILVUS_MAX_RETRY_TIMES=3

3D模型生成系统流程图

1. createTextTo3DPreviewBatch 批量预览任务创建流程

graph TD
    A[用户请求批量生成3D预览] --> B[AOP缓存切面拦截]
    B --> C{计算请求Hash}
    C --> D[RequestHashCalculator.calculateHashFromArgs]
    D --> E[提取hashFields: prompt,artStyle,aiModel]
    E --> F[生成SHA256 Hash]
    F --> G{检查Redis缓存}
    
    G -->|缓存命中| H[从Redis获取CachedTaskResult]
    H --> I[模拟完整任务流程]
    I --> J[创建虚拟Webhook事件]
    J --> K[调用handleTextTo3DWebhookEvent]
    K --> L[创建MeshyTaskDetail记录]
    L --> M[创建Model记录]
    M --> N[返回BatchGenerationResponse]
    
    G -->|缓存未命中| O[执行原始API调用]
    O --> P[生成批次UUID]
    P --> Q[设置预览模式 mode=preview]
    Q --> R[并发创建多个任务]
    
    R --> S[循环创建单个任务]
    S --> T[为每个任务生成不同seed]
    T --> U[调用createSingleTextTo3DTask]
    U --> V[调用Meshy API]
    V --> W[保存MeshyTaskDetail到数据库]
    W --> X[设置requestHash字段]
    X --> Y[等待Webhook回调]
    
    Y --> Z[Webhook触发handleTextTo3DWebhookEvent]
    Z --> AA[任务完成后保存到Redis缓存]
    AA --> N
    
    style B fill:#e1f5fe
    style G fill:#fff3e0
    style H fill:#e8f5e8
    style O fill:#fce4ec
    style Z fill:#f3e5f5
Loading

2. handleTextTo3DWebhookEvent 任务落库处理流程

graph TD
    A[Webhook事件触发] --> B[handleTextTo3DWebhookEvent]
    B --> C[根据任务ID查找MeshyTaskDetail]
    C --> D{任务记录是否存在}
    
    D -->|不存在| E[记录错误日志并返回false]
    D -->|存在| F[更新任务基本信息]
    
    F --> G[updateBasicInfo]
    G --> H[更新状态/进度/提示词/艺术风格/错误信息]
    H --> I[updateTimeInfo]
    I --> J[更新创建时间/开始时间/完成时间]
    J --> K{任务状态是否为SUCCEEDED}
    
    K -->|非成功状态| L[保存MeshyTaskDetail到数据库]
    L --> M[更新原始API响应]
    M --> N[返回true]
    
    K -->|成功状态| O[updateTaskFileUrls]
    O --> P[检查是否缺少关键文件]
    P --> Q{是否缺少模型文件}
    
    Q -->|缺少文件| R[retryGetTaskDetailIfNeeded]
    R --> S[调用meshyService.getTextTo3DTaskDetailWithRetry]
    S --> T[Spring Retry机制重试获取]
    T --> U[更新TaskDetail为最新数据]
    
    Q -->|文件完整| V[下载并存储文件]
    U --> V
    
    V --> W[MeshyAssetStorageService处理文件]
    W --> X[下载缩略图到本地]
    X --> Y[下载模型文件 GLB/FBX/OBJ/USDZ]
    Y --> Z[下载纹理文件组]
    Z --> AA[下载视频文件]
    AA --> BB[更新本地文件路径]
    
    BB --> CC[createModelFromSucceededTask]
    CC --> DD[创建新的Model记录]
    DD --> EE[设置模型基本信息]
    EE --> FF[updateModelFromWebhookEvent]
    FF --> GG[设置模型文件URLs为本地路径]
    GG --> HH[处理纹理信息并序列化为JSON]
    HH --> II[设置模型状态为PUBLISHED]
    II --> JJ[保存Model到数据库]
    
    JJ --> KK[saveToCacheIfNeeded]
    KK --> LL{是否有requestHash}
    
    LL -->|有Hash| MM[检查Redis缓存是否已存在]
    MM --> NN{缓存是否已存在}
    NN -->|不存在| OO[创建CachedTaskResult]
    OO --> PP[保存到Redis缓存,过期时间168小时]
    PP --> QQ[触发异步质量评估]
    
    LL -->|无Hash| QQ
    NN -->|已存在| QQ
    
    QQ --> RR[triggerAsyncQualityEvaluation]
    RR --> SS[ModelQualityEvaluationService.calculateAndSaveQualityScore]
    SS --> TT[返回true完成处理]
    
    L --> TT
    
    style A fill:#e3f2fd
    style B fill:#e8f5e8
    style Q fill:#fff3e0
    style R fill:#fce4ec
    style V fill:#e1f5fe
    style W fill:#f3e5f5
    style CC fill:#e8f5e8
    style KK fill:#fff3e0
    style PP fill:#e8f5e8
    style QQ fill:#f3e5f5
Loading

3. Redis缓存和向量数据库集成架构

graph TD
    A[用户请求] --> B[AOP缓存切面]
    B --> C[RequestHashCalculator]
    C --> D[计算SHA256 Hash]
    D --> E[Redis缓存检查]
    
    E -->|命中| F[MeshyTaskCacheService.getCachedResult]
    F --> G[从Redis获取JSON数据]
    G --> H[反序列化为CachedTaskResult]
    H --> I[创建虚拟Webhook事件]
    I --> J[模拟完整任务流程]
    
    E -->|未命中| K[执行原始API调用]
    K --> L[任务完成后Webhook回调]
    L --> M[saveToCacheIfNeeded]
    M --> N[序列化任务结果]
    N --> O[保存到Redis]
    O --> P[设置过期时间]
    
    P --> Q[预留: 向量数据库集成]
    Q --> R[saveToVectorDatabase]
    R --> S[计算embedding向量]
    S --> T[存储到向量数据库]
    T --> U[支持相似请求搜索]
    
    style E fill:#e3f2fd
    style F fill:#e8f5e8
    style O fill:#e8f5e8
    style Q fill:#fff3e0
    style T fill:#f3e5f5
Loading

📊 模型质量评估系统

设计目标

  • 客观性:基于数据驱动的量化评估
  • 公平性:防止"富者愈富"效应,保护新作者
  • 实用性:反映模型的真实商业和社会价值
  • 动态性:考虑时间因素和作者权威度

评分体系架构

主观因素

  • 模型本身的质量判定:暂未实现,计划结合以下方式进行评估:
    • 专业评审:各行业内的人对相应行业的模型进行评分
    • 技术指标分析
      • 几何质量:面数分布、拓扑结构、UV映射质量
      • 材质贴图:纹理分辨率、法线贴图质量、材质真实感
      • 模型规范性:文件大小、格式兼容性、优化程度

客观因素(四个核心维度)

  • 用户参与度(35%) - 用户对模型的基础互动行为
  • 社交互动(30%) - 社区内的交流活跃度
  • 商业价值(25%) - 模型的经济价值体现
  • 基础分数(10%) - 保底分数机制

辅助调节因子

  • 时间衰减因子:根据模型发布时间调节分数
  • 作者权威度加成:基于创作者身份的额外加分

详细算法

核心算法特性

对数标准化处理
private double normalizeWithLog(int value, int baseline) {
    if (value <= 0) return 0;
    return Math.log(1 + (double) value / baseline) / Math.log(2);
}
  • 目的:避免数据倾斜问题,防止"富者愈富"效应
  • 原理:使用对数函数压缩大数值的影响,保护小数值的权重
Sigmoid函数映射
private double sigmoid(double x) {
    return 1.0 / (1.0 + Math.exp(-x));
}
  • 目的:实现非线性映射,平滑处理转化率
  • 应用:用于计算各种转化率的加成效果

1. 用户参与度评估(35%权重)

核心指标
  • 观看数(views):模型被浏览的次数
  • 点赞数(likes):用户的认可度表现
  • 下载数(downloads):实际使用意愿
  • 收藏数(bookmarks):长期价值认可
算法实现
private double calculateEngagementScore(Model model) {
    // 转化率计算
    double likeRate = (double) likes / views;
    double downloadRate = (double) downloads / views;
    double bookmarkRate = (double) bookmarks / views;
    
    // 基础分数计算(对数标准化)
    double likeScore = normalizeWithLog(likes, 100) * 0.4;      // 点赞基础分 40%
    double downloadScore = normalizeWithLog(downloads, 50) * 0.35; // 下载高价值分 35%
    double bookmarkScore = normalizeWithLog(bookmarks, 80) * 0.25; // 收藏中等分 25%
    
    // 转化率加成(Sigmoid函数处理)
    double rateBonus = sigmoid(likeRate * 20) * 0.3 + 
                      sigmoid(downloadRate * 50) * 0.5 + 
                      sigmoid(bookmarkRate * 30) * 0.2;
    
    return Math.min(100, (likeScore + downloadScore + bookmarkScore) * 70 + rateBonus * 30);
}
评分逻辑
  1. 基础分数(70%):基于绝对数量的对数标准化分数
  2. 转化率加成(30%):基于转化率的质量加成
  3. 权重分配:下载 > 点赞 > 收藏,体现实际价值导向

2. 社交互动评估(30%权重)

核心指标
  • 点赞密度:点赞数/观看数
  • 评论密度:评论数/观看数
  • 互动质量:深度交流的价值体现
算法实现
private double calculateSocialInteractionScore(Model model) {
    // 社交密度计算
    double likeDensity = (double) likes / views;
    double commentDensity = (double) comments / views;
    
    // 社交活跃度(评论价值 > 点赞价值)
    double socialActivity = normalizeWithLog(likes, 200) * 0.4 + 
                           normalizeWithLog(comments, 20) * 0.6;
    
    // 互动质量加成
    double interactionQuality = sigmoid(likeDensity * 30) * 0.4 + 
                               sigmoid(commentDensity * 100) * 0.6;
    
    return Math.min(100, socialActivity * 60 + interactionQuality * 40);
}
评分逻辑
  1. 社交活跃度(60%):评论权重高于点赞,体现深度互动价值
  2. 互动质量(40%):基于密度的质量评估
  3. 评论优先:认为评论比点赞更能体现用户投入度

3. 商业价值评估(25%权重)

核心指标
  • 下载价值:实际使用转化
  • 定价合理性:价格与市场接受度匹配
  • 打赏收益:用户额外付费意愿
算法实现
private double calculateCommercialValueScore(Model model) {
    // 下载价值分数(50分上限)
    double downloadValue = normalizeWithLog(downloads, 100) * 50;
    
    // 定价合理性分数
    double pricingScore = calculatePricingScore(price, downloads);
    
    // 打赏价值分数(每2元=1分,50分上限)
    double tipValue = Math.min(50, totalTips.doubleValue() / 2);
    
    return Math.min(100, downloadValue + pricingScore + tipValue);
}
定价合理性评估
private double calculatePricingScore(BigDecimal price, int downloads) {
    if (price.compareTo(BigDecimal.ZERO) == 0) {
        // 免费模型:下载数越多分数越高(30分上限)
        return Math.min(30, downloads * 0.3);
    } else {
        // 付费模型:价格与下载数的平衡
        if (downloads > 0) {
            // 有付费下载,定价合理(40分上限)
            return Math.min(40, 20 + downloads * 2);
        } else {
            // 付费无人下载,可能定价过高
            return Math.max(5, 25 - priceValue);
        }
    }
}

4. 基础分数(10%权重)

为所有模型提供基础保障分数,确保新模型和小众模型不会被完全忽视。

辅助调节机制

时间衰减因子

private double calculateTimeDecayFactor(LocalDateTime createdAt) {
    long daysOld = ChronoUnit.DAYS.between(createdAt, LocalDateTime.now());
    
    if (daysOld <= 7) {
        // 新模型7天内有加成(最多14%)
        return 1.0 + (7 - daysOld) * 0.02;
    } else if (daysOld <= 30) {
        // 30天内正常
        return 1.0;
    } else if (daysOld <= 90) {
        // 30-90天轻微衰减(最多12%)
        return 1.0 - (daysOld - 30) * 0.002;
    } else {
        // 90天以上较大衰减(最多30%,保底70%)
        return Math.max(0.7, 1.0 - (daysOld - 30) * 0.003);
    }
}
时间策略
  • 0-7天:新模型鼓励期,最多14%加成
  • 8-30天:正常期,无调整
  • 31-90天:缓慢衰减期,最多12%衰减
  • 90天+:显著衰减期,最多30%衰减,保底70%

作者权威度加成

private double calculateAuthorBonus(User author) {
    double bonus = 0;
    
    // 会员加成
    if (role == User.UserRole.PREMIUM) {
        bonus += 5.0;
    }
    
    // 管理员加成
    if (role == User.UserRole.ADMIN) {
        bonus += 10.0;
    }
    
    return Math.min(20, bonus); // 最多20分加成
}
权威度等级
  • 普通用户:无加成
  • 高级会员:+5分
  • 管理员:+10分
  • 上限控制:最多20分加成

最终分数计算

综合评分公式

// 非线性加权计算
double rawScore = 
    Math.pow(engagementScore / 100, 1.2) * 0.35 +     // 参与度35%,指数1.2
    Math.pow(socialScore / 100, 1.1) * 0.30 +          // 社交30%,指数1.1
    Math.pow(commercialScore / 100, 1.3) * 0.25 +      // 商业25%,指数1.3
    0.10;                                               // 基础10%

// 应用调节因子
double finalScore = Math.min(100, rawScore * 100 * timeDecayFactor + authorBonus);

非线性加权策略

  • 参与度:指数1.2,突出高参与度内容
  • 社交互动:指数1.1,适度增强社交价值
  • 商业价值:指数1.3,强调商业成功
  • 分数上限:100分封顶

配置参数

参数类型 参数值 说明
权重分配 35%/30%/25%/10% 四个维度的权重分配
对数基线 100/200/50/80/20 不同指标的对数标准化基线
时间衰减 7/30/90天 时间衰减的关键节点
衰减率 2%/0.2%/0.3% 不同时期的衰减速率
权威加成 5/10/20分 不同角色的加成分数

评估触发机制

评估开始时机

1. 实时触发

触发时机:Meshy AI任务成功完成时

执行流程

  1. Meshy API返回任务成功状态 SUCCEEDED
  2. 系统接收WebHook事件
  3. 创建Model记录,状态设为 PUBLISHED
  4. 延迟2秒后异步启动质量评估
  5. 生成初始质量分数并保存

优势

  • 响应及时,模型发布后立即有质量分数
  • 用户体验好,无需等待
  • 数据实时性强
2. 定时批量评估

新模型评估:每小时执行一次

  • 获取最近1小时发布的模型
  • 检查是否已经评估过
  • 逐一评估未评估的模型

活跃模型重评估:每天凌晨2点执行

  • 获取最近7天有新互动的模型(有新的观看、点赞、下载等行为)
  • 重新计算质量分数以反映最新的用户行为数据
  • 更新分数历史记录
3. 手动触发评估
  • 单个模型评估:通过API接口手动触发特定模型的评估
  • 批量评估:支持批量评估多个模型,可指定批次大小

评估状态管理

评估记录追踪
  • 初次评估:模型发布后2秒内完成
  • 定期重评:每天检查活跃模型,重新计算分数
  • 历史保留:所有评估记录都保留,可追踪分数变化趋势
评估策略

冷启动处理

  • 新发布模型(观看数为0):主要基于模型完整性、创建时间、作者权威度给予初始分数
  • 有用户行为数据的模型:基于完整的用户行为数据进行评估

数据不足处理

  • 观看数 < 10:主要依赖基础分数和时间因子
  • 互动数 < 5:降低社交互动权重,提高参与度权重
  • 下载数 = 0:商业价值分数采用保底机制

🚀 减少对第三方API调用次数的方案

当前实现:Redis精确缓存

目前系统采用基于请求哈希的精确缓存机制:

工作原理

  • 请求哈希计算:基于 promptartStyleaiModel 等关键字段生成 SHA256 哈希值
  • 精确匹配:只有完全相同的请求参数才能命中缓存
  • 缓存时效:Redis 缓存有效期为 168 小时(7天)

优缺点分析

优势:

  • ✅ 结果准确性高,完全匹配用户需求
  • ✅ 实现简单,逻辑清晰
  • ✅ 避免了相似但不同请求的混淆

劣势:

  • ❌ 命中率较低,参数稍有差异就无法复用
  • ❌ 对于相似请求无法有效利用缓存
  • ❌ 缓存利用效率不高

规划中的智能缓存方案

1. 向量数据库相似性匹配

核心思想:通过语义相似性而非精确匹配来复用缓存

技术实现

  • 向量化存储:将用户提示词转换为向量并存储到 Milvus 向量数据库
  • 相似性搜索:新请求时先进行向量相似性搜索
  • 阈值控制:设定相似度阈值(如 0.85),超过阈值则复用缓存结果
  • 语义理解:基于 AI 模型理解提示词语义,而非简单文本匹配

预期效果

用户输入:"一只可爱的小猫咪"
缓存中存在:"cute little cat" (相似度: 0.92)
→ 命中缓存,复用结果

2. 智能缓存预热策略

热门内容预生成

  • 趋势分析:分析用户请求热点和趋势
  • 批量预生成:在低峰期批量生成热门类型的 3D 模型
  • 多样化覆盖:针对不同艺术风格、模型类型进行预热
  • 季节性预热:根据节日、季节等因素调整预热内容

用户行为驱动

  • 个性化预测:基于用户历史行为预测可能的请求
  • 社区热点:根据社区讨论和点赞数据预热内容
  • 新用户引导:为新用户预热入门级、示例性内容

3. 混合缓存架构

三层缓存体系

graph TD
    A[用户请求] --> B[L1: Redis精确缓存]
    B -->|未命中| C[L2: 向量相似性缓存]
    C -->|未命中| D[L3: 预热内容库]
    D -->|未命中| E[调用第三方API]
    
    B -->|命中| F[立即返回 <1s]
    C -->|命中| G[快速返回 2-3s]
    D -->|命中| H[调整后返回 5-8s]
Loading

缓存优先级

  1. 精确匹配:完全相同的请求,立即返回
  2. 高相似度:相似度 > 用户设定阈值,快速返回
  3. 预热内容:从预热库中选择最接近的结果进行调整
  4. API调用:无缓存可用时调用第三方API

🤔 对议题的思考

面向什么类型的用户

主要面向六大专业领域用户:

  1. 游戏开发 - 游戏资产快速生成,从角色到道具一应俱全
  2. 电影制作 - 为电影和动画创建高品质的3D角色、场景和特效模型
  3. 产品设计 - 快速原型设计和产品可视化,加速产品开发流程
  4. 室内设计 - 家具和装饰品3D建模,实现设计可视化
  5. 3D打印 - 生成可直接打印的3D模型,支持多种打印格式
  6. 教育培训 - 互动式3D教学模型,让学习更加生动有趣

面临什么痛点

  1. 技能门槛高 - 传统3D建模需要掌握Maya、Blender等专业软件,学习周期长
  2. 制作周期长 - 手工建模耗时费力,一个复杂模型可能需要几天甚至几周
  3. 成本昂贵 - 专业软件授权费用高,外包一个模型动辄几千元
  4. 素材匮乏 - 行业特定的高质量3D模型资源稀缺,难以找到合适的素材
  5. 格式兼容 - 不同软件和平台的模型格式不统一,转换麻烦
  6. 版权问题 - 商用模型版权复杂,使用风险大

我设想的用户故事

  • 游戏开发者:作为一个独立游戏开发者,我希望能通过文字描述快速生成游戏道具和角色模型,这样我就不用花大量时间学习复杂的3D建模软件,能把更多精力放在游戏玩法上

  • 电影制作人:作为一个小成本电影的制作人,我希望能快速生成背景道具和特效模型,降低制作成本,让创意不受预算限制

  • 产品设计师:作为一个产品设计师,我希望能在概念阶段就快速生成产品的3D模型,方便和客户沟通设计理念,加快产品迭代速度

  • 室内设计师:作为一个室内设计师,我希望能快速生成各种风格的家具模型用于方案展示,让客户更直观地看到设计效果

  • 3D打印爱好者:作为一个3D打印爱好者,我希望能找到各种有趣的模型并能自定义生成,满足个性化的打印需求

  • 教育工作者:作为一个生物老师,我希望能生成各种生物器官的3D模型,让学生通过互动式的3D模型更好地理解复杂的生物结构

APP需要哪些功能

核心功能:

  1. AI文字和图片生成3D模型
  2. 模型在线预览和下载

辅助功能:

  1. 模型分类和搜索
  2. 模型的画笔修复
  3. 社区互动(点赞、评论、收藏)
  4. AI生成提示词
  5. 打赏和付费下载
  6. 模型质量评分系统

各自的优先级

  1. P0(必须):AI生成功能、模型预览下载
  2. P1(重要):画笔修复、基础社区功能、AI生成提示词,模型质量评分
  3. P2(可选):打赏和付费

计划本次开发哪些功能

重点开发P0级功能:

  • ✅ 文字和图片转3D模型
  • ✅ 完整的用户注册登录系统
  • ✅ 3D模型在线预览
  • ✅ 模型下载和本地存储
  • ✅ 绑定骨骼和动画
  • ✅ 模型质量评分
  • ✅ AI生成提示词
  • ✅ 基础的Web界面和响应式设计

3D模型生成API选型对比

"抛开使用场景都是耍流氓" —— API选择必须结合具体的项目需求和约束条件

主要厂商对比分析

厂商 模型质量 价格 学习成本 生成速度 免费额度
OpenAI DALL-E 3D 🌟🌟🌟🌟🌟 💰💰💰💰💰 🔥🔥🔥🔥 ⚡⚡⚡ 💎
混元3D (腾讯) 🌟🌟🌟🌟 💰💰💰 🔥🔥🔥 ⚡⚡⚡⚡ 💎💎💎
Stability AI 🌟🌟🌟🌟 💰💰💰💰 🔥🔥🔥 ⚡⚡⚡ 💎💎
Runway ML 🌟🌟🌟 💰💰💰 🔥🔥🔥🔥 ⚡⚡ 💎💎
Meshy AI 🌟🌟🌟 💰💰 🔥 ⚡⚡⚡⚡ 💎💎💎💎💎
Kaedim 🌟🌟🌟🌟 💰💰💰 🔥🔥 ⚡⚡ 💎💎

为什么选择Meshy AI?

1. 团队背景吸引

  • 年轻团队:创始人和核心团队都很年轻,有创新活力
  • 技术驱动:专注于3D生成技术,不是大厂的边缘产品
  • 快速迭代:小团队决策快,产品更新频繁

2. 完美契合项目需求

  • 七天比赛友好:接口简单易懂,无需学习复杂的SDK
  • 快速上手:文档清晰,示例丰富,几小时就能集成
  • 生成速度快:30-60秒完成生成,适合快速验证想法

3. 成本优势明显

  • 学生优惠:第一个月提供大量免费API点数
  • 价格合理:相比OpenAI等大厂价格亲民
  • 按需付费:没有最低消费限制,适合小项目

4. 技术特点

  • 接口简洁:RESTful API,不像大厂SDK那样复杂臃肿
  • 格式丰富:支持GLB、FBX、OBJ、USDZ等主流格式
  • 质量尚可:虽然不是顶级,但满足原型和中等质量需求

5. 使用场景匹配

我们的场景:快速原型 + 学生项目 + 七天比赛
Meshy AI:简单易用 + 便宜实惠 + 生成快速
= 完美匹配 ✨

选择理由总结: 在有限的时间和预算约束下,Meshy AI提供了最佳的开发效率/成本/质量平衡点。对于七天比赛这种场景,快速集成低成本试错比追求极致质量更重要。

设置什么关键指标验证3D模型生成效果

详情见:模型质量评估系统

减少对第三方API调用次数的方案

详情见: 减少对第三方API的调用次数


About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published