MBE专家模型训练策略与商业模式
📋 核心原则
专家模型训练不是可选的,而是必须的。
MBE引擎中,上下文管理和回答问题的质量非常关键,因此:
- ✅ 训练专家模式是生产环境的标准配置
- ✅ 动态专家模式仅用于快速原型和测试
- ✅ 所有正式上线的知识库都应该经过模型训练
🎯 两种专家模式对比
| 特性 | 动态专家(原型/测试) | 训练专家(生产标准) |
|---|---|---|
| 模型大小 | 5.1MB | 161MB |
| 参数量 | 130万 | 4,200万 |
| 推理能力 | 基础(向量检索) | 强(完整模型推理) |
| 响应速度 | 快(3-4秒) | 中等(5-8秒) |
| 训练时间 | 无需训练 | 10-30分钟(GPU) |
| 上下文理解 | 基础 | 深度 |
| 答案质量 | 中等 | 高 |
| 适用场景 | 快速原型、测试 | 生产环境、正式应用 |
| 资源消耗 | 低 | 中等 |
💰 套餐与配额体系
用户套餐等级
MBE系统根据用户套餐等级分配不同的资源配额:
| 套餐 | 训练配额 | 模型数量 | GPU小时/月 | 适用场景 |
|---|---|---|---|---|
| FREE | 0个并发训练 | 0个模型 | 0小时 | 仅动态专家,测试用途 |
| BASIC | 1个并发训练 | 5个模型 | 10小时 | 小型项目,少量知识库 |
| PRO | 3个并发训练 | 20个模型 | 50小时 | 中型项目,多个知识库 |
| ENTERPRISE | 10个并发训练 | 100个模型 | 500小时 | 大型项目,企业级应用 |
配额详情
# 套餐配额配置(来自 quota_manager.py)
PLAN_QUOTAS = {
UserPlan.FREE: ResourceQuota(
max_concurrent_training=0, # 不允许训练
max_models=0, # 不允许训练模型
gpu_hours_monthly=0, # 无GPU资源
),
UserPlan.BASIC: ResourceQuota(
max_concurrent_training=1, # 1个并发训练
max_models=5, # 最多5个训练模型
gpu_hours_monthly=10, # 10小时GPU/月
),
UserPlan.PRO: ResourceQuota(
max_concurrent_training=3, # 3个并发训练
max_models=20, # 最多20个训练模型
gpu_hours_monthly=50, # 50小时GPU/月
),
UserPlan.ENTERPRISE: ResourceQuota(
max_concurrent_training=10, # 10个并发训练
max_models=100, # 最多100个训练模型
gpu_hours_monthly=500, # 500小时GPU/月
),
}
🤖 智能选择机制
MBE系统会根据以下因素自动选择使用动态专家还是训练专家:
1. 查询复杂度分析
系统自动分析用户查询的复杂度:
class QueryComplexity(Enum):
SIMPLE = "simple" # 简单问答 → 可使用动态专家
MODERATE = "moderate" # 一般问题 → 优先训练专家
COMPLEX = "complex" # 复杂分析 → 必须训练专家
REASONING = "reasoning" # 推理问题 → 必须训练专家
CODE = "code" # 代码问题 → 必须训练专家
选择规则:
- SIMPLE: 优先使用动态专家(如果用户套餐允许)
- MODERATE/COMPLEX/REASONING: 必须使用训练专家
- CODE: 必须使用训练专家
2. 用户套餐等级
# 根据用户套餐自动选择
if user_plan == UserPlan.FREE:
# FREE套餐:只能使用动态专家
expert_mode = "dynamic"
elif query_complexity in [QueryComplexity.COMPLEX, QueryComplexity.REASONING]:
# 复杂查询:必须使用训练专家
expert_mode = "trained"
if not has_trained_model(kb_id):
# 如果没有训练模型,提示用户升级套餐并训练
raise HTTPException(403, "复杂查询需要训练专家,请升级套餐并训练模型")
else:
# 其他情况:优先使用训练专家,降级到动态专家
expert_mode = "trained" if has_trained_model(kb_id) else "dynamic"
3. 知识库状态检查
def select_expert_mode(kb_id: str, query: str, user_plan: UserPlan) -> str:
"""智能选择专家模式"""
# 1. 检查是否有训练模型
has_trained = check_trained_model_exists(kb_id)
# 2. 分析查询复杂度
complexity = analyze_query_complexity(query)
# 3. 检查用户配额
quota = get_user_quota(user_plan)
# 4. 决策逻辑
if complexity in [QueryComplexity.COMPLEX, QueryComplexity.REASONING]:
# 复杂查询:必须训练专家
if not has_trained:
if quota.max_models == 0:
raise HTTPException(403, "需要训练专家,请升级套餐")
else:
# 自动触发训练(如果配额允许)
trigger_training(kb_id, user_plan)
return "trained"
elif has_trained and quota.max_models > 0:
# 有训练模型且配额允许:优先使用训练专家
return "trained"
else:
# 降级到动态专家
return "dynamic"
4. 资源消耗评估
系统会评估资源消耗情况,自动选择最合适的模式:
def evaluate_resource_usage(kb_id: str, query: str) -> Dict:
"""评估资源消耗"""
# 估算查询复杂度
complexity = analyze_query_complexity(query)
# 估算token消耗
estimated_tokens = estimate_tokens(query)
# 估算响应时间
if complexity in [QueryComplexity.COMPLEX, QueryComplexity.REASONING]:
# 复杂查询:训练专家响应时间更长但质量更高
estimated_time = 8.0 # 训练专家:8秒
quality_score = 0.9 # 高质量
else:
# 简单查询:动态专家响应快
estimated_time = 3.5 # 动态专家:3.5秒
quality_score = 0.7 # 中等质量
return {
"complexity": complexity,
"estimated_tokens": estimated_tokens,
"estimated_time": estimated_time,
"quality_score": quality_score,
"recommended_mode": "trained" if complexity in [QueryComplexity.COMPLEX, QueryComplexity.REASONING] else "dynamic"
}
💳 购买与付费机制
1. 套餐购买
用户需要购买相应的套餐才能使用训练专家:
| 套餐 | 月费 | 训练配额 | 模型数量 | GPU资源 |
|---|---|---|---|---|
| FREE | 免费 | 0 | 0 | 0 |
| BASIC | 99元/月 | 1个并发 | 5个模型 | 10小时/月 |
| PRO | 499元/月 | 3个并发 | 20个模型 | 50小时/月 |
| ENTERPRISE | 协议定价 | 10个并发 | 100个模型 | 500小时/月 |
2. 按需付费(Pay-as-you-go)
除了套餐外,还支持按需付费:
- 训练费用:
- GPU训练: 0.5元/小时
- CPU训练: 0.1元/小时
- 模型存储费用:
- 训练模型: 0.01元/GB/月
- 调用费用:
- 训练专家调用: 0.001元/次
- 动态专家调用: 免费(FREE套餐)或 0.0005元/次
3. 开发者应用调用
开发者在开发应用时,有两种付费方式:
方式1: 开发者付费(推荐)
开发者购买套餐,应用调用时使用开发者的配额:
# API调用示例
POST /api/v1/chat
{
"query": "用户问题",
"kb_id": "知识库ID",
"developer_id": "开发者ID", # 使用开发者的配额
"expert_mode": "auto" # 自动选择,或 "trained"/"dynamic"
}
优势:
- 开发者统一管理配额
- 应用调用透明
- 便于成本控制
方式2: 终端用户付费
终端用户购买套餐,应用调用时使用用户的配额:
# API调用示例
POST /api/v1/chat
{
"query": "用户问题",
"kb_id": "知识库ID",
"user_id": "终端用户ID", # 使用终端用户的配额
"expert_mode": "auto"
}
优势:
- 终端用户自主控制
- 开发者无需承担成本
- 适合B2C应用
🔄 自动选择流程
完整决策流程
用户查询
↓
分析查询复杂度
↓
检查知识库状态
├─ 有训练模型?
│ ├─ 是 → 检查用户套餐
│ │ ├─ FREE → 使用动态专家(降级)
│ │ ├─ BASIC+ → 使用训练专家
│ │
│ └─ 否 → 检查用户套餐
│ ├─ FREE → 使用动态专家
│ ├─ BASIC+ → 检查查询复杂度
│ ├─ 简单 → 使用动态专家
│ └─ 复杂 → 触发训练(如果配额允许)
│
└─ 无训练模型 → 检查用户套餐
├─ FREE → 使用动态专家
└─ BASIC+ → 根据复杂度选择
├─ 简单 → 使用动态专家
└─ 复杂 → 提示升级并训练
API自动选择
@router.post("/api/v1/chat")
async def chat(request: ChatRequest):
"""智能聊天API,自动选择专家模式"""
# 1. 获取用户信息
user_plan = await get_user_plan(request.user_id)
quota = await get_user_quota(request.user_id)
# 2. 分析查询复杂度
complexity = analyze_query_complexity(request.query)
# 3. 检查知识库状态
kb = get_knowledge_base(request.kb_id)
has_trained = check_trained_model_exists(request.kb_id)
# 4. 自动选择专家模式
expert_mode = select_expert_mode(
kb_id=request.kb_id,
query=request.query,
user_plan=user_plan,
complexity=complexity,
has_trained=has_trained
)
# 5. 如果选择训练专家但不存在,触发训练
if expert_mode == "trained" and not has_trained:
if quota.max_models > 0 and quota.max_concurrent_training > 0:
# 自动触发训练
training_job = await start_training(
kb_id=request.kb_id,
user_id=request.user_id,
model_type="expert"
)
# 返回训练中状态
return {
"status": "training",
"message": "正在训练专家模型,请稍候...",
"job_id": training_job.job_id,
"estimated_time": "10-30分钟"
}
else:
# 配额不足,提示升级
return {
"status": "quota_exceeded",
"message": "需要训练专家但配额不足,请升级套餐",
"required_plan": "BASIC",
"current_plan": user_plan.value
}
# 6. 调用相应的专家
if expert_mode == "trained":
result = await call_trained_expert(request.kb_id, request.query)
else:
result = await call_dynamic_expert(request.kb_id, request.query)
return result
📊 判别标准总结
何时使用动态专家?
✅ 适合场景:
- FREE套餐用户(仅测试)
- 简单查询(SIMPLE复杂度)
- 快速原型开发
- 资源受限环境
❌ 不适合场景:
- 生产环境
- 复杂查询(COMPLEX/REASONING)
- 需要高质量答案
- 正式应用
何时使用训练专家?
✅ 必须使用:
- 生产环境
- 复杂查询(COMPLEX/REASONING/CODE)
- 需要高质量答案
- 正式应用
✅ 推荐使用:
- MODERATE复杂度查询
- 需要深度理解上下文
- 需要推理能力
🎯 最佳实践
1. 知识库创建后立即训练
# 创建知识库并上传文档后
kb_id = create_knowledge_base(...)
upload_files(kb_id, files)
# 立即触发训练(如果配额允许)
if user_plan != UserPlan.FREE:
training_job = await start_training(
kb_id=kb_id,
user_id=user_id,
model_type="expert",
preset="standard" # 标准训练配置
)
2. 监控训练状态
# 定期检查训练状态
training_status = await get_training_status(job_id)
if training_status.status == "completed":
# 训练完成,切换到训练专家模式
expert_mode = "trained"
elif training_status.status == "failed":
# 训练失败,降级到动态专家
expert_mode = "dynamic"
3. 自动降级机制
# 如果训练专家调用失败,自动降级到动态专家
try:
result = await call_trained_expert(kb_id, query)
except Exception as e:
logger.warning(f"训练专家调用失败,降级到动态专家: {e}")
result = await call_dynamic_expert(kb_id, query)
📝 总结
- 训练专家是必须的: 生产环境必须使用训练专家,动态专家仅用于测试
- 套餐决定配额: 用户套餐等级决定训练配额和模型数量
- 智能自动选择: 系统根据查询复杂度、用户套餐、知识库状态自动选择
- 灵活付费方式: 支持开发者付费或终端用户付费
- 自动训练触发: 复杂查询自动触发训练(如果配额允许)
核心原则: 上下文管理和回答质量是关键,因此训练专家是生产环境的标准配置。
🏷️ 市场标注
在专家市场和应用市场中,必须明确标注专家使用的是动态专家模式还是训练专家模式。
详细规范: 请参考 MBE_MARKETPLACE_EXPERT_MODE_LABELING.md 了解完整的市场标注规范,包括:
- 标注位置(专家卡片、详情页、应用卡片)
- 数据模型更新(添加
expert_mode字段) - UI组件实现(模式标签、筛选器)
- 显示规则和用户提示