Skip to content

2.15 模型选择

一句话总结:90% 的场景不需要训练模型——先用 API 验证,再决定是否微调。

📊 学习进度

  • 状态:⬜ 未开始
  • 上次实时更新:2026-07-03
  • 预计时长:3-4 小时
  • 已完成:0/3 个模块
  • 在整体流程中的位置:AI 应用开发·第 3 阶段

📍 本章定位

  • 服务方案:方案 1(核心 80%)/ 方案 2(重要 60%)
  • 学习方式:⭐ 必学
  • 在流程中的作用:选择最合适的模型方案,平衡成本、效果和速度
  • 核心知识点:API 调用、微调(Fine-tuning)、模型评估
  • 预计时长:3-4 小时
  • 完成后能做什么:能为具体场景选择最优模型方案

人机分工

环节谁做重要度说明
路线选择🧑 人⭐⭐⭐⭐⭐API/微调/训练的决策
模型评估🤖 AI 执行 / 🧑 审核⭐⭐⭐⭐AI 跑基准,人判断是否满足业务
Prompt 设计🧑 人 + 🤖 AI⭐⭐⭐⭐⭐需要业务理解
微调执行🤖 AI⭐⭐⭐工具自动化

三条路线选择

路线适用场景成本技术门槛
A: 调用 API大多数文本类应用、快速原型
B: 微调有特定领域数据、需要特定风格
C: 从头训练几乎只有大公司在做极高极高

路线 A:调用 API(推荐起步)

人机分工:🧑 人设计 Prompt / 🤖 AI 生成响应

主要 API 提供商全景对比(2025-2026)

提供商模型上下文窗口多模态特点价格(输入/输出 per 1M tokens)
AnthropicClaude Opus 4.8200K文本+图像最强推理、复杂任务,SWE-bench 88.6%$5.00 / $25.00
AnthropicClaude Sonnet 4.6200K文本+图像长上下文、安全、编码能力强$3.00 / $15.00
AnthropicClaude Haiku 4.5200K文本+图像快速、低成本$1.00 / $5.00
OpenAIGPT-5.4128K文本+图像+音频多模态、推理强$2.50 / $15.00
OpenAIGPT-5.3-Codex128K文本+图像专为编码优化$1.75 / $14.00
OpenAIGPT-5.4-mini128K文本+图像快速、低成本$0.75 / $4.50
GoogleGemini 3.1 Pro1M+文本+图像+视频+音频超长上下文、SWE-bench 80.6%$2.00 / $12.00
GoogleGemini 3.5 Flash1M文本+图像+视频快速、性价比之王$1.50 / $9.00
DeepSeekV4 Pro128K文本开源、极低成本、SWE-bench 80.6%$0.435 / $0.87
DeepSeekV4 Flash128K文本极致低价,缓存命中 $0.0028$0.14 / $0.28

数据来源:各提供商官网,2026 年 7 月价格。DeepSeek V4 Flash 定价比 Claude Opus 低 99.5%+,彻底改变了 Token 经济格局。

开源模型对比(自部署场景)

模型参数量上下文显存需求适用场景许可证
Llama 3.1 70B70B128K40GB (FP16)通用对话、推理Llama License
Qwen 2.5 72B72B128K40GB (FP16)中文场景、编程Apache 2.0
DeepSeek V3671B (MoE)128K160GB (FP16)推理、编程DeepSeek License
Mistral Large123B128K70GB (FP16)多语言、推理Mistral License
Llama 3.1 8B8B128K6GB (INT4)轻量级、边缘部署Llama License

数据来源:HuggingFace Open LLM Leaderboard,2025。据 LMSYS Chatbot Arena 排名,Llama 3.1 70B 在人类偏好评估中接近 GPT-4o 水平。

模型选择决策流程图

模型路由策略(Model Routing)

模型路由是 OPC 创业者控制成本的核心策略——简单问题用小模型,复杂问题用大模型。

python
"""
模型路由器 - 根据问题复杂度自动选择最优模型
成本节省:30-50%(据 LangChain 2025 基准测试)
"""
import anthropic
from enum import Enum
from dataclasses import dataclass

class ModelTier(Enum):
    FAST = "claude-haiku-4-20250514"      # 成本最低
    BALANCED = "claude-sonnet-4-20250514"  # 性价比最优
    POWERFUL = "claude-opus-4-20250514"    # 最强推理

@dataclass
class RoutingRule:
    max_tokens: int
    keywords: list[str]
    tier: ModelTier

# 路由规则配置
ROUTING_RULES = [
    # 简单问题 → 小模型
    RoutingRule(max_tokens=100, keywords=["你好", "谢谢", "天气"], tier=ModelTier.FAST),
    # 中等复杂度 → 中等模型
    RoutingRule(max_tokens=500, keywords=["分析", "总结", "翻译"], tier=ModelTier.BALANCED),
    # 复杂问题 → 大模型
    RoutingRule(max_tokens=2000, keywords=["推理", "对比", "策略", "代码"], tier=ModelTier.POWERFUL),
]

def route_model(question: str) -> ModelTier:
    """根据问题特征选择最优模型"""
    question_lower = question.lower()
    
    # 按复杂度从高到低匹配
    for rule in reversed(ROUTING_RULES):
        if any(kw in question_lower for kw in rule.keywords):
            return rule.tier
        if len(question) > rule.max_tokens:
            return rule.tier
    
    # 默认使用中等模型
    return ModelTier.BALANCED

def chat_with_routing(question: str) -> str:
    """带模型路由的对话"""
    client = anthropic.Anthropic()
    model = route_model(question)
    
    print(f"选择模型: {model.value}")
    
    response = client.messages.create(
        model=model.value,
        max_tokens=1024,
        messages=[{"role": "user", "content": question}],
    )
    return response.content[0].text

# 测试
if __name__ == "__main__":
    questions = [
        "你好",                          # → Haiku (快速)
        "帮我总结这篇文章的要点",          # → Sonnet (平衡)
        "请对比分析 RAG 和 Fine-tuning 的优缺点,并给出选型建议",  # → Opus (强力)
    ]
    for q in questions:
        model = route_model(q)
        print(f"问题: {q[:20]}... → 模型: {model.value}")

成本对比(月调用 10 万次,混合场景):

策略月成本质量影响
全部用 Opus¥15,000最高质量
全部用 Sonnet¥3,000高质量
模型路由(60% Haiku + 30% Sonnet + 10% Opus)¥1,200接近全部 Sonnet
节省幅度60%质量损失 <5%

数据来源:LangChain 2025 模型路由基准测试,混合路由在保持 95% 质量的同时降低 60% 成本。

Batch API:非实时场景的成本利器

对于不需要实时响应的场景(如批量数据分析、内容生成),使用 Batch API 可以节省 50% 成本。

python
"""
Batch API 使用示例 - 批量处理节省 50% 成本
适用场景:数据分析、内容批量生成、报告生成
"""
import anthropic
import json

client = anthropic.Anthropic()

# 1. 准备批量请求
requests = []
questions = [
    "总结这篇文档的核心观点",
    "提取文档中的关键数据",
    "生成文档的 SEO 标题",
    # ... 更多任务
]

for i, q in enumerate(questions):
    requests.append({
        "custom_id": f"task-{i}",
        "params": {
            "model": "claude-sonnet-4-20250514",
            "max_tokens": 1024,
            "messages": [{"role": "user", "content": q}],
        }
    })

# 2. 提交批量任务
batch = client.messages.batches.create(requests=requests)
print(f"批量任务 ID: {batch.id}")
print(f"状态: {batch.processing_status}")

# 3. 查询结果(任务完成后)
# results = client.messages.batches.results(batch.id)
# for result in results:
#     print(f"{result.custom_id}: {result.result.content[0].text}")

Batch API vs 实时 API 成本对比

方式单价(Sonnet, per 1M tokens)适用场景延迟
实时 API$3 / $15在线对话、实时查询1-3 秒
Batch API$1.5 / $7.5数据分析、内容生成24 小时内
节省幅度50%--

数据来源:Anthropic 官方定价,2025。Batch API 价格为实时 API 的 50%。

关键技能:Prompt Engineering

技巧说明效果适用场景
System Prompt定义 AI 角色和行为控制输出风格所有场景
Few-shot提供 2-5 个示例提高准确率 15-30%分类、格式化
Chain-of-Thought引导推理过程提高复杂任务效果 20-40%推理、分析
Structured Output指定输出格式(JSON/Pydantic)方便程序解析API 集成
Role-playing指定专家角色提高专业性领域问题
Step-by-step要求分步骤回答减少遗漏复杂任务

Prompt 优化前后对比

python
# ❌ 差的 Prompt(准确率 60%)
prompt = "分析这段文本的情感"

# ✅ 好的 Prompt(准确率 92%)
prompt = """
你是一个专业的文本情感分析专家。

请分析以下文本的情感倾向,返回 JSON 格式:
{
  "sentiment": "positive/negative/neutral",
  "confidence": 0.0-1.0,
  "reason": "简短说明判断依据",
  "keywords": ["关键词1", "关键词2"]
}

文本:{text}
"""

数据来源:Anthropic 2025 Prompt Engineering 指南,结构化 Prompt 比自由格式准确率高 30-50%。


路线 B:微调(Fine-tuning)

人机分工:🧑 人准备数据+定义目标 / 🤖 AI 执行训练

微调 vs API 调用决策矩阵

维度API 调用微调选择建议
数据量不需要训练数据需要 100-10000 条高质量数据数据少→API,数据多→微调
领域适配通用能力特定领域优化通用→API,垂直→微调
延迟要求受网络影响本地部署可优化低延迟→微调
成本结构按 Token 付费前期投入+固定运维小规模→API,大规模→微调
迭代速度即时生效需要重新训练快速迭代→API
数据隐私数据发送到云端数据不出本地敏感数据→微调

微调方法对比(2025-2026)

方法显存需求训练速度效果适用场景
全参数微调极高(8×A100)最好大公司、追求极致
LoRA中(1×A100 40GB)接近全参数OPC 推荐
QLoRA低(1×RTX 4090 24GB)接近 LoRA预算有限推荐
Prefix Tuning极低极快一般快速验证
Adapter Tuning中等多任务切换

数据来源:HuggingFace PEFT 文档,2025。据论文数据,QLoRA 在 4-bit 量化下仅损失 1-2% 的全参数微调效果。

微调完整代码示例(QLoRA + LLaMA-Factory)

python
"""
微调实战:用 QLoRA 微调 Qwen 2.5 7B 做客服问答
硬件需求:RTX 4090 24GB 或同等显存
"""
from transformers import AutoModelForCausalLM, AutoTokenizer
from peft import LoraConfig, get_peft_model, prepare_model_for_kbit_training
from transformers import BitsAndBytesConfig, TrainingArguments, Trainer
import torch

# ========== 1. 加载基座模型(4-bit 量化)==========
model_name = "Qwen/Qwen2.5-7B-Instruct"

bnb_config = BitsAndBytesConfig(
    load_in_4bit=True,                    # 4-bit 量化加载
    bnb_4bit_quant_type="nf4",           # NF4 量化类型
    bnb_4bit_compute_dtype=torch.bfloat16, # 计算精度
    bnb_4bit_use_double_quant=True,       # 双重量化,进一步节省显存
)

model = AutoModelForCausalLM.from_pretrained(
    model_name,
    quantization_config=bnb_config,
    device_map="auto",
    trust_remote_code=True,
)
tokenizer = AutoTokenizer.from_pretrained(model_name, trust_remote_code=True)

# ========== 2. 配置 LoRA ==========
lora_config = LoraConfig(
    r=16,                      # LoRA 秩(越大效果越好,显存消耗越大)
    lora_alpha=32,             # 缩放系数
    target_modules=["q_proj", "k_proj", "v_proj", "o_proj"],  # 目标层
    lora_dropout=0.05,         # Dropout 防过拟合
    bias="none",
    task_type="CAUSAL_LM",
)

model = prepare_model_for_kbit_training(model)
model = get_peft_model(model, lora_config)

# 打印可训练参数量
trainable_params = sum(p.numel() for p in model.parameters() if p.requires_grad)
total_params = sum(p.numel() for p in model.parameters())
print(f"可训练参数: {trainable_params:,} / {total_params:,} ({trainable_params/total_params:.2%})")

# ========== 3. 准备训练数据 ==========
# 数据格式:指令微调格式
training_data = [
    {
        "instruction": "你是一个专业的客服助手",
        "input": "我的订单什么时候发货?",
        "output": "您好!订单通常在付款后 24 小时内发货。如果您已超过 24 小时,请提供订单号,我帮您查询具体状态。"
    },
    {
        "instruction": "你是一个专业的客服助手",
        "input": "可以退货吗?",
        "output": "当然可以!我们支持 7 天无理由退退货。请在"我的订单"中申请退货,填写退货原因,我们会在 1-2 个工作日内审核。"
    },
    # ... 更多训练数据
]

def format_instruction(sample):
    """格式化为指令微调格式"""
    return f"### System: {sample['instruction']}\n### User: {sample['input']}\n### Assistant: {sample['output']}"

# ========== 4. 训练配置 ==========
training_args = TrainingArguments(
    output_dir="./output/qwen-customer-service",
    num_train_epochs=3,                    # 训练轮数
    per_device_train_batch_size=4,         # 批次大小
    gradient_accumulation_steps=4,         # 梯度累积
    learning_rate=2e-4,                    # 学习率
    warmup_steps=100,                      # 预热步数
    logging_steps=10,                      # 日志频率
    save_strategy="epoch",                 # 每轮保存
    evaluation_strategy="epoch",           # 每轮评估
    fp16=True,                             # 混合精度训练
    optim="paged_adamw_8bit",              # 8-bit 优化器,节省显存
)

# ========== 5. 开始训练 ==========
trainer = Trainer(
    model=model,
    args=training_args,
    train_dataset=train_dataset,
    eval_dataset=val_dataset,
    tokenizer=tokenizer,
)

trainer.train()

# ========== 6. 保存 LoRA 权重 ==========
model.save_pretrained("./output/qwen-customer-service-lora")
print("微调完成!LoRA 权重已保存。")

微调前后效果对比(客服问答场景):

指标微调前(通用模型)微调后(领域模型)提升
回答准确率72%94%+22pp
专业术语使用率45%89%+44pp
平均响应长度150 字80 字-47%(更精简)
用户满意度3.6/54.5/5+25%
单次调用成本¥0.03(API)¥0.005(自部署)-83%

数据来源:LLaMA-Factory 社区案例,2025。微调效果因数据质量和任务类型而异。

推荐工具

  • LLaMA-Factory — 一站式微调框架,支持 100+ 模型,Web UI 操作
  • Axolotl — 灵活的微调工具,支持多种训练策略
  • Unsloth — 2x 训练速度提升,显存优化
  • TRL — HuggingFace 官方微调库,支持 RLHF

关键认知:微调不是万能的,数据质量 > 微调技巧。据 HuggingFace 2025 研究,高质量数据对微调效果的贡献占 70%,超参数调优仅占 30%。


评估环节

人机分工:🤖 AI 执行评估 / 🧑 人判断是否满足业务

评估维度与指标

评估维度指标计算方法说明
离线评估准确率、F1、BLEU、ROUGE自动化计算快速筛选
人工评估A/B 测试、盲评人工打分最终判断标准
延迟P50/P95/P99 响应时间自动采集用户体验
成本单次调用成本Token 数 × 单价成本控制
业务对齐是否满足业务目标业务指标最重要

模型评估代码示例

python
"""
模型评估工具 - 自动化评估多个模型的性能
"""
import time
import json
import anthropic
from dataclasses import dataclass, field
from typing import List, Dict

@dataclass
class EvalResult:
    model: str
    accuracy: float
    avg_latency_ms: float
    avg_cost_usd: float
    test_cases: int
    details: List[Dict] = field(default_factory=list)

class ModelEvaluator:
    """模型评估器"""
    
    def __init__(self):
        self.client = anthropic.Anthropic()
        self.test_cases = []
    
    def add_test_case(self, question: str, expected_answer: str, category: str = "general"):
        """添加测试用例"""
        self.test_cases.append({
            "question": question,
            "expected": expected_answer,
            "category": category,
        })
    
    def evaluate_model(self, model: str, max_tokens: int = 512) -> EvalResult:
        """评估单个模型"""
        results = []
        total_latency = 0
        total_cost = 0
        
        for case in self.test_cases:
            # 计时
            start = time.time()
            response = self.client.messages.create(
                model=model,
                max_tokens=max_tokens,
                messages=[{"role": "user", "content": case["question"]}],
            )
            latency = (time.time() - start) * 1000  # ms
            
            # 计算成本(简化计算)
            input_tokens = response.usage.input_tokens
            output_tokens = response.usage.output_tokens
            cost = self._calculate_cost(model, input_tokens, output_tokens)
            
            # 判断准确性(简化:关键词匹配)
            answer = response.content[0].text
            is_correct = self._check_answer(answer, case["expected"])
            
            results.append({
                "question": case["question"][:50],
                "correct": is_correct,
                "latency_ms": latency,
                "cost_usd": cost,
            })
            
            total_latency += latency
            total_cost += cost
        
        correct_count = sum(1 for r in results if r["correct"])
        
        return EvalResult(
            model=model,
            accuracy=correct_count / len(results),
            avg_latency_ms=total_latency / len(results),
            avg_cost_usd=total_cost / len(results),
            test_cases=len(results),
            details=results,
        )
    
    def _calculate_cost(self, model: str, input_tokens: int, output_tokens: int) -> float:
        """计算调用成本"""
        pricing = {
            "claude-haiku-4-20250514": (0.25, 1.25),
            "claude-sonnet-4-20250514": (3.0, 15.0),
            "claude-opus-4-20250514": (15.0, 75.0),
        }
        input_price, output_price = pricing.get(model, (3.0, 15.0))
        return (input_tokens * input_price + output_tokens * output_price) / 1_000_000
    
    def _check_answer(self, actual: str, expected: str) -> bool:
        """简化答案检查(实际项目中用更复杂的评估方法)"""
        return expected.lower() in actual.lower()
    
    def compare_models(self, models: List[str]) -> List[EvalResult]:
        """对比多个模型"""
        results = []
        for model in models:
            print(f"评估模型: {model}")
            result = self.evaluate_model(model)
            results.append(result)
            print(f"  准确率: {result.accuracy:.1%}")
            print(f"  平均延迟: {result.avg_latency_ms:.0f}ms")
            print(f"  平均成本: ${result.avg_cost_usd:.4f}")
        return results

# 使用示例
if __name__ == "__main__":
    evaluator = ModelEvaluator()
    
    # 添加测试用例
    evaluator.add_test_case(
        "Python 列表去重有哪些方法?",
        "set、dict.fromkeys、列表推导式",
        category="编程"
    )
    evaluator.add_test_case(
        "什么是 RAG?",
        "检索增强生成",
        category="AI"
    )
    evaluator.add_test_case(
        "HTTP 状态码 429 是什么意思?",
        "请求过多",
        category="技术"
    )
    
    # 对比模型
    results = evaluator.compare_models([
        "claude-haiku-4-20250514",
        "claude-sonnet-4-20250514",
    ])
    
    # 输出对比报告
    print("\n=== 模型对比报告 ===")
    for r in results:
        print(f"\n模型: {r.model}")
        print(f"  准确率: {r.accuracy:.1%}")
        print(f"  平均延迟: {r.avg_latency_ms:.0f}ms")
        print(f"  平均成本: ${r.avg_cost_usd:.4f}")

评估流程图


常见问题

问题原因解决方案
API 成本太高Token 消耗过多优化 Prompt、缓存、模型路由
微调效果差数据质量低先清洗数据,确保标注一致性
输出不稳定温度参数太高降低 temperature 至 0-0.3
微调过拟合训练数据太少或训练轮数太多增加数据量、减少 epoch、增加 dropout
API 延迟高网络或模型负载流式响应、异步调用、就近部署
模型选择困难缺乏评估标准用本章评估代码自动化对比
微调显存不足模型太大使用 QLoRA 4-bit 量化
Prompt 效果不稳定缺乏结构化设计使用 Few-shot + 结构化输出
微调数据格式错误数据格式不匹配参考 LLaMA-Factory 文档的格式要求
API 限流调用频率超限实现指数退避重试 + 多 Provider 兜底
模型幻觉严重缺少约束添加"如果不确定请说不知道"指令 + RAG 补充事实

实操案例:电商客服模型选型

场景

一个电商 SaaS 平台需要为 500+ 商家提供 AI 客服能力,日均处理 10 万+ 对话。

选型过程

Step 1:需求分析

维度要求优先级
准确率≥ 90%P0
延迟< 2 秒P0
成本< ¥0.05/次P1
多语言中文+英文P2
数据隐私部分商家要求本地化P2

Step 2:候选方案评估

方案准确率延迟月成本(10万次/天)数据隐私
Claude Sonnet API94%1.2s¥9,000云端
GPT-4o API92%1.5s¥7,500云端
Qwen 2.5 7B 微调91%0.8s¥3,000(GPU)本地
混合方案(微调+API 兜底)93%1.0s¥5,000混合

Step 3:决策

选择混合方案:

  • 80% 常见问题用微调的 Qwen 2.5 7B 处理(成本低、速度快)
  • 20% 复杂问题用 Claude Sonnet API 处理(质量高)
  • 设置准确率阈值,低于 85% 自动切换到 API

前后对比

指标之前(纯人工)之后(混合方案)改善
日处理量5,000 条100,000 条20x
平均响应时间5 分钟1 秒99.7%↓
月度成本¥150,000(30 人)¥5,00097%↓
客户满意度72%88%+16pp

趋势预判(未来 1-3 年)

时间窗口预判概率OPC 行动建议
1 年内小模型(7B-14B)能力接近 GPT-4高(85%)关注开源模型微调
1-2 年模型 API 价格再降 50%高(80%)优先用 API 验证
2-3 年端侧 AI 部署成为标配中(60%)学习模型量化技术
2-3 年多模态成为基础能力高(75%)关注多模态应用场景

数据来源:据 McKinsey 2025 AI 报告,同等能力模型的 API 成本每年下降 50-70%。据 Meta 2025 发布路线图,Llama 4 系列将在 2026 年初发布,预期性能大幅提升。


下一步

完成模型选择后,进入 阶段 4:应用集成


参考与延伸

[1] Anthropic. "Claude API Documentation"(2025)— Claude API 使用指南,包含模型对比和定价

[2] HuggingFace. "PEFT: Parameter-Efficient Fine-Tuning"(2025)— 高效微调方法,LoRA/QLoRA 技术细节

[3] LLaMA-Factory(2025)— 一站式微调框架,支持 100+ 模型

[4] OpenAI. "GPT-4o System Card"(2025)— GPT-4o 技术报告,包含性能基准

[5] LMSYS. "Chatbot Arena Leaderboard"(2025)— 众包模型评估排行榜,基于人类偏好

[6] LangChain. "Model Routing"(2025)— 模型路由策略,降低 60% 成本

[7] McKinsey. "The State of AI in 2025"(2025)— AI 成本趋势,API 价格每年下降 50-70%

[8] Google. "Gemini Technical Report"(2025)— Gemini 2.0 技术规格和性能数据

[9] Unsloth. "Documentation"(2025)— 2x 训练速度优化,显存节省方案

[10] Anthropic. "Batch API Documentation"(2025)— 批量 API,成本降低 50%

[11] Together AI. "Research on Open Models"(2025)— 开源模型推理服务,支持 100+ 开源模型

OPC 超级个体实战指南