Files
mixvideo-v2/apps/desktop/src-tauri/src/data/models/outfit_recommendation.rs
imeepos 785502aa20 improve: 优化AI分组策略提示词
- 明确要求AI先确定分组策略,再为每组生成3个方案
- 添加分组示例,指导AI更好地理解分组逻辑
- 强调分组均匀分布和风格差异化
- 提供具体的分组命名建议

现在的逻辑:
1. AI分析用户查询确定分组维度
2. 创建3-4个不同分组类别
3. 每个分组生成恰好3个相关方案
4. 总共12个方案,分布均匀
2025-07-28 11:44:25 +08:00

242 lines
6.7 KiB
Rust

use serde::{Deserialize, Serialize};
use chrono::{DateTime, Utc};
/// 分组策略
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct GroupingStrategy {
/// 主要分组维度
pub primary_dimension: String,
/// 分组原因说明
pub reasoning: String,
}
/// 方案质量评分
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct OutfitQualityScore {
/// AI对该方案的信心度 (0-1)
pub ai_confidence_score: f32,
/// TikTok趋势匹配度 (0-1)
pub trend_score: f32,
/// 搭配versatility评分 (0-1)
pub versatility_score: f32,
/// 搭配难度等级
pub difficulty_level: String,
/// 整体推荐度 (0-1)
pub overall_recommendation_score: f32,
}
/// 穿搭方案分组
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct OutfitRecommendationGroup {
/// 分组名称
pub group: String,
/// 分组描述
pub description: String,
/// 分组唯一标识符
pub group_id: String,
/// 该分组的风格关键词
pub style_keywords: Vec<String>,
/// 是否可以加载更多方案
pub can_load_more: bool,
/// 分组下的方案列表
pub children: Vec<OutfitRecommendation>,
}
/// 色彩信息
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ColorInfo {
/// 色彩名称
pub name: String,
/// 十六进制色值
pub hex: String,
/// HSV值 (0-1范围)
pub hsv: (f32, f32, f32),
}
/// 穿搭单品
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct OutfitItem {
/// 单品类别 (如: "上装", "下装", "鞋子", "配饰")
pub category: String,
/// 单品描述
pub description: String,
/// 主要颜色
pub primary_color: ColorInfo,
/// 次要颜色 (可选)
pub secondary_color: Option<ColorInfo>,
/// 材质
pub material: String,
/// 风格标签
pub style_tags: Vec<String>,
}
/// 场景建议
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SceneRecommendation {
/// 场景名称
pub name: String,
/// 场景描述
pub description: String,
/// 场景类型 ("室内", "室外", "特殊")
pub scene_type: String,
/// 适合的时间段
pub time_of_day: Vec<String>,
/// 光线条件
pub lighting: String,
/// 拍摄建议
pub photography_tips: Vec<String>,
}
/// 穿搭方案
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct OutfitRecommendation {
/// 方案ID
pub id: String,
/// 方案标题
pub title: String,
/// 方案描述
pub description: String,
/// 整体风格
pub overall_style: String,
/// 风格标签
pub style_tags: Vec<String>,
/// 适合场合
pub occasions: Vec<String>,
/// 适合季节
pub seasons: Vec<String>,
/// 穿搭单品列表
pub items: Vec<OutfitItem>,
/// 色彩搭配主题
pub color_theme: String,
/// 主要色彩
pub primary_colors: Vec<ColorInfo>,
/// 场景建议
pub scene_recommendations: Vec<SceneRecommendation>,
/// TikTok优化建议
pub tiktok_tips: Vec<String>,
/// 搭配要点
pub styling_tips: Vec<String>,
/// 创建时间
pub created_at: DateTime<Utc>,
/// 方案质量评分
pub quality_score: OutfitQualityScore,
}
/// 穿搭方案生成请求
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct OutfitRecommendationRequest {
/// 用户输入的关键词或描述
pub query: String,
/// 目标风格 (可选)
pub target_style: Option<String>,
/// 适合场合 (可选)
pub occasions: Option<Vec<String>>,
/// 季节偏好 (可选)
pub season: Option<String>,
/// 色彩偏好 (可选)
pub color_preferences: Option<Vec<String>>,
/// 生成数量
pub count: u32,
}
/// 穿搭方案生成响应
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct OutfitRecommendationResponse {
/// 分组策略
pub grouping_strategy: GroupingStrategy,
/// 生成的穿搭方案分组列表
pub groups: Vec<OutfitRecommendationGroup>,
/// 生成时间 (毫秒)
pub generation_time_ms: u64,
/// 生成时间戳
pub generated_at: DateTime<Utc>,
/// 使用的提示词 (调试用)
pub prompt_used: Option<String>,
// 保持向后兼容性
/// 生成的穿搭方案列表 (向后兼容)
#[serde(skip_serializing_if = "Vec::is_empty")]
pub recommendations: Vec<OutfitRecommendation>,
}
/// 场景检索请求 (用于方案详情到场景检索的集成)
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SceneSearchRequest {
/// 穿搭方案ID
pub outfit_id: String,
/// 场景描述
pub scene_description: String,
/// 风格标签
pub style_tags: Vec<String>,
/// 色彩信息
pub colors: Vec<ColorInfo>,
/// 搜索参数
pub search_params: SceneSearchParams,
}
/// 场景检索参数
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SceneSearchParams {
/// 场景类型过滤
pub scene_types: Option<Vec<String>>,
/// 时间段过滤
pub time_filters: Option<Vec<String>>,
/// 光线条件过滤
pub lighting_filters: Option<Vec<String>>,
/// 结果数量限制
pub limit: Option<u32>,
}
impl Default for OutfitRecommendationRequest {
fn default() -> Self {
Self {
query: String::new(),
target_style: None,
occasions: None,
season: None,
color_preferences: None,
count: 12, // 默认生成12个方案
}
}
}
impl OutfitRecommendation {
/// 生成用于场景检索的描述
pub fn generate_scene_search_description(&self) -> String {
let mut description = format!("{} - {}", self.title, self.description);
if !self.style_tags.is_empty() {
description.push_str(&format!(" 风格: {}", self.style_tags.join(", ")));
}
if !self.primary_colors.is_empty() {
let color_names: Vec<String> = self.primary_colors.iter()
.map(|c| c.name.clone())
.collect();
description.push_str(&format!(" 主要色彩: {}", color_names.join(", ")));
}
description
}
/// 获取所有风格标签 (包括整体风格和单品风格)
pub fn get_all_style_tags(&self) -> Vec<String> {
let mut all_tags = self.style_tags.clone();
// 添加整体风格
if !self.overall_style.is_empty() {
all_tags.push(self.overall_style.clone());
}
// 添加单品风格标签
for item in &self.items {
all_tags.extend(item.style_tags.clone());
}
// 去重并排序
all_tags.sort();
all_tags.dedup();
all_tags
}
}