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)

📝 总结

  1. 训练专家是必须的: 生产环境必须使用训练专家,动态专家仅用于测试
  2. 套餐决定配额: 用户套餐等级决定训练配额和模型数量
  3. 智能自动选择: 系统根据查询复杂度、用户套餐、知识库状态自动选择
  4. 灵活付费方式: 支持开发者付费或终端用户付费
  5. 自动训练触发: 复杂查询自动触发训练(如果配额允许)

核心原则: 上下文管理和回答质量是关键,因此训练专家是生产环境的标准配置。


🏷️ 市场标注

在专家市场和应用市场中,必须明确标注专家使用的是动态专家模式还是训练专家模式。

详细规范: 请参考 MBE_MARKETPLACE_EXPERT_MODE_LABELING.md 了解完整的市场标注规范,包括:

  • 标注位置(专家卡片、详情页、应用卡片)
  • 数据模型更新(添加 expert_mode 字段)
  • UI组件实现(模式标签、筛选器)
  • 显示规则和用户提示