Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

B5. 本地模型部署与微调 | Local Model Deployment & Fine-tuning

路径: Path B: 技术人 · 模块: B5 最后更新: 2026-03-12 难度: 高级 前提: B1 数据管道基础(Python)、B3 RAG 基本概念、B4 Agent 基础 预计时间: 每天 1 小时,3-4 周


flowchart LR
B1["B1 数据管道"]
B1 --> B2
B2["B2 预测模型"]
B2 --> B3
B3["B3 RAG 知识库"]
B3 --> B4
B4["B4 Agent 工作流"]
B4 --> B5
B5[" B5 本地模型部署<br/>(当前)"]:::current
classDef current fill:#ff9900,stroke:#333,color:#fff,font-weight:bold

本模块章节导航

  1. 本地部署方法论 · 2. 工具全景 · 3. 代码实战 · 4. 硬件选购指南 · 5. 常见陷阱 · 6. 进阶技术 · 7. 学习资源

本模块你将构建

本地 AI 服务 在自己的机器上运行 LLM,保护商业数据隐私;用 LoRA 微调模型适配电商场景。

完成本模块后,你将能够:

  • 理解为什么要在本地部署 LLM,以及何时选择本地 vs 云端
  • 用 Ollama 一行命令在本地运行 Qwen2.5、Llama 3.1、Mistral 等开源模型
  • 根据任务需求选择合适的模型(中文能力、代码能力、推理能力)
  • 用 Python 调用本地 Ollama 模型,集成到现有工作流
  • 构建完全本地的 RAG 系统(数据不出本机)
  • 用 LoRA/QLoRA 微调模型,让通用模型变成电商专家
  • 用 vLLM 部署高性能推理服务(支持并发请求)
  • 理解量化技术(GGUF/GPTQ/AWQ),在有限硬件上运行更大的模型
  • 根据预算选择合适的硬件(Mac M 系列 / NVIDIA GPU / 云 GPU)

1. 本地部署方法论

相关阅读: B3 RAG 知识库系统 RAG 系统可作为模型微调的轻量替代方案,详见 B3。 · F1 AI 的前世今生 AI 模型演进详见 F1

1.1 为什么要在本地运行 LLM

电商数据包含大量商业机密:产品成本、供应商信息、销量数据、利润率、客户信息。把这些数据发送到 OpenAI/Claude 的服务器,存在数据泄露风险。

本地部署的核心价值:

价值说明
数据隐私所有数据在本机处理,不经过任何第三方服务器
零 API 成本不按 token 计费,跑多少次都免费(只有电费)
离线可用不依赖网络,飞机上、VPN 断了都能用
低延迟本地推理无网络延迟,适合实时应用
完全可控模型版本、参数、行为完全由你控制,不会被提供商突然更新
合规友好满足数据本地化要求,适合有合规约束的企业

一个真实场景:你需要用 AI 分析 1000 条客户 Review,提取产品改进方向。

  • 用 OpenAI API:1000 条 Review × 平均 200 tokens = 200k tokens,成本约 $0.03(便宜),但数据发送到了 OpenAI 服务器
  • 用本地 Ollama:零成本,数据不出本机,但需要等待更长的推理时间

1.2 云端 vs 本地:决策框架

不是所有场景都适合本地部署。选择的关键在于权衡数据隐私、成本、质量和速度。

你的场景是什么?
数据包含商业机密(成本、利润、供应商) → 本地部署
需要最高质量的推理(复杂分析、创意写作) → 云端 API(GPT-4o/Claude)
高频调用(每天 10000+ 次) → 本地部署(成本优势明显)
偶尔使用(每天几十次) → 云端 API(省去运维成本)
需要离线使用 → 本地部署
团队多人共享 → vLLM 本地服务 或 云端 API
不确定 → 先用云端 API 验证需求,确认后再迁移到本地

详细对比:

维度本地部署云端 API
数据隐私数据不出本机数据发送到第三方服务器
推理质量7B 模型约 GPT-3.5 水平,70B 接近 GPT-4GPT-4o/Claude 3.5 最高水平
成本(低频)硬件投入高,使用免费按 token 计费,总成本低
成本(高频)硬件一次投入,长期免费成本随调用量线性增长
延迟取决于硬件(M4 Pro 约 40 tokens/s)网络延迟 + 推理延迟
离线使用完全离线需要网络
运维成本需要自己管理模型、更新、硬件零运维
扩展性受限于本机硬件无限扩展

经验法则:如果你的数据不敏感且调用量不大,用云端 API 最省事。如果数据敏感或调用量大(每月 API 费用 > $50),认真考虑本地部署。

1.3 硬件要求速查

运行本地 LLM 的最低硬件要求取决于模型大小:

模型大小最低内存/显存推荐硬件推理速度参考
1-3B(小模型)4GB RAM任何现代电脑50-80 tokens/s
7-8B(主流)8GB RAMMac M1 8GB / RTX 306020-40 tokens/s
13-14B16GB RAMMac M2 Pro 16GB / RTX 407015-25 tokens/s
32-34B32GB RAMMac M3 Pro 36GB / RTX 40908-15 tokens/s
70B(大模型)48GB+ RAMMac M3 Max 64GB / 2×RTX 40905-10 tokens/s

关键概念:模型参数量(如 7B = 70 亿参数)决定了所需内存。经过量化(如 Q4_K_M)后,7B 模型约占 4-5GB 内存。详见第 7 节量化技术。


2. 工具全景

工具类型难度最佳场景链接
Ollama本地 LLM 运行器入门一行命令运行本地模型,开发测试ollama.com
vLLM高性能推理引擎高级生产环境、高并发、多用户共享GitHub
llama.cppC++ 推理引擎中级极致性能优化、CPU 推理GitHub
PEFT/LoRA参数高效微调中级用少量数据微调模型HuggingFace
Unsloth快速微调框架中级2 倍速微调,显存减半GitHub
HuggingFace Hub模型仓库入门下载开源模型、数据集huggingface.co
LM Studio桌面 LLM 应用入门GUI 界面运行本地模型lmstudio.ai

选择建议:

  • 个人开发、快速实验 → Ollama(本模块主线)
  • 生产环境、多人共享 → vLLM
  • 极致性能优化、嵌入式设备 → llama.cpp
  • 微调模型 → Unsloth(速度快)或 PEFT(灵活)
  • 不想写代码、GUI 操作 → LM Studio
  • 下载模型和数据集 → HuggingFace Hub

2.1 Ollama vs vLLM vs llama.cpp

维度OllamavLLMllama.cpp
定位开发者友好的本地 LLM 运行器高性能生产级推理引擎底层 C++ 推理库
易用性极简(一行命令)需要配置需要编译
性能良好(底层用 llama.cpp)最优(PagedAttention)优秀(手动优化)
并发支持有限(适合单用户)优秀(生产级并发)需要自己实现
GPU 支持Metal (Mac) / CUDACUDA(主要)Metal / CUDA / CPU
API 兼容OpenAI 兼容 APIOpenAI 兼容 API需要额外封装
模型格式GGUF(自动下载)HuggingFace 原生GGUF
适合场景开发测试、个人使用团队共享、生产部署嵌入式、极致优化

结论:入门用 Ollama(最简单),需要服务多人时用 vLLM,需要极致性能时用 llama.cpp。本模块以 Ollama 为主线,vLLM 为进阶。

参考文档:Ollama 官方文档 | vLLM 官方文档 | llama.cpp GitHub

2.2 HuggingFace:开源模型的 GitHub

HuggingFace 是开源 AI 模型的最大集散地,类似于代码领域的 GitHub。几乎所有开源 LLM 都会在 HuggingFace 上发布。

HuggingFace 的核心功能:

  • Models Hub:下载开源模型(Qwen、Llama、Mistral 等)
  • Datasets Hub:下载训练数据集
  • Spaces:在线体验模型 Demo
  • Transformers 库:Python 中加载和使用模型的标准库

电商开发者常用操作:

# 安装 HuggingFace 工具
pip install transformers huggingface_hub

# 下载模型到本地
huggingface-cli download Qwen/Qwen2.5-7B-Instruct --local-dir ./models/qwen2.5-7b

# 搜索模型
huggingface-cli search models --query "e-commerce chinese"

Ollama vs 直接用 HuggingFace:Ollama 帮你处理了模型下载、量化、运行的所有细节,一行命令搞定。直接用 HuggingFace Transformers 库更灵活,但需要自己管理 GPU 内存、量化、推理优化。入门用 Ollama,需要精细控制时再用 HuggingFace。


3. 代码实战

3.1 Ollama 快速入门:一行命令运行本地 LLM

Ollama 是目前最简单的本地 LLM 运行方式。安装后一行命令就能跑起来。

安装 Ollama:

# macOS 从官网下载安装包
# 访问 https://ollama.com/download 下载 macOS 版本
# 或用 Homebrew:
brew install ollama

# Linux
curl -fsSL https://ollama.com/install.sh | sh

# Windows 从官网下载安装包
# 访问 https://ollama.com/download 下载 Windows 版本

# 验证安装
ollama --version

下载并运行模型:

# 下载并运行 Qwen2.5 7B(推荐:中英文都好)
ollama run qwen2.5:7b

# 下载并运行 Llama 3.1 8B(Meta 开源,英文优秀)
ollama run llama3.1:8b

# 下载并运行 Mistral 7B(欧洲团队,代码能力强)
ollama run mistral:7b

# 查看已下载的模型
ollama list

# 删除不需要的模型(释放磁盘空间)
ollama rm mistral:7b

运行 ollama run 后,你会进入一个交互式对话界面,可以直接和模型聊天:

>>> 帮我分析一下运动相机品类在美国市场的竞争格局
运动相机品类在美国市场的竞争格局可以从以下几个维度分析:

1. 市场格局:GoPro 仍然是市场领导者,但市场份额持续被侵蚀...
2. 价格带分布:$100-200 入门级、$200-400 中端、$400+ 高端...
3. 新进入者:Insta360、DJI Action 等品牌快速增长...
...

>>> /bye # 退出对话

Ollama 的工作原理:Ollama 底层使用 llama.cpp 进行推理,自动检测你的硬件(Mac Metal GPU / NVIDIA CUDA),选择最优的推理方式。模型文件存储在 ~/.ollama/models/ 目录下。

3.2 模型选择指南:Qwen2.5 vs Llama 3.1 vs Mistral

选对模型比选对框架更重要。不同模型在不同任务上表现差异很大。

主流开源模型对比:

模型参数量中文能力英文能力代码能力推理能力推荐场景
Qwen2.50.5B-72B最佳优秀优秀优秀中文电商场景首选
Llama 3.18B-405B良好最佳优秀优秀英文为主的场景
Mistral7B-8x22B良好优秀最佳良好代码生成、技术文档
Gemma 22B-27B良好优秀良好良好轻量级、移动端
Phi-33.8B-14B一般优秀优秀优秀小模型高性能
DeepSeek-V216B-236B优秀优秀最佳优秀代码和数学推理

电商场景推荐:

你的主要语言是什么?
中文为主(中国卖家、中文 Review) → Qwen2.5:7b
英文为主(美国市场、英文 Listing) → Llama3.1:8b
中英混合 → Qwen2.5:7b(中英文都好)
需要写代码/数据分析 → DeepSeek-Coder 或 Qwen2.5-Coder

你的硬件条件?
8GB RAM(Mac M1/M2 基础款) → 7B 模型(qwen2.5:7b)
16GB RAM → 7B 或 14B 模型
32GB+ RAM → 可以尝试 32B 模型
64GB+ RAM → 70B 模型(接近 GPT-4 水平)

Ollama 模型下载命令:

# 电商中文场景首选
ollama pull qwen2.5:7b

# 英文场景 / Meta 生态
ollama pull llama3.1:8b

# 代码生成
ollama pull qwen2.5-coder:7b

# 轻量级(笔记本也能跑)
ollama pull qwen2.5:3b
ollama pull phi3:3.8b

# Embedding 模型(用于 RAG)
ollama pull nomic-embed-text
ollama pull bge-large:latest

3.3 Ollama + Python:集成到现有工作流

Ollama 提供 OpenAI 兼容的 REST API,可以用任何 HTTP 客户端调用。也有官方 Python 库。

方式 1:用 ollama Python 库(最简单)

# pip install ollama

import ollama

def analyze_review(review_text: str, model: str = "qwen2.5:7b") -> str:
"""用本地 LLM 分析客户 Review,提取产品改进方向。"""
response = ollama.chat(
model=model,
messages=[
{
"role": "system",
"content": "你是电商产品分析专家。分析客户 Review,提取:\n"
"1. 核心问题(一句话)\n"
"2. 问题类别(质量/功能/物流/价格/其他)\n"
"3. 改进建议\n"
"用中文回答,简洁明了。",
},
{"role": "user", "content": f"请分析这条 Review:\n{review_text}"},
],
options={"temperature": 0.1}, # 低温度,更确定性的输出
)
return response["message"]["content"]

def batch_analyze_reviews(reviews: list[str], model: str = "qwen2.5:7b") -> list[dict]:
"""批量分析 Review 列表。"""
results = []
for i, review in enumerate(reviews):
print(f"分析 Review {i+1}/{len(reviews)}...")
analysis = analyze_review(review, model)
results.append({"review": review, "analysis": analysis})
return results

# 使用示例
# reviews = [
# "用了一周就坏了,镜头模糊,防水也不行",
# "电池只能用 40 分钟,远低于宣传的 2 小时",
# "画质很好,但是 App 太难用了,经常闪退",
# ]
# results = batch_analyze_reviews(reviews)
# for r in results:
# print(f"Review: {r['review'][:30]}...")
# print(f"分析: {r['analysis']}\n")

方式 2:用 OpenAI 兼容 API(无缝切换云端/本地)

Ollama 提供 OpenAI 兼容的 API 接口,这意味着你可以用 openai Python 库直接调用本地模型,代码几乎不用改。

# pip install openai
# 前提:Ollama 正在运行(ollama serve)

from openai import OpenAI

# 指向本地 Ollama 服务(而非 OpenAI 服务器)
client = OpenAI(
base_url="http://localhost:11434/v1",
api_key="ollama", # Ollama 不需要真实 API key
)

def generate_listing(product_info: str, model: str = "qwen2.5:7b") -> str:
"""用本地 LLM 生成产品 Listing。"""
response = client.chat.completions.create(
model=model,
messages=[
{
"role": "system",
"content": "你是 Amazon Listing 优化专家。根据产品信息生成:\n"
"1. 标题(含核心关键词,<200 字符)\n"
"2. 5 个 Bullet Points\n"
"3. 产品描述(<2000 字符)\n"
"用英文输出,符合 Amazon 风格指南。",
},
{"role": "user", "content": f"产品信息:\n{product_info}"},
],
temperature=0.3,
)
return response.choices[0].message.content

# 切换到云端 OpenAI 只需改两行:
# client = OpenAI(api_key="sk-...") # 改为 OpenAI API key
# model = "gpt-4o-mini" # 改为 OpenAI 模型名

无缝切换的价值:开发阶段用本地 Ollama(免费、数据安全),上线后根据需要切换到 OpenAI(质量更高)。代码只需改 base_urlmodel 两个参数。

方式 3:流式输出(Streaming)

对于长文本生成(如报告、Listing),流式输出可以让用户看到实时生成过程,体验更好。

import ollama

def stream_generate(prompt: str, model: str = "qwen2.5:7b"):
"""流式生成文本,实时输出每个 token。"""
stream = ollama.chat(
model=model,
messages=[{"role": "user", "content": prompt}],
stream=True,
)

full_response = ""
for chunk in stream:
token = chunk["message"]["content"]
print(token, end="", flush=True)
full_response += token

print() # 换行
return full_response

# stream_generate("用 200 字分析 Insta360 X4 在美国市场的竞争优势")

3.4 本地 RAG 完整方案:Ollama + LlamaIndex + Chroma

结合 B3 模块的 RAG 知识,构建一个完全本地的 RAG 系统。所有数据在本机处理,不调用任何外部 API。

# 完全本地 RAG Ollama + LlamaIndex + Chroma
# pip install llama-index llama-index-llms-ollama llama-index-embeddings-ollama chromadb

import chromadb
from llama_index.core import (
VectorStoreIndex, SimpleDirectoryReader,
Settings, StorageContext,
)
from llama_index.llms.ollama import Ollama
from llama_index.embeddings.ollama import OllamaEmbedding
from llama_index.vector_stores.chroma import ChromaVectorStore

def build_local_rag(
docs_dir: str,
llm_model: str = "qwen2.5:7b",
embed_model: str = "nomic-embed-text",
collection_name: str = "local_knowledge",
persist_dir: str = "chroma_db",
) -> VectorStoreIndex:
"""
构建完全本地的 RAG 系统。

前提:
1. 已安装 Ollama 并运行(ollama serve)
2. 已下载模型:ollama pull qwen2.5:7b
3. 已下载 Embedding:ollama pull nomic-embed-text

所有数据在本地处理,不调用任何外部 API。
"""
# 配置本地 LLM
Settings.llm = Ollama(
model=llm_model,
request_timeout=120.0,
temperature=0.1,
)

# 配置本地 Embedding
Settings.embed_model = OllamaEmbedding(model_name=embed_model)

# 配置 Chroma 持久化存储
chroma_client = chromadb.PersistentClient(path=persist_dir)
chroma_collection = chroma_client.get_or_create_collection(collection_name)
vector_store = ChromaVectorStore(chroma_collection=chroma_collection)
storage_context = StorageContext.from_defaults(vector_store=vector_store)

# 加载文档并构建索引
documents = SimpleDirectoryReader(docs_dir, recursive=True).load_data()
print(f" 加载了 {len(documents)} 个文档")

index = VectorStoreIndex.from_documents(
documents, storage_context=storage_context, show_progress=True,
)

print(f" 本地 RAG 构建完成")
print(f" LLM: {llm_model} | Embedding: {embed_model}")
print(f" 向量数据库: {persist_dir} ({chroma_collection.count()} 个向量)")
print(f" 所有数据在本地处理,未发送到任何外部服务")
return index

def query_local_rag(index: VectorStoreIndex, question: str, top_k: int = 3) -> dict:
"""查询本地 RAG 系统。"""
query_engine = index.as_query_engine(similarity_top_k=top_k)
response = query_engine.query(question)

sources = []
for node in response.source_nodes:
sources.append({
"file": node.metadata.get("file_name", "unknown"),
"score": round(node.score, 4) if node.score else None,
"preview": node.text[:200],
})

return {
"question": question,
"answer": str(response),
"sources": sources,
}

# 使用示例
# index = build_local_rag("data/product_docs")
# result = query_local_rag(index, "这个产品的保修期是多久?")
# print(f"Q: {result['question']}")
# print(f"A: {result['answer']}")
# for s in result['sources']:
# print(f" 来源: {s['file']} (相似度: {s['score']})")

本地 RAG 架构图:

用户提问
↓
[Ollama Embedding] → 问题向量化(本地)
↓
[Chroma 向量数据库] → 相似度搜索(本地磁盘)
↓
检索到的文档段落 + 用户问题
↓
[Ollama LLM] → 生成回答(本地)
↓
回答 + 引用来源

成本对比:处理 100 个文档的 RAG 系统,用 OpenAI API 每次重建索引约 $0.05,每次查询约 $0.002。用本地 Ollama,成本为 $0(只有电费)。如果每天查询 100 次,一个月省 $6;如果每天查询 1000 次,一个月省 $60。

3.5 LoRA 微调入门:让通用模型变成电商专家

通用 LLM 对电商术语(ASIN、FBA、ACoS、BSR)的理解有限。通过 LoRA 微调,可以用少量电商数据让模型变成“电商专家“。

什么是 LoRA?

LoRA(Low-Rank Adaptation)是一种参数高效微调技术。核心思想:不修改原始模型的全部参数(70 亿个),只训练一小组“适配器“参数(几百万个),就能让模型学会新知识。

传统微调:修改全部 70 亿参数 → 需要大量 GPU 显存和时间
LoRA 微调:冻结原始参数,只训练 ~1% 的适配器参数 → 一张消费级 GPU 就够

LoRA 的优势:

维度传统全量微调LoRA 微调
显存需求7B 模型需 ~56GB7B 模型需 ~16GB
训练时间数小时到数天数十分钟到数小时
训练数据量需要大量数据几百到几千条即可
原始模型被修改,不可恢复不变,适配器可插拔
多任务每个任务一个完整模型每个任务一个小适配器文件

准备微调数据(电商场景):

# 微调数据格式:instruction + input + output
# 保存为 JSONL 文件

training_data = [
{
"instruction": "分析这条 Amazon Review,提取产品问题和改进建议。",
"input": "买了两周就坏了,镜头模糊,防水也不行。客服态度还可以但是解决不了问题。",
"output": "**产品问题**:\n1. 耐用性差(两周损坏)\n2. 镜头质量问题(模糊)\n"
"3. 防水性能不达标\n\n**改进建议**:\n1. 加强产品质检,重点检测镜头和防水密封\n"
"2. 延长质保期以提升客户信心\n3. 在 Listing 中准确描述防水等级,避免过度宣传",
},
{
"instruction": "根据产品信息生成 Amazon Listing 的 5 个 Bullet Points。",
"input": "产品:运动相机 X1,4K60fps,防水 10 米,电池 2 小时,重量 120g,"
"支持语音控制,配件丰富",
"output": " 【4K Ultra HD】Capture stunning 4K video at 60fps...\n"
" 【Waterproof to 33ft】Built-in waterproof design...\n"
" 【2-Hour Battery Life】Extended battery for all-day...\n"
" 【Voice Control】Hands-free operation with voice...\n"
" 【Complete Accessory Kit】Includes mounting brackets...",
},
# ... 准备 200-500 条类似数据
]

import json
with open("train_data.jsonl", "w", encoding="utf-8") as f:
for item in training_data:
f.write(json.dumps(item, ensure_ascii=False) + "\n")

用 Unsloth 进行 LoRA 微调(推荐,速度快 2 倍):

# Unsloth LoRA 微调 在 Google Colab 免费版即可运行
# pip install unsloth

from unsloth import FastLanguageModel
from trl import SFTTrainer
from transformers import TrainingArguments
from datasets import load_dataset

# 1. 加载基础模型(自动应用 4-bit 量化,节省显存)
model, tokenizer = FastLanguageModel.from_pretrained(
model_name="unsloth/Qwen2.5-7B-Instruct-bnb-4bit",
max_seq_length=2048,
load_in_4bit=True, # 4-bit 量化,7B 模型只需 ~5GB 显存
)

# 2. 添加 LoRA 适配器
model = FastLanguageModel.get_peft_model(
model,
r=16, # LoRA 秩(越大越强但越慢,推荐 8-32)
target_modules=["q_proj", "k_proj", "v_proj", "o_proj",
"gate_proj", "up_proj", "down_proj"],
lora_alpha=16, # 缩放因子(通常等于 r)
lora_dropout=0, # Dropout(Unsloth 优化后设为 0)
bias="none",
use_gradient_checkpointing="unsloth", # 进一步节省显存
)

# 3. 准备训练数据
# 数据格式:每条数据是一个完整的对话
def format_prompt(example):
return {
"text": f"""<|im_start|>system
你是电商运营 AI 助手,精通 Amazon 运营、Listing 优化、Review 分析。<|im_end|>
<|im_start|>user
{example['instruction']}
{example['input']}<|im_end|>
<|im_start|>assistant
{example['output']}<|im_end|>"""
}

dataset = load_dataset("json", data_files="train_data.jsonl", split="train")
dataset = dataset.map(format_prompt)

# 4. 配置训练参数
trainer = SFTTrainer(
model=model,
tokenizer=tokenizer,
train_dataset=dataset,
dataset_text_field="text",
max_seq_length=2048,
args=TrainingArguments(
per_device_train_batch_size=2,
gradient_accumulation_steps=4, # 等效 batch_size = 8
warmup_steps=5,
max_steps=60, # 小数据集 60 步足够(约 500 条数据)
learning_rate=2e-4,
fp16=True, # 混合精度训练
logging_steps=10,
output_dir="outputs",
optim="adamw_8bit", # 8-bit 优化器,节省显存
),
)

# 5. 开始训练
trainer_stats = trainer.train()
print(f"训练完成!耗时: {trainer_stats.metrics['train_runtime']:.0f} 秒")

# 6. 保存 LoRA 适配器(只有几十 MB,不是完整模型)
model.save_pretrained("lora_ecommerce")
tokenizer.save_pretrained("lora_ecommerce")
print(" LoRA 适配器已保存到 lora_ecommerce/")

# 7. 导出为 GGUF 格式(可以在 Ollama 中使用)
model.save_pretrained_gguf(
"model_gguf",
tokenizer,
quantization_method="q4_k_m", # 4-bit 量化
)
print(" GGUF 模型已导出,可用 Ollama 加载")

微调后在 Ollama 中使用:

# 创建 Modelfile
cat > Modelfile << 'EOF'
FROM ./model_gguf/unsloth.Q4_K_M.gguf
TEMPLATE """<|im_start|>system
{{ .System }}<|im_end|>
<|im_start|>user
{{ .Prompt }}<|im_end|>
<|im_start|>assistant
"""
SYSTEM "你是电商运营 AI 助手,精通 Amazon 运营、Listing 优化、Review 分析。"
PARAMETER temperature 0.1
PARAMETER top_p 0.9
EOF

# 创建 Ollama 模型
ollama create ecommerce-expert -f Modelfile

# 运行微调后的模型
ollama run ecommerce-expert

微调数据量指南

  • 50-100 条:模型学会输出格式,但知识有限
  • 200-500 条:模型掌握领域术语和基本任务
  • 1000+ 条:模型成为领域专家,回答质量接近人工
  • 数据质量比数量更重要 100 条高质量数据 > 1000 条低质量数据

3.6 vLLM 高性能部署:团队共享的本地 LLM 服务

Ollama 适合个人使用,但如果团队多人需要共享一个本地 LLM 服务,vLLM 是更好的选择。vLLM 使用 PagedAttention 技术,推理吞吐量比 Ollama 高 2-4 倍。

安装 vLLM:

# 需要 NVIDIA GPU(CUDA 12.1+)
pip install vllm

# 或用 Docker(推荐,避免环境问题)
docker run --runtime nvidia --gpus all \
-v ~/.cache/huggingface:/root/.cache/huggingface \
-p 8000:8000 \
vllm/vllm-openai:latest \
--model Qwen/Qwen2.5-7B-Instruct \
--max-model-len 4096

启动 vLLM 服务:

# 方式 1:命令行启动(OpenAI 兼容 API)
python -m vllm.entrypoints.openai.api_server \
--model Qwen/Qwen2.5-7B-Instruct \
--host 0.0.0.0 \
--port 8000 \
--max-model-len 4096 \
--gpu-memory-utilization 0.9

# 服务启动后,用 OpenAI 客户端调用:
# curl http://localhost:8000/v1/chat/completions \
# -H "Content-Type: application/json" \
# -d '{"model": "Qwen/Qwen2.5-7B-Instruct", "messages": [...]}'

Python 调用 vLLM 服务:

from openai import OpenAI

# vLLM 提供 OpenAI 兼容 API,代码和调用 OpenAI 完全一样
client = OpenAI(base_url="http://localhost:8000/v1", api_key="not-needed")

response = client.chat.completions.create(
model="Qwen/Qwen2.5-7B-Instruct",
messages=[
{"role": "system", "content": "你是电商数据分析专家。"},
{"role": "user", "content": "分析这个月销售下降 15% 的可能原因"},
],
temperature=0.1,
max_tokens=1024,
)
print(response.choices[0].message.content)

Ollama vs vLLM 性能对比:

维度OllamavLLM
单请求延迟快(优化好)
并发吞吐量一般(单请求优化)优秀(PagedAttention)
10 并发请求~5 tokens/s/请求~15 tokens/s/请求
GPU 利用率60-70%85-95%
适合场景个人开发、单用户团队共享、API 服务
安装难度极简需要 CUDA 环境

何时从 Ollama 升级到 vLLM:当你的本地 LLM 服务需要同时服务 3+ 个用户,或者需要处理批量请求(如批量分析 1000 条 Review)时,vLLM 的吞吐量优势就很明显了。


4. 硬件选购指南

4.1 Mac M 系列(推荐入门)

Apple Silicon Mac 是目前性价比最高的本地 LLM 开发平台。统一内存架构让 CPU 和 GPU 共享内存,不需要单独的显卡。

机型统一内存可运行模型推理速度参考适合场景
MacBook Air M1 8GB8GB7B (Q4)~15 tokens/s入门学习
MacBook Pro M2 16GB16GB7B-14B~25 tokens/s日常开发
MacBook Pro M3 Pro 18GB18GB7B-14B~30 tokens/s日常开发
MacBook Pro M3 Pro 36GB36GB7B-32B~20 tokens/s (32B)进阶开发
MacBook Pro M3 Max 64GB64GB7B-70B~10 tokens/s (70B)专业级
Mac Studio M2 Ultra 192GB192GB70B+ (全精度)~15 tokens/s (70B)团队服务

Mac 用户的最佳实践:

# 检查你的 Mac 内存
sysctl -n hw.memsize | awk '{print $1/1024/1024/1024 " GB"}'

# 根据内存选择模型
# 8GB → ollama run qwen2.5:3b 或 phi3:3.8b
# 16GB → ollama run qwen2.5:7b(推荐)
# 32GB → ollama run qwen2.5:14b 或 qwen2.5:32b (Q4)
# 64GB → ollama run qwen2.5:72b (Q4)

# 监控推理时的内存和 GPU 使用
# 打开 Activity Monitor → GPU History

购买建议:如果你主要做 AI 开发,优先选择内存大的配置。MacBook Pro M3 Pro 36GB 是性价比甜点 能跑 32B 模型,日常开发绰绰有余。

4.2 NVIDIA GPU(推荐生产环境)

如果需要微调模型或部署高并发服务,NVIDIA GPU 是标准选择。

GPU显存可运行模型微调能力价格参考
RTX 3060 12GB12GB7B (Q4/Q8)7B LoRA (QLoRA)~$250
RTX 4060 Ti 16GB16GB7B-14B7B LoRA~$400
RTX 4070 Ti Super 16GB16GB7B-14B7B LoRA~$800
RTX 4090 24GB24GB7B-32B7B-14B LoRA~$1,600
A100 40GB40GB7B-70B (Q4)7B-14B 全量~$10,000
A100 80GB80GB70B+70B LoRA~$15,000
H100 80GB80GB70B+70B 全量~$30,000

显存需求估算公式:

推理显存 ≈ 模型参数量(B) × 量化位数 / 8 + 2GB 开销
微调显存 ≈ 推理显存 × 1.5(LoRA)或 × 4(全量微调)

示例:
- Qwen2.5-7B Q4 推理:7 × 4 / 8 + 2 = 5.5GB → RTX 3060 够用
- Qwen2.5-7B Q4 LoRA 微调:5.5 × 1.5 = 8.25GB → RTX 3060 勉强
- Qwen2.5-7B FP16 全量微调:7 × 16 / 8 × 4 = 56GB → 需要 A100

4.3 云 GPU(按需使用,无需购买硬件)

不想买硬件?云 GPU 按小时计费,用完即走。

平台GPU 选项价格参考适合场景
Google ColabT4 (免费) / A100 (Pro)免费 / $10/月学习、小规模微调
Lambda CloudA100 / H100$1.10-$2.49/小时微调、批量推理
RunPodA100 / H100$1.04-$2.39/小时灵活按需
Vast.ai各种 GPU$0.20-$1.50/小时最便宜,社区 GPU
AWS SageMaker各种 GPU$1.21-$32.77/小时企业级,与 AWS 生态集成

推荐策略:

  • 学习和实验 → Google Colab 免费版(T4 GPU,够跑 7B 模型微调)
  • 正式微调 → Lambda Cloud 或 RunPod(A100,按小时计费)
  • 生产部署 → AWS SageMaker 或自建服务器

成本计算示例:用 Colab Pro($10/月)微调一个 7B 模型,A100 GPU 约需 30 分钟。如果每月微调 2 次,成本约 $10/月。买一张 RTX 4090($1,600),需要 160 个月才能回本。所以如果微调频率不高,云 GPU 更划算。


5. 常见陷阱

5.1 模型选错导致效果差

症状:本地模型的回答质量远低于预期,中文回答不通顺,或者完全不理解电商术语。

原因:选了不适合的模型。比如用英文优化的 Llama 处理中文任务,或者用 3B 小模型做复杂分析。

解决方案

任务错误选择正确选择
中文 Review 分析llama3.1:8b(中文弱)qwen2.5:7b(中文强)
复杂数据分析phi3:3.8b(太小)qwen2.5:14b 或更大
代码生成mistral:7b(代码一般)qwen2.5-coder:7b
简单分类任务qwen2.5:72b(杀鸡用牛刀)qwen2.5:3b(够用且快)

经验法则:先用小模型(3B-7B)测试,效果不够再换大模型。不要一上来就用最大的模型 大模型慢且占资源。

5.2 内存不足导致崩溃

症状:运行模型时系统卡死、Ollama 报错 “out of memory”、Mac 开始疯狂使用 swap。

解决方案

# 1. 检查当前内存使用
ollama ps # 查看正在运行的模型及其内存占用

# 2. 停止不需要的模型
ollama stop qwen2.5:14b

# 3. 使用更小的量化版本
ollama run qwen2.5:7b-q4_0 # Q4 量化,比默认更省内存

# 4. 限制 Ollama 使用的内存(Mac)
# 在 ~/.ollama/config 中设置:
# OLLAMA_MAX_LOADED_MODELS=1
# OLLAMA_NUM_PARALLEL=1

Mac 用户注意:当统一内存不够时,macOS 会使用 SSD swap,导致推理速度暴降 10 倍以上,而且长期大量 swap 会损耗 SSD 寿命。确保模型大小不超过可用内存的 80%。

5.3 微调过拟合

症状:微调后的模型在训练数据上表现很好,但遇到新问题就“胡说八道“,或者所有回答都像是在背诵训练数据。

原因:训练数据太少、训练步数太多、学习率太高。

解决方案

策略做法
增加数据多样性确保训练数据覆盖多种场景,不要只有一种类型
减少训练步数从 30 步开始,逐步增加,观察验证集 loss
降低学习率从 2e-4 降到 1e-4 或 5e-5
使用验证集留 10-20% 数据做验证,监控验证 loss
早停验证 loss 不再下降时停止训练

5.4 Ollama 服务未启动

症状:Python 代码报错 “Connection refused” 或 “Cannot connect to Ollama”。

解决方案

# 检查 Ollama 是否在运行
ollama ps

# 如果没有运行,启动服务
ollama serve

# macOS:Ollama 通常作为后台服务自动运行
# 如果没有,打开 Ollama 应用程序(在 Applications 中)

# 验证服务是否正常
curl http://localhost:11434/api/tags

5.5 量化精度损失

症状:量化后的模型回答质量明显下降,出现逻辑错误或语句不通顺。

不同量化级别的质量影响:

量化级别模型大小(7B)质量损失推荐场景
FP16(无量化)~14GB有足够显存时
Q8_0~7.5GB极小(<1%)质量优先
Q6_K~5.5GB很小(1-2%)平衡选择
Q5_K_M~5.0GB小(2-3%)推荐默认
Q4_K_M~4.4GB可接受(3-5%)内存有限时
Q4_0~3.8GB明显(5-10%)极端内存限制
Q2_K~2.8GB大(10-20%)不推荐

推荐:Q4_K_M 是性价比最高的量化级别 模型大小减半,质量损失在 5% 以内,大多数任务感知不到差异。Ollama 默认使用的就是 Q4_K_M。


6. 进阶技术

6.1 量化技术详解:GGUF / GPTQ / AWQ

量化是在有限硬件上运行大模型的关键技术。核心思想:用更少的位数表示模型参数,牺牲少量精度换取大幅减少内存占用。

三种主流量化格式:

格式全称适用场景工具支持
GGUFGPT-Generated Unified FormatCPU/Mac Metal 推理Ollama, llama.cpp, LM Studio
GPTQGPT QuantizationNVIDIA GPU 推理vLLM, HuggingFace, AutoGPTQ
AWQActivation-aware Weight QuantizationNVIDIA GPU 推理vLLM, HuggingFace

如何选择:

你用什么硬件?
Mac(Apple Silicon) → GGUF(Ollama 默认格式)
NVIDIA GPU → GPTQ 或 AWQ
追求推理速度 → AWQ(略快)
追求兼容性 → GPTQ(支持更广)
CPU only → GGUF(llama.cpp 优化)

手动下载 GGUF 模型并在 Ollama 中使用:

# 1. 从 HuggingFace 下载 GGUF 文件
# 搜索:https://huggingface.co/models?search=gguf
# 例如下载 Qwen2.5-7B 的 Q4_K_M 量化版本

# 2. 创建 Modelfile
cat > Modelfile << 'EOF'
FROM ./qwen2.5-7b-instruct-q4_k_m.gguf
TEMPLATE """<|im_start|>system
{{ .System }}<|im_end|>
<|im_start|>user
{{ .Prompt }}<|im_end|>
<|im_start|>assistant
"""
PARAMETER temperature 0.1
PARAMETER top_p 0.9
PARAMETER num_ctx 4096
EOF

# 3. 创建 Ollama 模型
ollama create my-qwen -f Modelfile

# 4. 运行
ollama run my-qwen

6.2 模型合并(Model Merging)

模型合并是一种不需要训练就能“组合“多个模型优势的技术。比如把一个中文强的模型和一个代码强的模型合并,得到一个中文和代码都强的模型。

常见合并方法:

方法原理适合场景
SLERP球面线性插值,平滑混合两个模型合并两个相似模型
TIES消除冗余参数后合并合并多个微调模型
DARE随机丢弃部分参数后合并合并差异较大的模型
Task Arithmetic提取任务向量后加减添加/移除特定能力

用 mergekit 合并模型:

# pip install mergekit

# 创建合并配置文件 merge_config.yml
cat > merge_config.yml << 'EOF'
slices:
- sources:
- model: Qwen/Qwen2.5-7B-Instruct
layer_range: [0, 28]
- model: your-ecommerce-lora-model
layer_range: [0, 28]
merge_method: slerp
base_model: Qwen/Qwen2.5-7B-Instruct
parameters:
t:
- filter: self_attn
value: [0, 0.5, 0.3, 0.7, 1]
- filter: mlp
value: [1, 0.5, 0.7, 0.3, 0]
- value: 0.5
dtype: bfloat16
EOF

# 执行合并
mergekit-yaml merge_config.yml ./merged_model --cuda

模型合并的实际价值:你微调了一个擅长 Review 分析的模型和一个擅长 Listing 生成的模型。通过合并,可以得到一个两者都擅长的模型,而不需要重新收集数据训练。这在电商场景中很实用 不同任务的微调模型可以“合体“。

6.3 Ollama 自定义模型(Modelfile)

Ollama 的 Modelfile 类似 Dockerfile,让你自定义模型的行为:系统提示词、参数、模板格式。

# 创建电商专用模型配置
cat > Modelfile.ecommerce << 'EOF'
# 基于 Qwen2.5 7B
FROM qwen2.5:7b

# 设置系统提示词
SYSTEM """你是一个专业的跨境电商 AI 助手。你精通:
- Amazon/Shopify/TikTok Shop 平台运营
- 产品 Listing 优化和 SEO
- 客户 Review 分析和产品改进
- 库存管理和供应链优化
- 广告投放和 ROI 分析

回答要求:
1. 基于数据和事实,不做无依据推测
2. 给出具体可执行的建议,不说空话
3. 涉及数据时标注来源和计算方法
4. 中英文都可以,根据用户语言回答"""

# 调整参数
PARAMETER temperature 0.1
PARAMETER top_p 0.9
PARAMETER num_ctx 4096
PARAMETER repeat_penalty 1.1
EOF

# 创建模型
ollama create ecommerce-assistant -f Modelfile.ecommerce

# 使用
ollama run ecommerce-assistant "分析一下 ACoS 从 18% 上升到 25% 的可能原因"

6.4 批量推理优化

处理大量数据(如 1000 条 Review)时,逐条调用 LLM 效率很低。以下是优化策略:

import ollama
import json
from concurrent.futures import ThreadPoolExecutor

def batch_analyze(
items: list[str],
system_prompt: str,
model: str = "qwen2.5:7b",
max_workers: int = 2,
) -> list[dict]:
"""
批量调用本地 LLM 分析。

优化策略:
1. 合并短文本:把多条短 Review 合并成一个请求
2. 并行请求:Ollama 支持有限并发
3. 结构化输出:要求 JSON 格式,方便后续处理
"""

def analyze_single(item: str) -> dict:
try:
response = ollama.chat(
model=model,
messages=[
{"role": "system", "content": system_prompt},
{"role": "user", "content": item},
],
options={"temperature": 0.1},
format="json", # 要求 JSON 输出
)
return {"input": item, "output": json.loads(response["message"]["content"])}
except Exception as e:
return {"input": item, "error": str(e)}

# 并行处理(Ollama 默认支持 1 个并行请求,可在配置中调整)
results = []
with ThreadPoolExecutor(max_workers=max_workers) as executor:
futures = [executor.submit(analyze_single, item) for item in items]
for i, future in enumerate(futures):
results.append(future.result())
if (i + 1) % 10 == 0:
print(f"进度: {i+1}/{len(items)}")

return results

# 使用示例
# reviews = ["Review 1...", "Review 2...", ...] # 1000 条 Review
# results = batch_analyze(
# reviews,
# system_prompt="分析 Review,返回 JSON:{category, sentiment, key_issue}",
# )

批量处理性能参考(Mac M3 Pro 36GB, Qwen2.5:7b):

数据量平均每条耗时总耗时
100 条 Review~3 秒~5 分钟
500 条 Review~3 秒~25 分钟
1000 条 Review~3 秒~50 分钟

优化技巧:如果 Review 很短(<50 字),可以把 5-10 条合并成一个请求,让 LLM 一次分析多条,效率提升 3-5 倍。


7. 学习资源

资源类型说明链接
Ollama 官方文档文档免费,5 分钟部署本地 LLMollama.com
DeepLearning.AI: Finetuning LLMs免费短课Andrew Ng 团队出品,LoRA 微调入门deeplearning.ai
Coursera: Generative AI for Everyone免费旁听Andrew Ng 主讲,AI 全景概览coursera.org
HuggingFace PEFT 文档文档LoRA/QLoRA 官方参考huggingface.co/docs/peft
Unsloth GitHub文档+教程2x 快速微调,Colab 示例丰富github.com/unslothai/unsloth
vLLM 官方文档文档高性能推理引擎github.com/vllm-project/vllm
llama.cpp GitHub文档C++ 推理引擎,GGUF 格式github.com/ggerganov/llama.cpp
HuggingFace NLP Course免费课程Transformers 库系统教程huggingface.co/learn

推荐学习顺序:

  1. 安装 Ollama,跑通 3.1 节的快速入门(30 分钟)
  2. 看 DeepLearning.AI 的 Finetuning 短课(2 小时,建立微调概念)
  3. 跟着 3.3 节用 Python 调用 Ollama(1 小时)
  4. 构建本地 RAG(3.4 节,结合 B3 模块知识)
  5. 尝试 LoRA 微调(3.5 节,需要 GPU 或 Colab)
  6. 看 Coursera 的 Generative AI for Everyone 补全理论基础

9. 完成标志

  • 在本地安装 Ollama 并成功运行一个 LLM(3.1)
  • 能说出 Qwen2.5 / Llama 3.1 / Mistral 各自的优势和适用场景(3.2)
  • 用 Python 调用本地 Ollama 完成一个电商任务(如 Review 分析)(3.3)
  • 构建一个完全本地的 RAG 系统(Ollama + Chroma)(3.4)
  • 理解 LoRA 微调的原理,能准备微调数据集(3.5)
  • 了解 GGUF/GPTQ/AWQ 量化格式的区别和选择(6.1)
  • 根据自己的硬件条件选择合适的模型和量化级别(4 + 5.5)

10. 附录

9.1 开源模型对比表

模型发布方参数量选项许可证中文英文代码Ollama 命令
Qwen2.5阿里云0.5B/1.5B/3B/7B/14B/32B/72BApache 2.0ollama run qwen2.5:7b
Llama 3.1Meta8B/70B/405BLlama 3.1 Licenseollama run llama3.1:8b
MistralMistral AI7B/8x7B/8x22BApache 2.0ollama run mistral:7b
Gemma 2Google2B/9B/27BGemma Licenseollama run gemma2:9b
Phi-3Microsoft3.8B/7B/14BMITollama run phi3:3.8b
DeepSeek-V2DeepSeek16B/236BDeepSeek Licenseollama run deepseek-v2:16b
Yi-1.5零一万物6B/9B/34BApache 2.0ollama run yi:34b
ChatGLM4智谱 AI9BGLM-4 Licenseollama run glm4:9b

模型能力评级基于公开基准测试和社区反馈,仅供参考。实际表现因任务而异。


9.2 硬件需求速查表

任务最低配置推荐配置预算参考
运行 7B 模型(推理)8GB RAM, 任何 CPUMac M2 16GB$800-1,200
运行 14B 模型(推理)16GB RAMMac M3 Pro 18GB$1,600-2,000
运行 70B 模型(推理)48GB RAMMac M3 Max 64GB$3,000-4,000
LoRA 微调 7B12GB VRAM (GPU)RTX 4060 Ti 16GB$400
LoRA 微调 14B24GB VRAMRTX 4090 24GB$1,600
全量微调 7B40GB+ VRAMA100 40GB (云)$1.10/小时
vLLM 部署(生产)24GB VRAMA100 80GB (云)$2.49/小时
学习和实验任何电脑Colab 免费版免费

9.3 代码速查表

任务命令/代码
安装 Ollama (macOS)brew install ollama 或从 ollama.com 下载
下载模型ollama pull qwen2.5:7b
运行模型(交互)ollama run qwen2.5:7b
查看已下载模型ollama list
查看运行中模型ollama ps
删除模型ollama rm qwen2.5:7b
启动 Ollama 服务ollama serve
Python 调用 Ollamaollama.chat(model="qwen2.5:7b", messages=[...])
OpenAI 兼容调用OpenAI(base_url="http://localhost:11434/v1")
创建自定义模型ollama create my-model -f Modelfile
安装微调依赖pip install unsloth trl transformers datasets
安装 RAG 依赖pip install llama-index llama-index-llms-ollama chromadb
安装 vLLMpip install vllm
启动 vLLM 服务python -m vllm.entrypoints.openai.api_server --model ...
下载 HuggingFace 模型huggingface-cli download Qwen/Qwen2.5-7B-Instruct
检查 Mac 内存sysctl -n hw.memsize | awk '{print $1/1024/1024/1024 " GB"}'
检查 GPU (NVIDIA)nvidia-smi

9.4 电商场景模型推荐速查

电商任务推荐模型推荐量化最低硬件
中文 Review 分析Qwen2.5:7bQ4_K_M8GB RAM
英文 Listing 生成Llama3.1:8bQ4_K_M8GB RAM
中英混合任务Qwen2.5:7bQ4_K_M8GB RAM
数据分析代码生成Qwen2.5-Coder:7bQ4_K_M8GB RAM
复杂商业分析Qwen2.5:14bQ4_K_M16GB RAM
高质量报告生成Qwen2.5:32bQ4_K_M32GB RAM
本地 RAG Embeddingnomic-embed-text4GB RAM
本地 RAG Embedding(中文优化)bge-large4GB RAM

9.5 Ollama 环境变量参考

# 常用环境变量(在 ~/.zshrc 或 ~/.bashrc 中设置)

# 修改模型存储目录(默认 ~/.ollama/models)
export OLLAMA_MODELS="/path/to/models"

# 修改监听地址(默认 localhost:11434)
export OLLAMA_HOST="0.0.0.0:11434" # 允许局域网访问

# 限制同时加载的模型数量
export OLLAMA_MAX_LOADED_MODELS=1

# 限制并行请求数
export OLLAMA_NUM_PARALLEL=2

# 设置 GPU 层数(Mac Metal)
export OLLAMA_NUM_GPU=999 # 尽可能多用 GPU

(b4-agent-workflow.md) | Path 总览 | B6 MCP >