🧠AI LLM 基础

模型选型与对比

难度:⭐ | 高频指数:🔥🔥🔥 | 应用岗相关度:★★★

面试回答

常见问法

  • “你们项目为什么选这个模型?换一个行不行?”
  • “开源模型和闭源模型怎么选?”
  • “什么时候用大模型,什么时候用小模型?”
  • “多个模型怎么配合使用?“

回答

模型选型不是选”最好的模型”,而是选最适合当前场景的模型。核心考虑维度是:任务类型、成本预算、延迟要求、中文能力、上下文长度和数据安全。

# 模型选型决策框架
class ModelSelector:
    """
    模型选型决策框架
    
    不要背benchmark数字(会过时),要掌握选型思路和维度
    """
    
    def __init__(self):
        # 选型维度权重(根据业务调整)
        self.dimensions = {
            'task_fit': 0.25,       # 任务匹配度
            'cost': 0.20,           # 成本
            'latency': 0.15,        # 延迟
            'chinese_ability': 0.15, # 中文能力
            'context_length': 0.10,  # 上下文长度
            'safety': 0.15,         # 数据安全/合规
        }
    
    def evaluate_model(self, model_name, requirements):
        """
        评估模型是否适合需求
        
        requirements示例:
        {
            'task_type': 'rag_qa',          # 任务类型
            'budget_per_1k_tokens': 0.01,   # 预算
            'max_latency_ms': 3000,         # 最大延迟
            'language': 'zh',               # 主要语言
            'min_context_length': 32000,    # 最小上下文
            'data_sensitivity': 'high',     # 数据敏感度
        }
        """
        scores = {}
        
        # 任务匹配度
        scores['task_fit'] = self.evaluate_task_fit(
            model_name, requirements['task_type']
        )
        
        # 成本评估
        scores['cost'] = self.evaluate_cost(
            model_name, requirements['budget_per_1k_tokens']
        )
        
        # 延迟评估
        scores['latency'] = self.evaluate_latency(
            model_name, requirements['max_latency_ms']
        )
        
        # 中文能力
        scores['chinese_ability'] = self.evaluate_chinese(
            model_name, requirements['language']
        )
        
        # 上下文长度
        scores['context_length'] = self.evaluate_context(
            model_name, requirements['min_context_length']
        )
        
        # 数据安全
        scores['safety'] = self.evaluate_safety(
            model_name, requirements['data_sensitivity']
        )
        
        # 加权总分
        total = sum(
            scores[dim] * weight 
            for dim, weight in self.dimensions.items()
        )
        
        return {
            'model': model_name,
            'total_score': total,
            'dimension_scores': scores,
            'recommendation': self.get_recommendation(total)
        }
    
    def get_recommendation(self, score):
        """给出推荐建议"""
        if score > 0.8:
            return "强烈推荐"
        elif score > 0.6:
            return "可以使用"
        elif score > 0.4:
            return "勉强可用,建议寻找替代"
        else:
            return "不推荐"


# 主流模型特点对比(思路而非具体数字)
MODEL_CHARACTERISTICS = """
选型时关注的维度(不要背具体数字,会过时):

┌─────────────┬──────────────────────────────────────────────┐
│ 维度         │ 关注点                                        │
├─────────────┼──────────────────────────────────────────────┤
│ 通用能力     │ 推理、代码、创意写作、指令遵循                    │
│ 中文能力     │ 中文理解、中文生成、中文知识                      │
│ 成本         │ 输入/输出token单价、是否有免费额度                │
│ 延迟         │ 首token延迟、生成速度(tokens/s)                │
│ 上下文       │ 最大上下文长度、长文本处理能力                    │
│ 多模态       │ 是否支持图片/音频/视频输入                       │
│ 部署方式     │ API调用 vs 私有化部署                           │
│ 合规         │ 数据是否出境、是否有审计日志                      │
└─────────────┴──────────────────────────────────────────────┘
"""

追问

开源 vs 闭源怎么选?

# 开源vs闭源决策矩阵
OPEN_VS_CLOSED_DECISION = {
    "选闭源API的场景": [
        "快速验证MVP,不想运维模型",
        "任务通用性强,不需要定制",
        "团队没有GPU资源和模型运维能力",
        "对最新能力有要求(闭源通常更新更快)",
    ],
    "选开源自部署的场景": [
        "数据敏感,不能出公司网络",
        "需要微调适配特定业务",
        "调用量大,API成本不可控",
        "需要完全控制推理过程(如logprobs)",
        "合规要求数据不出境",
    ],
    "混合策略(常见)": [
        "开发测试用闭源API(快速迭代)",
        "生产环境用开源部署(成本可控)",
        "简单任务用小模型,复杂任务用大模型",
        "核心链路用闭源保效果,辅助链路用开源省成本",
    ]
}

class OpenVsClosedDecision:
    """开源vs闭源决策"""
    
    def recommend(self, requirements):
        """根据需求推荐"""
        score_open = 0
        score_closed = 0
        
        # 数据敏感度
        if requirements.get('data_sensitivity') == 'high':
            score_open += 3  # 强烈倾向开源
        
        # 调用量
        if requirements.get('daily_requests', 0) > 10000:
            score_open += 2  # 量大用开源省钱
        
        # 团队能力
        if not requirements.get('has_gpu_infra'):
            score_closed += 2  # 没有GPU基础设施用API
        
        # 定制需求
        if requirements.get('needs_finetuning'):
            score_open += 2  # 需要微调用开源
        
        # 时间压力
        if requirements.get('time_pressure') == 'high':
            score_closed += 2  # 赶时间用API
        
        if score_open > score_closed:
            return "推荐开源自部署"
        elif score_closed > score_open:
            return "推荐闭源API"
        else:
            return "推荐混合策略"

什么时候用大模型,什么时候用小模型?

# 大小模型选择策略
class ModelSizeStrategy:
    """
    大模型 vs 小模型选择
    
    核心原则:能用小模型解决的不用大模型
    大模型贵但强,小模型便宜但能力有限
    """
    
    # 适合大模型的任务
    LARGE_MODEL_TASKS = [
        "复杂推理(多步逻辑)",
        "创意写作(高质量文案)",
        "代码生成(复杂逻辑)",
        "多轮对话(需要深度理解上下文)",
        "开放域问答(知识面要求广)",
    ]
    
    # 适合小模型的任务
    SMALL_MODEL_TASKS = [
        "文本分类(情感分析、意图识别)",
        "信息提取(NER、关键词提取)",
        "简单格式转换(JSON提取)",
        "文本改写(简单润色)",
        "相似度计算(embedding)",
    ]
    
    def select_model_size(self, task_description, constraints):
        """选择模型大小"""
        # 先尝试小模型
        small_model_score = self.evaluate_small_model_fit(task_description)
        
        if small_model_score > 0.7 and constraints.get('cost_sensitive'):
            return {
                'recommendation': 'small',
                'reason': '任务简单,小模型足够,且成本敏感',
                'suggested_models': ['Qwen-7B', 'GLM-6B', 'DeepSeek-7B']
            }
        
        if small_model_score < 0.4 or constraints.get('quality_first'):
            return {
                'recommendation': 'large',
                'reason': '任务复杂,需要大模型能力',
                'suggested_models': ['GPT-4o', 'Claude-3.5', 'DeepSeek-V3']
            }
        
        return {
            'recommendation': 'test_both',
            'reason': '不确定,建议两者都测试对比',
            'test_plan': '用20个样本分别测试,对比效果和成本'
        }

多模型混用策略

class MultiModelRouter:
    """
    多模型路由策略
    
    1. 路由(Router):根据任务类型选模型
    2. 降级(Fallback):主模型失败时切备用
    3. 级联(Cascade):小模型先做,不确定时升级到大模型
    """
    
    def __init__(self, models_config):
        self.models = models_config
        self.router = TaskRouter()
        self.cascade_threshold = 0.7
    
    # 策略1:路由
    def route_by_task(self, query, task_type):
        """根据任务类型路由到不同模型"""
        routing_rules = {
            'simple_qa': 'small_model',      # 简单问答用小模型
            'complex_reasoning': 'large_model', # 复杂推理用大模型
            'code_generation': 'code_model',   # 代码生成用代码模型
            'translation': 'multilingual_model', # 翻译用多语言模型
        }
        
        model_key = routing_rules.get(task_type, 'default_model')
        model = self.models[model_key]
        
        return model.generate(query)
    
    # 策略2:降级
    def fallback_strategy(self, query):
        """主模型失败时降级"""
        # 按优先级尝试
        model_priority = ['primary', 'secondary', 'fallback']
        
        for model_key in model_priority:
            try:
                model = self.models[model_key]
                response = model.generate(query, timeout=5)
                
                if response and response.get('status') == 'success':
                    return response
                    
            except Exception as e:
                print(f"模型 {model_key} 失败: {e}")
                continue
        
        # 所有模型都失败
        return {
            'status': 'all_failed',
            'message': '服务暂时不可用,请稍后重试'
        }
    
    # 策略3:级联
    def cascade_strategy(self, query):
        """
        级联策略:小模型先做,不确定时升级
        
        优点:大部分请求用小模型(省钱),
              只有难题才用大模型(保质量)
        """
        # 第一步:小模型尝试
        small_response = self.models['small'].generate(
            query, return_confidence=True
        )
        
        # 如果小模型有信心,直接返回
        if small_response['confidence'] > self.cascade_threshold:
            return {
                'answer': small_response['answer'],
                'model_used': 'small',
                'confidence': small_response['confidence']
            }
        
        # 小模型不确定,升级到大模型
        large_response = self.models['large'].generate(query)
        
        return {
            'answer': large_response['answer'],
            'model_used': 'large',
            'reason': f'小模型置信度 {small_response["confidence"]:.2f} 低于阈值'
        }
    
    def get_cost_comparison(self, request_log):
        """对比不同策略的成本"""
        # 纯大模型成本
        all_large_cost = sum(
            r['tokens'] * self.models['large'].price_per_token
            for r in request_log
        )
        
        # 级联策略成本
        cascade_cost = sum(
            r['tokens'] * self.models['small'].price_per_token
            if r.get('small_model_sufficient') else
            r['tokens'] * (
                self.models['small'].price_per_token + 
                self.models['large'].price_per_token
            )
            for r in request_log
        )
        
        return {
            'all_large_cost': all_large_cost,
            'cascade_cost': cascade_cost,
            'savings': (all_large_cost - cascade_cost) / all_large_cost
        }

原理展开

选型实战思路

# 面试时怎么回答"为什么选这个模型"
INTERVIEW_ANSWER_TEMPLATE = """
面试回答模板:

1. 先说业务需求:
   "我们的场景是企业内部知识问答,主要是中文,
    日均请求量约5000次,数据不能出公司网络"

2. 再说选型维度:
   "基于这个需求,我们主要考虑:
    - 中文能力(核心)
    - 数据安全(必须私有化部署)
    - 成本(日均5000次要可控)
    - 上下文长度(文档较长,需要32K+)"

3. 说对比过程:
   "我们对比了几个方案:
    - GPT-4o:效果最好,但数据出境不合规
    - DeepSeek:中文好,可私有化,成本合理
    - Qwen:中文好,阿里云生态,部署方便
    最终选了 DeepSeek,因为..."

4. 说验证方法:
   "我们用100个业务样本做了对比测试,
    在准确率、延迟、成本三个维度打分"

5. 回答追问"换一个行不行":
   "可以换,但需要重新评估。如果换GPT-4o,
    效果可能更好但合规有问题;如果换小模型,
    成本降低但复杂问题准确率会下降"
"""

# 选型评估报告模板
class ModelEvaluationReport:
    """模型选型评估报告"""
    
    def generate_report(self, candidates, test_results):
        """生成选型报告"""
        report = {
            'summary': {},
            'detailed_comparison': {},
            'recommendation': '',
            'risks': []
        }
        
        for model in candidates:
            results = test_results[model]
            report['detailed_comparison'][model] = {
                'accuracy': results['accuracy'],
                'avg_latency_ms': results['latency'],
                'cost_per_1k_requests': results['cost'],
                'chinese_score': results['chinese'],
                'deployment': results['deployment_type'],
                'pros': results['pros'],
                'cons': results['cons']
            }
        
        # 综合推荐
        best_model = max(
            candidates, 
            key=lambda m: test_results[m]['weighted_score']
        )
        
        report['recommendation'] = (
            f"推荐使用 {best_model},"
            f"综合评分最高({test_results[best_model]['weighted_score']:.2f})"
        )
        
        return report

常见选型误区

COMMON_MISTAKES = {
    "只看排行榜": {
        "问题": "Benchmark排名不等于业务效果",
        "正确做法": "用自己的业务数据测试"
    },
    "只看价格": {
        "问题": "便宜的模型可能需要更多调用才能达到效果",
        "正确做法": "算总体拥有成本(TCO),包括调用次数、重试、人工修正"
    },
    "忽略延迟": {
        "问题": "用户体验对延迟很敏感",
        "正确做法": "测试真实场景下的端到端延迟,包括网络"
    },
    "不考虑演进": {
        "问题": "模型会更新,API可能变化",
        "正确做法": "架构上做好模型抽象层,方便切换"
    },
    "一个模型打天下": {
        "问题": "不同任务适合不同模型",
        "正确做法": "根据任务类型路由到合适的模型"
    }
}

易错点

  • 面试时背具体的 benchmark 数字(很快过时,显得不专业)
  • 只说”我们用了 GPT-4”但说不清为什么选它
  • 不考虑成本和延迟,只追求效果最好
  • 忽略数据安全和合规要求
  • 没有做过实际对比测试就下结论

记忆技巧

记住模型选型的”六维度 + 三策略”:

六个选型维度:

  1. 任务匹配度(能力够不够)
  2. 成本(预算内不内)
  3. 延迟(用户等得起不起)
  4. 中文能力(业务需不需要)
  5. 上下文长度(够不够用)
  6. 数据安全(合不合规)

三种多模型策略:

  1. 路由(Router):按任务类型分流
  2. 降级(Fallback):主模型挂了用备用
  3. 级联(Cascade):小模型先做,不行再升级

面试速答版

  • 模型选型不是选”最好的”,是选”最适合场景的”,六维度:任务、成本、延迟、中文、上下文、安全
  • 开源 vs 闭源:数据敏感/量大/需微调选开源,快速验证/团队小/追求最新能力选闭源
  • 大模型 vs 小模型:能用小的解决就不用大的,分类/提取/格式转换用小模型,复杂推理用大模型
  • 多模型策略三种:路由(按任务分流)、降级(主挂用备)、级联(小模型先做不行再升级)
  • 面试回答结构:业务需求 → 选型维度 → 对比过程 → 验证方法 → 能回答”换一个行不行”
  • 常见坑:背 benchmark 数字、不做实际测试、忽略成本延迟、一个模型打天下
  • 一句话最佳实践:用业务数据实测对比,架构上做好模型抽象层方便切换
Related · LLM 基础