大模型选型与部署:从API到私有化的完整路径
说实话,大模型选型这件事,我踩过的坑比走过的路还多。2023年刚开始做AI Agent落地时,团队一上来就选了当时最强的GPT-4,结果一个月烧了十几万API费用,业务场景却只跑通了20%。嗯,从那以后我养成了一个习惯——先想清楚场景,再选模型。
一、主流大模型API接入:选对工具,事半功倍
目前市面上主流的API服务,我按自己的使用经验排了个序:
| 模型 | 优势场景 | 我的评价 | 成本参考 |
|---|---|---|---|
| GPT-4o | 复杂推理、多轮对话 | 综合能力最强,但贵 | 输入$5/1M tokens |
| Claude 3.5 Sonnet | 长文本、代码生成 | 200K上下文,性价比高 | 输入$3/1M tokens |
| 文心一言4.0 | 中文理解、合规场景 | 国内部署,延迟低 | 按QPS计费 |
| 通义千问2.5 | 多模态、开源生态 | 阿里系集成方便 | 部分免费额度 |
核心原则:不要盲目追求最强模型。我见过太多项目,用GPT-4做简单的文本分类,纯粹是杀鸡用牛刀。先评估你的场景需要什么级别的推理能力,再决定。
二、API接入实战:代码说话
以GPT-4o为例,我习惯用OpenAI的Python SDK。这里有个小技巧——一定要加异常处理和重试机制。为什么?因为API调用在网络波动时经常超时,不加重试,你的Agent就会莫名其妙挂掉。
import openai
from tenacity import retry, stop_after_attempt, wait_exponential
class LLMClient:
def __init__(self, api_key, model="gpt-4o"):
self.client = openai.OpenAI(api_key=api_key)
self.model = model
@retry(stop=stop_after_attempt(3), wait=wait_exponential(multiplier=1, min=4, max=10))
def chat(self, messages, temperature=0.7):
try:
response = self.client.chat.completions.create(
model=self.model,
messages=messages,
temperature=temperature
)
return response.choices[0].message.content
except openai.RateLimitError:
print("触发了限流,等待重试...")
raise
except openai.APITimeoutError:
print("API超时,重新尝试...")
raise
# 使用示例
client = LLMClient(api_key="your-key")
result = client.chat([
{"role": "system", "content": "你是一个AI助手"},
{"role": "user", "content": "帮我总结一下这篇文章"}
])
我的经验:temperature参数别乱调。做客服场景用0.3以下,保证回复稳定;做创意生成用0.8以上。我曾经因为temperature设太高,让客服机器人给客户写了首诗...场面一度很尴尬。
三、私有化部署:vLLM vs Ollama
为什么要私有化部署?说白了就两个原因:数据安全和成本控制。我服务过一家金融客户,所有数据都不能出内网,那只能自己部署。
目前主流方案有两个,我分别说说:
vLLM:高性能推理引擎
vLLM的核心优势是PagedAttention技术,显存利用率极高。我在项目中用vLLM部署了Llama 3 70B,8张A100能跑到每秒50个token,延迟控制在200ms以内。
# 安装
pip install vllm
# 启动服务
python -m vllm.entrypoints.openai.api_server \
--model /path/to/llama-3-70b \
--tensor-parallel-size 8 \
--max-model-len 8192 \
--gpu-memory-utilization 0.9
# 客户端调用(兼容OpenAI格式)
import openai
client = openai.OpenAI(base_url="http://localhost:8000/v1")
response = client.chat.completions.create(
model="llama-3-70b",
messages=[{"role": "user", "content": "你好"}]
)
Ollama:轻量级部署方案
Ollama更适合个人开发者或小团队。它把模型打包成容器,一条命令就能跑起来。我经常用它做快速原型验证。
# 安装Ollama
curl -fsSL https://ollama.com/install.sh | sh
# 拉取并运行模型
ollama pull qwen2.5:7b
ollama run qwen2.5:7b
# 通过API调用
curl http://localhost:11434/api/generate -d '{
"model": "qwen2.5:7b",
"prompt": "解释一下什么是AI Agent"
}'
避坑指南:我曾经在Ollama上部署了70B模型,结果发现推理速度慢到无法接受。后来才意识到,Ollama的定位是轻量级,适合7B-13B的模型。大模型还是得上vLLM或者TensorRT-LLM。
四、模型微调策略:什么时候该微调?
这个问题我经常被问到。我的回答是:能不微调就别微调。为什么?因为微调成本高、周期长,而且容易过拟合。
那什么时候必须微调?我总结了三个场景:
- 领域术语理解:比如医疗、法律等专业领域,通用模型不认识那些术语
- 特定输出格式:比如必须输出JSON格式,且字段有严格约束
- 风格迁移:比如要让模型模仿某个作家的文风
微调的方法,我推荐LoRA(Low-Rank Adaptation)。它只更新少量参数,训练速度快,显存占用小。我在一个法律文书项目中,用LoRA微调了Qwen2.5 7B,只用了2小时就完成了训练,效果提升了30%。
# 使用Hugging Face PEFT库进行LoRA微调
from transformers import AutoModelForCausalLM, AutoTokenizer
from peft import LoraConfig, get_peft_model, TaskType
# 加载基础模型
model = AutoModelForCausalLM.from_pretrained("Qwen/Qwen2.5-7B")
tokenizer = AutoTokenizer.from_pretrained("Qwen/Qwen2.5-7B")
# 配置LoRA
lora_config = LoraConfig(
task_type=TaskType.CAUSAL_LM,
r=8, # 秩,一般8-16
lora_alpha=32,
lora_dropout=0.1,
target_modules=["q_proj", "v_proj"] # 只微调注意力层
)
# 应用LoRA
peft_model = get_peft_model(model, lora_config)
peft_model.print_trainable_parameters() # 只有0.5%的参数可训练
关键指标:微调后一定要做A/B测试。我习惯用同样的prompt,对比微调前后的输出。如果微调后在其他通用任务上表现下降,说明过拟合了,需要调整数据或减少训练轮数。
五、知识体系总览
下面这张图是我自己总结的选型决策流程,你可以照着这个思路走:
这张图的核心逻辑很简单:先看数据能不能出内网,能就API,不能就私有化。然后评估通用模型够不够用,不够就微调。我每次做新项目都按这个流程走,基本没出过大的偏差。
最后说一句:模型选型不是一锤子买卖。我建议每季度重新评估一次,因为模型迭代太快了。去年还觉得GPT-4不可替代,今年开源模型已经追上来不少。保持开放心态,别被某个模型绑架。
公众号:蓝海资料掘金营,微信deep3321