本地部署LLM-用Ollama跑DeepSeek和Qwen
*Ollama 本地部署架构——用户→Ollama API→本地模型→GPU/CPU 推理的完整流程*
本地部署 LLM:用 Ollama 跑 DeepSeek 和 Qwen
1.1 什么时候需要本地部署
Ollama 本地部署架构——用户→Ollama API→本地模型→GPU/CPU 推理的完整流程
在某些场景下,调用云端 LLM API 不是可选项。
数据隐私是最强的驱动因素:金融、医疗、政府项目要求数据不出本地网络。每一条发给 GPT-4 API 的请求,理论上都经过 OpenAI 的服务器。即使服务商声称不用于训练,从合规角度看也是不可接受的。本地部署,数据物理上不离开你的服务器。
成本控制是第二个原因:API 按 token 计费。如果要处理大量文档——比如每天分析几万条合同、日志、报告——API 费用会快速累积。买一台装了 RTX 3090 的服务器,一次性投入约 1.5 万元人民币,之后无限用,大概 3-6 个月就能通过节省 API 费用收回成本。
离线可用:工厂车间、政府内网、特定合规环境没有外网。本地部署是唯一选择。
低延迟:云端 API 调用要走网络,往返几百毫秒。本地推理几乎零网络延迟,适合对响应速度要求极高的场景。
但本地部署不是万能的:本地跑的 7B、14B 模型,效果确实不如 GPT-4o 或 Claude Opus 等云端旗舰模型。如果任务需要很强的推理能力或很长的上下文,本地小模型会让你失望。技术选型要解决真实问题,不要为了本地部署而本地部署。
在某些场景下,调用云端 LLM API 不是可选项:金融、医疗、政府项目要求数据不出本地网络;处理大量文档时按 token 计费的成本无法承受;部分场景完全没有外网连接。本章介绍如何用 Ollama 在本地运行 LLM,以及如何与 LangChain 集成。
1.2 为什么要本地部署
数据隐私是首要原因。发给云端 API 的每一条请求,理论上都会经过服务商的服务器。即使服务商声称不用于训练,从合规角度看也是不可接受的。本地部署,数据不出机器。
成本控制是第二个原因。云端 API 按 token 计费,如果要处理大量文档——比如每天跑几万条合同分析——费用会累积到很高。买一台装了 4090 的服务器,一次性投入,之后无限用。大概跑半年到一年就能收回硬件成本。
离线可用有时候被忽视,但确实重要。某些场景就是没有外网:政府内网、工厂车间、移动端离线应用。本地部署是这些场景的唯一选择。
低延迟也是一个点。API 调用要走网络,再快也有几百毫秒的往返延迟。本地推理,尤其是用 GPU 跑,延迟可以控制在极低水平。
1.3 Ollama 是什么
Ollama 是目前最简单的本地 LLM 运行工具,没有之一。
它把模型下载、运行、API 服务这些事情都封装好了。不需要知道 CUDA 怎么配置、模型文件怎么加载、推理框架怎么初始化,一行命令就能把一个 7B 大模型跑起来。
对开发者来说还有一个好消息:Ollama 提供 OpenAI 兼容的 REST API。用 OpenAI SDK 写的代码,换个 base_url 就能切到本地模型,几乎不用改代码。
1.4 快速上手
1.4.1 安装 Ollama
macOS 直接去 ollama.com 下载安装包,拖进应用程序文件夹,完成。
Linux 一行命令:
curl -fsSL https://ollama.com/install.sh | sh
Windows 同样去官网下载安装包,Next 到底。
安装完成后,Ollama 会在后台作为服务运行,默认监听 11434 端口。
1.4.2 拉取模型
# DeepSeek-R1 7B 版本,擅长推理任务
ollama pull deepseek-r1:7b
# Qwen2.5 7B 版本,中文效果好
ollama pull qwen2.5:7b
# 查看已下载的模型
ollama list
模型文件会下载到本地(macOS 在 ~/.ollama/models),之后断网也能用。
1.4.3 直接对话
# 在命令行里和模型对话
ollama run deepseek-r1:7b
输入问题,回车,等待回复。输入 /bye 退出。
1.4.4 调用 API
Ollama 服务启动后,直接用 HTTP 就能调用:
curl http://localhost:11434/api/chat -d '{
"model": "qwen2.5:7b",
"messages": [
{"role": "user", "content": "用一句话解释什么是递归"}
],
"stream": false
}'
1.5 模型选择
本地跑的模型和云端 API 的模型是完全不同的一套选项,弄清楚每个的特点能省很多时间。
DeepSeek-R1:推理能力强,尤其是数学和代码。7B 版本在推理任务上能打 70B 模型的水平,这是 DeepSeek 做 RL 训练的成果。8GB 显存就能跑 7B 版本,是性价比非常高的选择。如果任务是分析、推断、解题,首选它。
Qwen2.5:阿里出品,中文处理效果是同尺寸里最好的。有 0.5B、1.5B、3B、7B、14B 多个尺寸,可以根据硬件灵活选择。做中文相关任务——文档摘要、中文问答、内容分类——Qwen2.5 是首选。7B 版本够用,14B 效果更好。
LLaMA 3.1:Meta 出品,英文通用任务的标杆。如果任务是英文,LLaMA 3.1 8B 是一个可靠的基准。开源协议也很宽松,商用没有障碍。
量化版本:每个模型都有 Q4_K_M、Q8_0 等量化版本。量化是压缩技术,Q4 表示用 4-bit 存储权重,原本 7B 模型需要 14GB 存储,Q4 压缩后只需要约 4GB。精度损失有,但对大多数任务影响不大。显存不够时,优先选量化版本。Ollama 拉取的默认版本通常就是量化版。
1.6 硬件要求
| 模型规模 | GPU 推理 | CPU 推理 |
|---|---|---|
| 7B | 8GB 显存(Q4 约 4GB) | 16GB 内存,较慢 |
| 14B | 16GB 显存(Q4 约 8GB) | 32GB 内存,很慢 |
| 70B | 40GB+ 显存(需多卡) | 基本不可行 |
没有独立 GPU 也能跑,Ollama 支持 CPU 推理。16GB 内存的 MacBook 跑 7B 模型是可以的,速度大概每秒 5-10 个 token,写邮件、轻度问答够用,但实时对话会觉得慢。
苹果 M 系列芯片是个特殊情况,它的统一内存架构可以把 CPU 内存当显存用,M2 Max(36GB 统一内存)跑 Qwen2.5 14B 体验相当不错,性价比高。
1.7 与 LangChain 集成
Ollama 对 LangChain 的支持非常好,有专门的 ChatOllama 类,接口和 ChatOpenAI 完全一致。
# 安装依赖:pip install langchain-ollama langchain-core
from langchain_ollama import ChatOllama
from langchain_core.messages import HumanMessage, SystemMessage
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
# 初始化本地模型,直接替换 ChatOpenAI
llm = ChatOllama(
model="qwen2.5:7b",
temperature=0.7,
base_url="http://localhost:11434", # Ollama 默认地址
)
# 基础对话
messages = [
SystemMessage(content="你是一个合同审查专家,用简洁专业的语言回答问题。"),
HumanMessage(content="合同中的'不可抗力'条款通常包含哪些内容?")
]
response = llm.invoke(messages)
print(response.content)
# 用 LCEL(LangChain Expression Language,LangChain 的链式调用语法,用 | 符号把 prompt、LLM、解析器等组件串成流水线)链式调用
prompt = ChatPromptTemplate.from_messages([
("system", "你是一个代码审查专家,专注于 Java 代码质量。"),
("human", "请审查以下代码并指出潜在问题:\n\n{code}")
])
chain = prompt | llm | StrOutputParser()
code = """
public List<User> getUsers() {
List<User> users = new ArrayList<>();
for (int i = 0; i < 1000000; i++) {
users.add(userRepository.findById(i));
}
return users;
}
"""
result = chain.invoke({"code": code})
print(result)
# 流式输出
for chunk in chain.stream({"code": code}):
print(chunk, end="", flush=True)
如果之前用的是 ChatOpenAI,切换只需要把导入和初始化那两行换掉。后面的 invoke、stream、链式调用,一行不用改。这是 LangChain 接口统一设计的好处。
也可以直接用 OpenAI SDK 调用 Ollama,只需要改 base_url 和 api_key:
# 安装依赖:pip install openai
from openai import OpenAI
# 用 OpenAI SDK 调用本地 Ollama
client = OpenAI(
base_url="http://localhost:11434/v1",
api_key="ollama", # Ollama 不需要真实的 key,填任意字符串
)
response = client.chat.completions.create(
model="deepseek-r1:7b",
messages=[
{"role": "user", "content": "分析这段代码的时间复杂度:O(n^2) 的冒泡排序和 O(n log n) 的快排,在实际项目中如何选择?"}
]
)
print(response.choices[0].message.content)
1.8 vLLM:生产环境的选择
Ollama 是开发和测试的利器,但它不是为高并发生产环境设计的。如果要在服务器上部署,给多个用户同时使用,应该考虑 vLLM。
vLLM 是一个专门做推理优化的框架,有几个关键优势:
PagedAttention:类似操作系统的虚拟内存管理,大幅提升 GPU 内存利用率,同等显存可以处理更多并发请求。
连续批处理:多个请求动态合并成批次处理,吞吐量比逐条处理高几倍到十几倍。
部署很简单:
pip install vllm
# 启动 OpenAI 兼容的 API 服务
python -m vllm.entrypoints.openai.api_server \
--model Qwen/Qwen2.5-7B-Instruct \
--port 8000
启动后同样提供 OpenAI 兼容接口,代码一行不用改,只需要把 base_url 指向 vLLM 的地址。
简单对比:Ollama 适合个人开发、测试、单机使用,安装简单,对显卡要求低;vLLM 适合生产服务器,高并发性能好,但部署配置更复杂,对 GPU 要求更高。
1.9 本地部署的适用边界
本地部署解决的是特定问题,不是所有问题。
本地跑的 7B、14B 模型,效果确实比不上 GPT-5.4 或 Claude Opus 4.6 等云端旗舰模型。这是参数量决定的,没有捷径。如果任务需要很强的推理能力、很长的上下文、很复杂的指令跟随,本地小模型会让人失望。
本地部署的适用场景是:数据不能出去、成本敏感、对模型效果要求不是极致、任务相对简单或者可以通过 Prompt 工程和 RAG 弥补模型能力的不足。
如果数据可以出去,云端 API 往往是更省事、效果更好的选择。技术选型要解决真实问题,而不是追求本地部署本身。