外观
框架与工具选型
工具选型的本质是为你的场景匹配复杂度:框架解决 80% 的通用问题,代价是 20% 的灵活性;选错框架的代价不是"多装一个包",而是整个团队被绑架进它的设计里。
本文把 LLM 工具链拆成六层,每层给出场景→推荐的决策表。看完你该得到的是一个"自己心里有数"的选型地图,而不是"谁火选谁"。开源生态全景见Llama 与开源生态。
一、分层工具地图
┌─────────────────────────────────────────────┐
│ 应用层 Dify / 自研应用 │
├─────────────────────────────────────────────┤
│ 编排层 LangChain / LlamaIndex │
├─────────────────────────────────────────────┤
│ 评估层 lm-eval-harness / OpenCompass / RAGAS │
├─────────────────────────────────────────────┤
│ 推理层 vLLM / SGLang / TensorRT-LLM / llama.cpp │
├─────────────────────────────────────────────┤
│ 训练层 transformers / PEFT / TRL / DeepSpeed │
│ Megatron-LM / LLaMA-Factory / Axolotl │
├─────────────────────────────────────────────┤
│ 模型与数据层 Transformers / Datasets / Tokenizers │
└─────────────────────────────────────────────┘选型的通用原则(下面每层都会用到):
- 默认最薄:能用标准库/API 解决的,不引框架。
- 先跑通再抽象:第一版用最直接的方式实现,出现重复需求再引入抽象。
- 可替换性:核心模块(如向量库、推理引擎)封装成接口,方便换。
二、模型与数据层:几乎必选
| 工具 | 定位 | 何时选 |
|---|---|---|
Hugging Face transformers | 模型加载/推理/训练的标准库 | 几乎所有场景(事实标准) |
datasets | 数据集加载与预处理 | 训练/微调必经 |
tokenizers | 高性能分词 | 自定义分词器时 |
transformers 的 from_pretrained 一行加载模型、统一 AutoModel/AutoTokenizer 接口,让"换模型"从改代码变成改一行参数——这是整个生态的基石。没有特殊理由,模型层不需要选型,直接用 transformers。
三、训练层:按规模与方式选
| 工具 | 定位 | 适用场景 | 不适用 |
|---|---|---|---|
transformers Trainer | 单卡/小规模训练 | 小模型微调、教学 | 大规模并行训练 |
PEFT | LoRA/QLoRA 等参数高效微调 | 绝大多数微调任务 | 全参微调 |
TRL | SFT/DPO/PPO 训练器 | 指令微调与对齐 | 自研训练循环 |
LLaMA-Factory | 一键式平台 | 快速实验、多种方法切换 | 深度定制 |
Axolotl | 配置驱动训练 | 复现配置、批量实验 | 需要动态逻辑 |
DeepSpeed | 分布式训练引擎(ZeRO) | 大模型多卡训练 | 小模型单卡 |
Megatron-LM | NVIDIA 大规模训练(张量并行等) | 百亿级+训练 | 常规微调 |
选型决策表(训练):
你要做什么?
├─ 微调 7B 以下、单卡可跑 → PEFT/TRL 或 LLaMA-Factory
├─ 微调 13B+、需要量化省显存 → QLoRA(bitsandbytes)+ PEFT
├─ 预训练/全参 70B+ 多卡 → DeepSpeed(ZeRO-3)或 Megatron-LM
└─ 对齐(RLHF/DPO)→ TRL(DPOTrainer)或自研 + trlx 等训练工程化的三条纪律
框架之外,训练环节最常被忽视的是工程纪律:
| 纪律 | 做法 | 解决什么问题 |
|---|---|---|
| 实验可复现 | 固定随机种子 + 记录完整超参(含数据版本、框架版本) | 两个实验对不上结论 |
| checkpoint 管理 | 定期保存并按 eval 分数保留最优 | 过拟合/事故后回滚 |
| 训练日志 | 记录每个 step 的 loss/梯度范数/学习率 | 定位发散、判断收敛 |
训练日志的价值在离线复盘:一次"微调后变笨"的排查,靠的就是训练日志里的 eval loss 拐点。
训练选型的现实建议
能用 PEFT/TRL 解决的问题不要引入 DeepSpeed。 分布式训练的复杂度(节点通信、梯度同步、混合精度)是数量级上升的。先问自己:单卡 + QLoRA 是否已经够用?完整流程见微调实战:LoRA 全流程。
四、推理层:吞吐与延迟的工程战场
推理引擎直接决定部署成本与用户体验。指标口径(TTFT/TPOT/吞吐)见部署与服务化。
| 引擎 | 特点 | 适用场景 |
|---|---|---|
| vLLM | PagedAttention、continuous batching、OpenAI 兼容 API | 生产默认首选 |
| SGLang | RadixAttention、结构化输出优化 | 高并发、复杂 prompting、工具调用 |
| TensorRT-LLM | NVIDIA 深度优化、TensorRT 编译 | NVIDIA 集群、极致吞吐 |
| llama.cpp(GGUF) | CPU/小内存可跑、纯本地 | 本地/边缘、个人使用、离线 |
| Ollama | 包一层 llama.cpp,一键运行 | 本地体验、教学演示 |
transformers 原生推理 | 简单但低效(无 batching 优化) | 原型、教学 |
选型决策表(推理):
| 场景 | 推荐 | 原因 |
|---|---|---|
| 生产 API 服务(GPU) | vLLM 或 SGLang | continuous batching 吞吐高、API 兼容 |
| 需要函数调用/JSON 强约束 | SGLang / vLLM(structured output) | 原生支持约束解码 |
| 本地电脑/无独显 | llama.cpp / Ollama(GGUF 量化) | 低资源可跑 |
| NVIDIA 大规模集群 | TensorRT-LLM | 极致性能(但构建复杂) |
| 教学/原型 | transformers 或 Ollama | 简单直观 |
推理引擎的取舍:没有银弹
| 需求 | vLLM | SGLang | TensorRT-LLM | llama.cpp |
|---|---|---|---|---|
| 开箱即用(OpenAI 兼容 API) | ★★★ | ★★★ | ★★ | ★(需另包服务) |
| 高并发吞吐 | ★★★ | ★★★ | ★★★ | ★ |
| 结构化输出/工具调用 | ★★ | ★★★ | ★★ | ★ |
| 低资源(CPU/小内存) | ★ | ★ | ★ | ★★★ |
| 社区活跃度/升级速度 | ★★★ | ★★ | ★★ | ★★★ |
选型结论:默认 vLLM;高并发 + 复杂 prompt 场景试 SGLang;NVIDIA 集群且追求极致吞吐再考虑 TensorRT-LLM;个人/边缘场景用 llama.cpp。不要同时上两套引擎——推理层是运维成本最高的地方,保持单一引擎是巨大的简化。
不要在生产用 transformers 裸推理
它没有 continuous batching 与 KV cache 优化,同样吞吐的显存/GPU 需求是 vLLM 的数倍。"先在 transformers 里试通了模型" 与 "上线服务" 之间,必须过一道推理引擎的转换。
五、应用编排层:LangChain / LlamaIndex / Dify
| 工具 | 定位 | 优势 | 劣势 |
|---|---|---|---|
| LangChain | 通用编排框架(链、Agent、工具) | 生态大、组件全 | 抽象层厚、升级频繁 |
| LlamaIndex | 数据接入与 RAG 深度优化 | RAG 组件最成熟 | 偏数据、Agent 弱些 |
| Dify | 低代码应用平台(可视化) | 非开发者也快、含 RAG/工作流 | 深度定制受限 |
| 自研 | 自己写调用逻辑 | 完全可控、无版本绑架 | 从零实现、维护成本 |
选型决策表(编排):
你的团队与技术形态?
├─ 纯后端工程团队、要长期维护 → 自研轻量封装(最稳)
├─ 快速验证 RAG/多 Agent 原型 → LlamaIndex 或 LangChain
├─ 业务/产品人员搭应用 → Dify
└─ 已被某框架代码绑架 → 评估"最小重写路径",不要继续堆Agent 与工作流:编排层的下一个阶段
当需求从"单轮问答"升级到"多工具、多步骤"时,编排层的重心从 RAG 转向 Agent 与工作流。工具调用机制见基于 LLM 的 Agent。本层的选型要点:
| 方案 | 形态 | 适合 |
|---|---|---|
| LangGraph | 图状工作流(LangChain 官方) | 需要精细控制状态的复杂流程 |
| AutoGen / CrewAI | 多 Agent 协作 | 多角色分工实验 |
| 自研事件循环 | 自己管理"调用 LLM → 调工具 → 回填"循环 | 生产长期维护、完全可控 |
| 平台(Dify/Coze 等) | 可视化编排 | 非工程团队快速上线 |
Agent 是复杂度放大器
Agent 循环(多步推理 + 工具调用)的失败面比单轮 RAG 大得多:工具调用格式错、循环失控、成本失控。先问自己:必须用 Agent 吗? 很多"Agent 需求"用"工作流 + 工具函数"即可解决,复杂度低一个量级。
"别被框架绑架"——最贵的隐性成本
框架的两个隐性成本:版本漂移(API 频繁变更,锁定后升级难)与抽象泄漏(出问题时你必须读框架源码才能排查)。判断标准:你为框架付出的调试时间,是否超过了框架为你省下的开发时间? 越接近应用核心的代码,越值得自研。
六、向量库层:见 RAG 实战
选型维度的完整决策见 RAG 实战 第三节。速览:
| 向量库 | 形态 | 场景 |
|---|---|---|
| FAISS | 库 | 原型、离线、单机 |
| pgvector | PG 插件 | 已有 PG、需要事务一致性 |
| Qdrant / Milvus | 独立服务 | 生产级、亿级向量、混合检索 |
| Chroma | 嵌入式 | 本地教学、轻量 |
七、评估层:评测工具
| 工具 | 定位 | 特点 |
|---|---|---|
| lm-evaluation-harness | 通用基准评测(MMLU/GSM8K 等) | 社区标准、任务全 |
| OpenCompass | 中文友好、多模型对比 | 报告可视化好 |
| RAGAS | RAG 专项评测 | 忠实度/相关性/答案相关 |
| 自建流水线 | 业务 golden set | 不可替代,见评估实战 |
评测工具不是评估体系
lm-eval 只是"跑基准的脚本",真正的评估体系 = 你的 golden set + judge + 回归门禁 + 线上反馈。工具负责执行,体系负责解释。参见评估实战。
八、总选型速查表
| 层 | 你的场景 | 推荐(首选项) |
|---|---|---|
| 模型库 | 任何 | transformers |
| 微调 | 单卡、7B 以下 | PEFT/TRL 或 LLaMA-Factory |
| 分布式训练 | 70B+、多卡 | DeepSpeed / Megatron-LM |
| 生产推理 | GPU 服务 | vLLM |
| 本地推理 | 个人/边缘 | llama.cpp / Ollama |
| 应用编排 | 快速原型 | LangChain / LlamaIndex |
| 应用编排 | 长期维护 | 自研轻量封装 |
| 向量库 | 原型 | FAISS |
| 向量库 | 生产 | Qdrant / Milvus / pgvector |
| 评测 | 通用基准 | lm-eval-harness / OpenCompass |
| 评测 | 业务回归 | 自建 golden set 流水线 |
一次选型的完整推演(示例)
一个团队从零搭一个中文问答系统,选型推演如下:
| 决策点 | 场景 | 结论 |
|---|---|---|
| 模型 | 中文、预算有限 | 开源 7B(Qwen 系) |
| 微调 | 先试提示 | 暂不微调,PEFT 备选 |
| 推理 | 生产 API 服务 | vLLM |
| 编排 | 团队是后端工程师 | 自研轻量封装 |
| 向量库 | 数据量小、已有 PG | pgvector |
| 评测 | 需要建立体系 | 自建 golden set + lm-eval 回归 |
选型是"一系列权衡的组合"——任何单点的"最好"都可能被其他环节抵消(比如选了 vLLM,但编排层被某框架锁死,整体依然难受)。
九、实验管理与可观测性
工具链的"最后一层"是实验管理与观测:没有它,前八层的产出都无法沉淀。
| 工具 | 定位 | 选型要点 |
|---|---|---|
| Weights & Biases | 训练实验追踪 | 训练曲线、超参对比、团队共享 |
| MLflow | 实验 + 模型注册 + 部署追踪 | 模型版本管理、与工程链路集成 |
| 日志/追踪(OpenTelemetry 等) | 线上请求追踪 | 请求级延迟、token 用量、错误归因 |
选型结论:训练实验用 W&B 或 MLflow 其一;线上服务接入标准日志与追踪。实验管理不是"可选优化",而是团队协作与回归排查的基础设施——所有数字(评估实战)都需要被记录才能被信任。
十、原则总结:选型三问
每次选型前,问自己三个问题:
- 我真的需要这个框架吗? 用标准库或十行代码能解决,就别引。
- 它解决的是我的问题,还是它自己的问题? 框架解决的问题域与你越重合,越值得用。
- 三年后我能离开它吗? 越难离开(锁死),越要评估自研或封装。
框架是负债,能力是资产
工具会过时(LangChain 的 API 一年变三次,vLLM 每季度加新特性),但你对"检索→生成""批处理→吞吐"这些原理的理解不会过时。选型时优先选"教你原理"的工具,而不是"替你思考"的工具。这个视角也适用于更完整的资源清单精选资源清单。
延伸阅读
- 部署与服务化 —— 推理引擎背后的指标与显存公式
- RAG 实战 —— 编排框架、向量库的实战用法
- 评估实战 —— 评测工具与自建评估体系
- 微调实战:LoRA 全流程 —— PEFT/TRL/LLaMA-Factory 的具体用法
- Llama 与开源生态 —— 开源模型与工具生态全景
- 主流模型档案 —— 模型选型(框架之上先选对模型)
- 精选资源清单 —— 更完整的工具与学习资源索引
参考资料
- Hugging Face Transformers(GitHub) —— 模型层事实标准
- Microsoft DeepSpeed(GitHub) —— 分布式训练引擎
- NVIDIA Megatron-LM(GitHub) —— 大规模训练框架
- Hugging Face PEFT(GitHub) —— 参数高效微调
- Hugging Face TRL(GitHub) —— SFT/DPO/PPO 训练器
- LLaMA-Factory(GitHub) —— 一键式微调平台
- vLLM(GitHub) —— 生产推理引擎
- SGLang(GitHub) —— 高性能推理框架
- TensorRT-LLM(GitHub) —— NVIDIA 推理引擎
- llama.cpp(GitHub) —— CPU 可跑的本地推理
- Ollama 官网 —— 本地一键运行模型
- LangChain 官网 —— 编排框架
- LlamaIndex 官网 —— 数据与 RAG 框架
- Dify 官网 —— 低代码 LLM 应用平台
- OpenCompass(GitHub) —— 评测平台