本地部署开源大模型:Ollama 私有化推理 + 离线 Agent 实战
把大模型交给云端 API,最大的代价是数据必须离开你的机器。对合同、病历、源代码、财务报表这类敏感内容,很多团队根本不敢上传。本地部署(On-Premise LLM)让模型跑在你自己的电脑或服务器上——数据不出机、断网也能用、调用不计费。本教程用 Ollama(目前最易上手的本地推理引擎)带你从零搭一个可离线运行的私有 Agent。
一、为什么要在本地跑大模型?
在动手前,先想清楚本地部署到底解决什么问题。它不是"更牛的玩法",而是"更可控的选择":
| 维度 | 云端 API | 本地部署(Ollama) |
|---|---|---|
| 数据隐私 | 数据上传第三方 | 数据全程在本机 |
| 网络依赖 | 必须联网 | 可完全离线 |
| 成本 | 按 Token 持续付费 | 一次性硬件投入,调用免费 |
| 延迟 | 受网络影响 | 局域网内极低延迟 |
| 可控性 | 模型/版本由厂商决定 | 自选模型、量化、并发全自定义 |
实话实说:本地部署的劣势也很明显——需要显卡算力,小模型(7B/14B)的能力远不如云端旗舰(如 Claude、GPT 系列),复杂推理任务本地小模型容易翻车。所以最实用的架构往往是混合式:敏感数据走本地,高难度任务走云端。本教程先把你本地这一半补齐。
Step 1:安装 Ollama 并拉取模型
Ollama 支持 macOS / Linux / Windows(WSL2)。官方一键安装后,它会作为一个本地服务常驻(默认监听 11434 端口)。
# macOS / Linux 一行安装
curl -fsSL https://ollama.com/install.sh | sh
# 启动服务(安装后通常会自动启动,可手动确认)
ollama serve
# 拉取一个通用中文友好的模型(Qwen2.5 7B 是性价比之选)
ollama pull qwen2.5:7b
# 想跑更强的代码模型,可再拉一个
ollama pull qwen2.5-coder:7b
# 验证:直接对话
ollama run qwen2.5:7b "用一句话解释什么是向量数据库"
qwen2.5:7b、llama3.1:8b);24GB+ 可上 14B/32B;想跑 70B 级别至少需要 48GB 显存(或用多卡/CPU 卸载,但速度很慢)。本教程以 7B/14B 为主,兼顾大多数人。Step 2:用 API 调用本地模型
Ollama 启动后自带 OpenAI 风格兼容接口。你之前写给云端 API 的代码,几乎不用改就能指向本地。
# 方式一:curl 直接调
curl http://localhost:11434/api/generate -d '{
"model": "qwen2.5:7b",
"prompt": "把下面这段中文润色成正式邮件:周一开会",
"stream": false
}'
# 方式二:Python(无需额外依赖,用标准库即可)
import urllib.request, json
def local_chat(prompt, model="qwen2.5:7b"):
payload = json.dumps({
"model": model,
"prompt": prompt,
"stream": False
}).encode("utf-8")
req = urllib.request.Request(
"http://localhost:11434/api/generate",
data=payload,
headers={"Content-Type": "application/json"}
)
with urllib.request.urlopen(req) as r:
return json.loads(r.read().decode("utf-8"))["response"]
print(local_chat("用 Python 写一个快速排序"))
api.openai.com 换成 localhost:11434,把 api_key 去掉(或随便填),大量现成 Agent 框架(LangChain、OpenAI SDK、Cline、Continue)都能直接接管本地模型。这也是"私有 Agent"能快速落地的根本原因。Step 3:挂载私有知识库(本地 RAG)
纯本地模型容易"一本正经胡说"。给它接上你的私有文档(合同、手册、代码库),用 RAG(检索增强生成)补足事实。下面用 Ollama 的 embedding 接口 + 轻量向量库 Chroma 实现最小可用版。
# 先装向量库
pip install chromadb
import chromadb, urllib.request, json
chroma = chromadb.Client()
col = chroma.create_collection("kb")
def embed(text):
payload = json.dumps({"model": "nomic-embed-text", "input": text}).encode()
req = urllib.request.Request("http://localhost:11434/api/embeddings",
data=payload, headers={"Content-Type": "application/json"})
return json.loads(urllib.request.urlopen(req).read())["embedding"]
# 1) 入库:把你自己的文档切成片段后写入
docs = ["公司年假政策:入职满1年享5天...", "报销流程:先填单后审批..."]
for i, d in enumerate(docs):
col.add(ids=[str(i)], documents=[d], embeddings=[embed(d)])
# 2) 检索 + 生成
q = "年假怎么算?"
hits = col.query(query_embeddings=[embed(q)], n_results=2)["documents"][0]
ctx = "\n".join(hits)
print(local_chat(f"根据以下资料回答问题:\n{ctx}\n\n问题:{q}"))
nomic-embed-text(先 ollama pull nomic-embed-text)。RAG 效果 80% 取决于"切片质量"——按语义而不是按固定字数切,检索命中率会高很多。企业把这一步做好,本地 Agent 的准确率能从"听个乐"提升到可用水平。Step 4:把本地模型接成 Agent(工具调用)
模型本身只会"说话",Agent 的价值在于"能调用工具"。下面用 Ollama 的 tool-calling 能力写一个最小循环:模型决定调哪个函数,代码执行后把结果喂回去。
tools = [{
"type": "function",
"function": {
"name": "get_weather",
"description": "查询某城市天气",
"parameters": {"type": "object",
"properties": {"city": {"type": "string"}},
"required": ["city"]}
}
}]
def get_weather(city):
return f"{city} 今天 26°C,多云"
# 最小 Agent 循环
messages = [{"role": "user", "content": "北京天气怎么样?"}]
while True:
resp = call_ollama_with_tools(messages, tools) # 封装 /api/chat + tools
if resp.get("tool_calls"):
for call in resp["tool_calls"]:
fn = call["function"]
result = get_weather(fn["arguments"]["city"])
messages.append({"role": "tool", "content": result})
else:
print(resp["content"]); break
Step 5:性能与显存优化
本地部署最常见的坑是"显存爆了"或"卡得像 PPT"。几个立刻见效的优化:
# 1) 用量化版省显存(q4_K_M 是 7B 的甜点)
ollama pull qwen2.5:7b-q4_K_M
# 2) 限制并发上下文,避免多轮对话撑爆内存
ollama run qwen2.5:7b-q4_K_M --num_ctx 4096
# 3) 没有独显?用 CPU 卸载(慢但能跑)
# 在 Modelfile 里设置,或运行时加环境变量
OLLAMA_NUM_PARALLEL=1 OLLAMA_MAX_LOADED_MODELS=1 ollama serve
六、离线 Agent 的边界与注意事项
本地部署不是银弹,踩坑前先建立正确预期:
能力边界:7B/14B 本地模型在"写代码、总结、翻译、简单推理"上完全够用,但在"多步复杂规划、长链逻辑推理、精确数学"上明显弱于云端旗舰。把高难度任务留给云端,本地只做隐私敏感型任务,是最务实的分工。
- 版本固定是双刃剑:本地模型不会"半夜偷偷升级变笨",但也不会自动变强,需要你主动拉新版本。
- 安全仍需重视:本地 Agent 调用文件/网络工具时,权限隔离、输入净化同样不能省(参见本中心《AI Agent 安全加固实战》)。
- 备份模型文件:拉取的模型在
~/.ollama/models,重装系统前记得备份,重新下载很耗时。