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/
├── 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/
├── 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
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
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
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
- 客观性:基于数据驱动的量化评估
- 公平性:防止"富者愈富"效应,保护新作者
- 实用性:反映模型的真实商业和社会价值
- 动态性:考虑时间因素和作者权威度
- 模型本身的质量判定:暂未实现,计划结合以下方式进行评估:
- 专业评审:各行业内的人对相应行业的模型进行评分
- 技术指标分析:
- 几何质量:面数分布、拓扑结构、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);
}- 目的:避免数据倾斜问题,防止"富者愈富"效应
- 原理:使用对数函数压缩大数值的影响,保护小数值的权重
private double sigmoid(double x) {
return 1.0 / (1.0 + Math.exp(-x));
}- 目的:实现非线性映射,平滑处理转化率
- 应用:用于计算各种转化率的加成效果
- 观看数(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);
}- 基础分数(70%):基于绝对数量的对数标准化分数
- 转化率加成(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);
}- 社交活跃度(60%):评论权重高于点赞,体现深度互动价值
- 互动质量(40%):基于密度的质量评估
- 评论优先:认为评论比点赞更能体现用户投入度
- 下载价值:实际使用转化
- 定价合理性:价格与市场接受度匹配
- 打赏收益:用户额外付费意愿
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);
}
}
}为所有模型提供基础保障分数,确保新模型和小众模型不会被完全忽视。
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分 | 不同角色的加成分数 |
触发时机:Meshy AI任务成功完成时
执行流程:
- Meshy API返回任务成功状态
SUCCEEDED - 系统接收WebHook事件
- 创建Model记录,状态设为
PUBLISHED - 延迟2秒后异步启动质量评估
- 生成初始质量分数并保存
优势:
- 响应及时,模型发布后立即有质量分数
- 用户体验好,无需等待
- 数据实时性强
新模型评估:每小时执行一次
- 获取最近1小时发布的模型
- 检查是否已经评估过
- 逐一评估未评估的模型
活跃模型重评估:每天凌晨2点执行
- 获取最近7天有新互动的模型(有新的观看、点赞、下载等行为)
- 重新计算质量分数以反映最新的用户行为数据
- 更新分数历史记录
- 单个模型评估:通过API接口手动触发特定模型的评估
- 批量评估:支持批量评估多个模型,可指定批次大小
- 初次评估:模型发布后2秒内完成
- 定期重评:每天检查活跃模型,重新计算分数
- 历史保留:所有评估记录都保留,可追踪分数变化趋势
冷启动处理:
- 新发布模型(观看数为0):主要基于模型完整性、创建时间、作者权威度给予初始分数
- 有用户行为数据的模型:基于完整的用户行为数据进行评估
数据不足处理:
- 观看数 < 10:主要依赖基础分数和时间因子
- 互动数 < 5:降低社交互动权重,提高参与度权重
- 下载数 = 0:商业价值分数采用保底机制
目前系统采用基于请求哈希的精确缓存机制:
- 请求哈希计算:基于
prompt、artStyle、aiModel等关键字段生成 SHA256 哈希值 - 精确匹配:只有完全相同的请求参数才能命中缓存
- 缓存时效:Redis 缓存有效期为 168 小时(7天)
优势:
- ✅ 结果准确性高,完全匹配用户需求
- ✅ 实现简单,逻辑清晰
- ✅ 避免了相似但不同请求的混淆
劣势:
- ❌ 命中率较低,参数稍有差异就无法复用
- ❌ 对于相似请求无法有效利用缓存
- ❌ 缓存利用效率不高
核心思想:通过语义相似性而非精确匹配来复用缓存
技术实现:
- 向量化存储:将用户提示词转换为向量并存储到 Milvus 向量数据库
- 相似性搜索:新请求时先进行向量相似性搜索
- 阈值控制:设定相似度阈值(如 0.85),超过阈值则复用缓存结果
- 语义理解:基于 AI 模型理解提示词语义,而非简单文本匹配
预期效果:
用户输入:"一只可爱的小猫咪"
缓存中存在:"cute little cat" (相似度: 0.92)
→ 命中缓存,复用结果
热门内容预生成:
- 趋势分析:分析用户请求热点和趋势
- 批量预生成:在低峰期批量生成热门类型的 3D 模型
- 多样化覆盖:针对不同艺术风格、模型类型进行预热
- 季节性预热:根据节日、季节等因素调整预热内容
用户行为驱动:
- 个性化预测:基于用户历史行为预测可能的请求
- 社区热点:根据社区讨论和点赞数据预热内容
- 新用户引导:为新用户预热入门级、示例性内容
三层缓存体系:
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]
缓存优先级:
- 精确匹配:完全相同的请求,立即返回
- 高相似度:相似度 > 用户设定阈值,快速返回
- 预热内容:从预热库中选择最接近的结果进行调整
- API调用:无缓存可用时调用第三方API
主要面向六大专业领域用户:
- 游戏开发 - 游戏资产快速生成,从角色到道具一应俱全
- 电影制作 - 为电影和动画创建高品质的3D角色、场景和特效模型
- 产品设计 - 快速原型设计和产品可视化,加速产品开发流程
- 室内设计 - 家具和装饰品3D建模,实现设计可视化
- 3D打印 - 生成可直接打印的3D模型,支持多种打印格式
- 教育培训 - 互动式3D教学模型,让学习更加生动有趣
- 技能门槛高 - 传统3D建模需要掌握Maya、Blender等专业软件,学习周期长
- 制作周期长 - 手工建模耗时费力,一个复杂模型可能需要几天甚至几周
- 成本昂贵 - 专业软件授权费用高,外包一个模型动辄几千元
- 素材匮乏 - 行业特定的高质量3D模型资源稀缺,难以找到合适的素材
- 格式兼容 - 不同软件和平台的模型格式不统一,转换麻烦
- 版权问题 - 商用模型版权复杂,使用风险大
-
游戏开发者:作为一个独立游戏开发者,我希望能通过文字描述快速生成游戏道具和角色模型,这样我就不用花大量时间学习复杂的3D建模软件,能把更多精力放在游戏玩法上
-
电影制作人:作为一个小成本电影的制作人,我希望能快速生成背景道具和特效模型,降低制作成本,让创意不受预算限制
-
产品设计师:作为一个产品设计师,我希望能在概念阶段就快速生成产品的3D模型,方便和客户沟通设计理念,加快产品迭代速度
-
室内设计师:作为一个室内设计师,我希望能快速生成各种风格的家具模型用于方案展示,让客户更直观地看到设计效果
-
3D打印爱好者:作为一个3D打印爱好者,我希望能找到各种有趣的模型并能自定义生成,满足个性化的打印需求
-
教育工作者:作为一个生物老师,我希望能生成各种生物器官的3D模型,让学生通过互动式的3D模型更好地理解复杂的生物结构
核心功能:
- AI文字和图片生成3D模型
- 模型在线预览和下载
辅助功能:
- 模型分类和搜索
- 模型的画笔修复
- 社区互动(点赞、评论、收藏)
- AI生成提示词
- 打赏和付费下载
- 模型质量评分系统
- P0(必须):AI生成功能、模型预览下载
- P1(重要):画笔修复、基础社区功能、AI生成提示词,模型质量评分
- P2(可选):打赏和付费
重点开发P0级功能:
- ✅ 文字和图片转3D模型
- ✅ 完整的用户注册登录系统
- ✅ 3D模型在线预览
- ✅ 模型下载和本地存储
- ✅ 绑定骨骼和动画
- ✅ 模型质量评分
- ✅ AI生成提示词
- ✅ 基础的Web界面和响应式设计
"抛开使用场景都是耍流氓" —— API选择必须结合具体的项目需求和约束条件
| 厂商 | 模型质量 | 价格 | 学习成本 | 生成速度 | 免费额度 |
|---|---|---|---|---|---|
| OpenAI DALL-E 3D | 🌟🌟🌟🌟🌟 | 💰💰💰💰💰 | 🔥🔥🔥🔥 | ⚡⚡⚡ | 💎 |
| 混元3D (腾讯) | 🌟🌟🌟🌟 | 💰💰💰 | 🔥🔥🔥 | ⚡⚡⚡⚡ | 💎💎💎 |
| Stability AI | 🌟🌟🌟🌟 | 💰💰💰💰 | 🔥🔥🔥 | ⚡⚡⚡ | 💎💎 |
| Runway ML | 🌟🌟🌟 | 💰💰💰 | 🔥🔥🔥🔥 | ⚡⚡ | 💎💎 |
| Meshy AI | 🌟🌟🌟 | 💰💰 | 🔥 | ⚡⚡⚡⚡ | 💎💎💎💎💎 |
| Kaedim | 🌟🌟🌟🌟 | 💰💰💰 | 🔥🔥 | ⚡⚡ | 💎💎 |
1. 团队背景吸引
- 年轻团队:创始人和核心团队都很年轻,有创新活力
- 技术驱动:专注于3D生成技术,不是大厂的边缘产品
- 快速迭代:小团队决策快,产品更新频繁
2. 完美契合项目需求
- 七天比赛友好:接口简单易懂,无需学习复杂的SDK
- 快速上手:文档清晰,示例丰富,几小时就能集成
- 生成速度快:30-60秒完成生成,适合快速验证想法
3. 成本优势明显
- 学生优惠:第一个月提供大量免费API点数
- 价格合理:相比OpenAI等大厂价格亲民
- 按需付费:没有最低消费限制,适合小项目
4. 技术特点
- 接口简洁:RESTful API,不像大厂SDK那样复杂臃肿
- 格式丰富:支持GLB、FBX、OBJ、USDZ等主流格式
- 质量尚可:虽然不是顶级,但满足原型和中等质量需求
5. 使用场景匹配
我们的场景:快速原型 + 学生项目 + 七天比赛
Meshy AI:简单易用 + 便宜实惠 + 生成快速
= 完美匹配 ✨
选择理由总结: 在有限的时间和预算约束下,Meshy AI提供了最佳的开发效率/成本/质量平衡点。对于七天比赛这种场景,快速集成和低成本试错比追求极致质量更重要。
详情见:模型质量评估系统
详情见: 减少对第三方API的调用次数