MBE市场专家模式标注规范
📋 概述
在专家市场和应用市场中,必须明确标注专家使用的是动态专家模式还是训练专家模式,以便用户了解专家的能力和适用场景。
🏷️ 标注位置
1. 专家市场(Expert Marketplace)
1.1 专家卡片列表
在每个专家卡片上显示专家模式标签:
┌─────────────────────────────────┐
│ [专家头像] 专家名称 │
│ [分类标签] │
│ │
│ 描述文本... │
│ │
│ [标签1] [标签2] [标签3] │
│ │
│ ⭐ 4.9 💬 1.2K次 │
│ │
│ [模式标签] [价格] │
│ 🎯 训练专家 ¥0.001/次 │
└─────────────────────────────────┘
模式标签样式:
- 训练专家:
🎯 训练专家(绿色/蓝色背景,表示生产标准) - 动态专家:
⚡ 动态专家(灰色/黄色背景,表示原型/测试)
1.2 专家详情页
在专家详情页顶部显示模式信息:
┌─────────────────────────────────┐
│ 专家名称 │
│ [模式标签] [分类] [评分] │
│ │
│ 🎯 训练专家模式 │
│ ──────────────────────────── │
│ • 模型大小: 161MB │
│ • 推理能力: 强(完整模型) │
│ • 响应速度: 中等(5-8秒) │
│ • 适用场景: 生产环境、正式应用 │
│ • 套餐要求: BASIC+ │
│ │
│ 或 │
│ │
│ ⚡ 动态专家模式 │
│ ──────────────────────────── │
│ • 模型大小: 5.1MB │
│ • 推理能力: 基础(向量检索) │
│ • 响应速度: 快(3-4秒) │
│ • 适用场景: 快速原型、测试 │
│ • 套餐要求: FREE可用 │
└─────────────────────────────────┘
1.3 筛选功能
添加专家模式筛选器:
┌─────────────────────────────────┐
│ 筛选条件: │
│ [全部] [训练专家] [动态专家] │
│ │
│ 分类: [全部 ▼] │
│ 排序: [热门 ▼] │
└─────────────────────────────────┘
2. 应用市场(App Marketplace)
2.1 应用卡片
在应用卡片上显示使用的专家模式:
┌─────────────────────────────────┐
│ 📱 应用名称 │
│ 作者: @developer │
│ │
│ 描述文本... │
│ │
│ 使用专家: │
│ • 经济学专家 [🎯 训练] │
│ • 逻辑学专家 [🎯 训练] │
│ • 诊断学专家 [⚡ 动态] │
│ │
│ [查看详情] [下载] │
└─────────────────────────────────┘
2.2 应用详情页
在应用详情页显示专家模式统计:
┌─────────────────────────────────┐
│ 应用详情 │
│ │
│ 使用的专家 (6个): │
│ ──────────────────────────── │
│ 🎯 训练专家 (4个): │
│ • 经济学专家 │
│ • 逻辑学专家 │
│ • 诊断学专家 │
│ • 营养治疗师 │
│ │
│ ⚡ 动态专家 (2个): │
│ • 茶道专家 │
│ • 建筑专家 │
│ │
│ ⚠️ 注意: 此应用包含动态专家, │
│ 建议升级为训练专家以获得 │
│ 更好的性能和质量。 │
└─────────────────────────────────┘
💾 数据模型更新
1. 专家数据模型
需要在专家数据模型中添加 expert_mode 字段:
from enum import Enum
class ExpertMode(str, Enum):
"""专家模式"""
DYNAMIC = "dynamic" # 动态专家(原型/测试)
TRAINED = "trained" # 训练专家(生产标准)
@dataclass
class Expert:
"""专家定义"""
id: str
name: str
description: str
# ... 其他字段 ...
# 新增字段
expert_mode: ExpertMode = ExpertMode.DYNAMIC # 专家模式
model_size_mb: Optional[float] = None # 模型大小(MB)
has_trained_model: bool = False # 是否有训练模型
def to_dict(self) -> Dict[str, Any]:
return {
# ... 其他字段 ...
"expert_mode": self.expert_mode.value,
"model_size_mb": self.model_size_mb,
"has_trained_model": self.has_trained_model,
}
2. 市场模型接口
更新 MarketModel 接口:
export interface MarketModel {
model_id: string
developer_id: string
kb_id: string
name: string
description: string
category: ModelCategory
tags: string[]
// 新增字段
expert_mode: 'dynamic' | 'trained' // 专家模式
model_size_mb?: number // 模型大小(MB)
has_trained_model: boolean // 是否有训练模型
// ... 其他字段 ...
}
3. 数据库Schema
如果使用数据库存储,需要添加字段:
ALTER TABLE experts ADD COLUMN expert_mode VARCHAR(20) DEFAULT 'dynamic';
ALTER TABLE experts ADD COLUMN model_size_mb FLOAT;
ALTER TABLE experts ADD COLUMN has_trained_model BOOLEAN DEFAULT FALSE;
-- 索引
CREATE INDEX idx_experts_mode ON experts(expert_mode);
🎨 UI组件实现
1. 专家模式标签组件
// ExpertModeBadge.tsx
interface ExpertModeBadgeProps {
mode: 'dynamic' | 'trained'
size?: 'sm' | 'md' | 'lg'
}
export function ExpertModeBadge({ mode, size = 'md' }: ExpertModeBadgeProps) {
const config = {
dynamic: {
icon: '⚡',
label: '动态专家',
bgColor: 'bg-yellow-500/20',
textColor: 'text-yellow-300',
borderColor: 'border-yellow-500/30',
description: '原型/测试'
},
trained: {
icon: '🎯',
label: '训练专家',
bgColor: 'bg-blue-500/20',
textColor: 'text-blue-300',
borderColor: 'border-blue-500/30',
description: '生产标准'
}
}
const style = config[mode]
const sizeClass = {
sm: 'text-xs px-2 py-0.5',
md: 'text-sm px-3 py-1',
lg: 'text-base px-4 py-1.5'
}[size]
return (
<span className={`
inline-flex items-center gap-1.5 rounded-full
${style.bgColor} ${style.textColor} ${style.borderColor}
border ${sizeClass}
`}>
<span>{style.icon}</span>
<span className="font-medium">{style.label}</span>
<span className="opacity-70 text-xs">({style.description})</span>
</span>
)
}
2. 专家卡片更新
// ExpertCard.tsx
export function ExpertCard({ expert }: { expert: Expert }) {
return (
<div className="expert-card">
<div className="expert-header">
<h3>{expert.name}</h3>
<div className="flex items-center gap-2">
<ExpertModeBadge mode={expert.expert_mode} size="sm" />
<CategoryBadge category={expert.category} />
</div>
</div>
<p className="expert-description">{expert.description}</p>
{/* 模式说明 */}
{expert.expert_mode === 'dynamic' && (
<div className="expert-mode-info">
<p className="text-xs text-yellow-400">
⚠️ 此专家为动态模式,建议升级为训练模式以获得更好性能
</p>
</div>
)}
<div className="expert-footer">
<Rating rating={expert.rating} />
<Price price={expert.price} />
</div>
</div>
)
}
3. 筛选器组件
// ExpertModeFilter.tsx
export function ExpertModeFilter({
value,
onChange
}: {
value: 'all' | 'dynamic' | 'trained'
onChange: (mode: 'all' | 'dynamic' | 'trained') => void
}) {
return (
<div className="flex gap-2">
<button
onClick={() => onChange('all')}
className={value === 'all' ? 'active' : ''}
>
全部
</button>
<button
onClick={() => onChange('trained')}
className={value === 'trained' ? 'active' : ''}
>
🎯 训练专家
</button>
<button
onClick={() => onChange('dynamic')}
className={value === 'dynamic' ? 'active' : ''}
>
⚡ 动态专家
</button>
</div>
)
}
📊 显示规则
1. 自动检测专家模式
系统需要自动检测专家的模式:
def detect_expert_mode(expert_id: str, kb_id: str) -> ExpertMode:
"""自动检测专家模式"""
# 1. 检查是否有训练模型
trained_model_path = f"training/checkpoints/expert_{kb_id}_best.pt"
if Path(trained_model_path).exists():
return ExpertMode.TRAINED
# 2. 检查知识库状态
kb = get_knowledge_base(kb_id)
if kb and kb.status == "ready":
# 检查是否有训练任务记录
training_tasks = get_training_tasks(kb_id)
if any(task.status == "completed" for task in training_tasks):
return ExpertMode.TRAINED
# 3. 默认返回动态专家
return ExpertMode.DYNAMIC
2. 显示优先级
- 训练专家优先显示: 在列表中,训练专家应该排在动态专家前面
- 明确标注: 所有专家都必须明确标注模式,不能模糊
- 升级提示: 动态专家应该显示升级提示
3. 搜索和筛选
- 支持按模式筛选: 用户可以筛选只看训练专家或动态专家
- 搜索建议: 搜索时可以根据模式提供建议
- 排序选项: 可以按模式排序(训练专家优先)
⚠️ 重要提示
1. 用户购买前提示
当用户选择动态专家时,应该显示提示:
⚠️ 此专家为动态模式(原型/测试)
特点:
• 响应速度快(3-4秒)
• 推理能力基础
• 适合快速原型和测试
建议:
• 生产环境请使用训练专家
• 升级为训练专家可获得更强推理能力
[继续购买] [查看训练专家]
2. 应用使用提示
当应用包含动态专家时,应该显示提示:
⚠️ 此应用包含动态专家
影响:
• 部分功能可能使用动态专家模式
• 建议升级为训练专家以获得更好性能
包含的动态专家:
• 茶道专家
• 建筑专家
[查看详情] [升级为训练专家]
📝 实施检查清单
数据层
- 添加
expert_mode字段到专家数据模型 - 添加
model_size_mb字段 - 添加
has_trained_model字段 - 更新数据库Schema(如适用)
- 实现自动检测专家模式的函数
API层
- 更新专家列表API,包含
expert_mode字段 - 更新专家详情API,包含模式信息
- 添加按模式筛选的查询参数
- 更新应用市场API,包含使用的专家模式
UI层
- 创建
ExpertModeBadge组件 - 更新专家卡片,显示模式标签
- 更新专家详情页,显示模式信息
- 添加模式筛选器
- 添加升级提示组件
- 更新应用卡片,显示使用的专家模式
- 更新应用详情页,显示模式统计
文档
- 更新API文档,说明
expert_mode字段 - 更新用户指南,说明两种模式的区别
- 更新开发者文档,说明如何标注模式
✅ 总结
在专家市场和应用市场中标注专家模式是必须的,因为:
- 透明度: 用户需要知道他们购买的是什么类型的专家
- 决策支持: 帮助用户选择最适合的专家
- 质量保证: 明确区分生产标准和测试原型
- 升级引导: 引导用户从动态专家升级到训练专家
核心原则: 所有专家都必须明确标注模式,不能模糊或隐藏。