第二章:Ollama深度实战——模型拉取与运行、Modelfile定制、REST API调用、多模型管理

聊到本地大模型部署,Ollama 绝对是个绕不开的工具。我最早接触它的时候,还在用笨办法手动编译 llama.cpp,折腾一整天才能跑起来一个模型。后来发现 Ollama,说实话,有种「相见恨晚」的感觉。它把模型管理、运行、API 调用全封装好了,你只需要几条命令就能把大模型跑起来。

这一章,我会带你深入 Ollama 的实战操作。不是那种「hello world」级别的演示,而是真正能在项目里用起来的技巧。

2.1 模型拉取与运行:从零到一

先说说最基础的操作——拉取模型。Ollama 的模型仓库里现在有上千个模型,从 7B 到 70B 都有。我个人习惯用 ollama pull 而不是 ollama run 来下载,因为前者只下载不运行,方便我提前准备好模型。

# 拉取一个 7B 模型
ollama pull llama3.2:1b

# 拉取中文优化版
ollama pull qwen2.5:7b

# 查看已下载的模型
ollama list

你可能会问:「为什么推荐先 pull 再 run?」我在项目里遇到过这种情况:直接 ollama run 时网络突然断了,模型下载到一半,下次还得重来。先 pull 的话,下载完再运行,心里踏实。

运行模型就更简单了:

ollama run llama3.2:1b

进入交互模式后,你可以直接跟模型对话。不过说实话,命令行交互只适合测试。真正要用在应用里,得走 REST API。

小技巧: 如果你在服务器上跑模型,建议加上 --keepalive 参数。比如 ollama run llama3.2:1b --keepalive 30m,这样模型会在内存里驻留 30 分钟,避免频繁加载。

2.2 Modelfile 定制:打造专属模型

Ollama 最强大的功能之一,就是 Modelfile。你可以把它理解成 Dockerfile,但针对的是大模型。通过 Modelfile,你能调整模型的温度、上下文长度、系统提示词,甚至合并多个模型。

先看一个最简单的例子:

# 基础模型
FROM llama3.2:1b

# 设置系统提示词
SYSTEM """你是一个资深 Python 开发工程师。
请用简洁、专业的方式回答问题。
优先给出代码示例。"""

# 调整参数
PARAMETER temperature 0.3
PARAMETER top_p 0.9
PARAMETER num_ctx 4096

保存为 MyPythonExpert.Modelfile,然后构建:

ollama create my-python-expert -f MyPythonExpert.Modelfile

运行试试:

ollama run my-python-expert

嗯,这里要注意:temperature 值设得太低(比如 0.1),模型回答会非常保守,几乎每次都一样。设得太高(比如 1.5),回答可能跑偏。我一般做代码生成用 0.3,做创意写作用 0.8。

核心参数速查表:
参数 作用 推荐值
temperature 控制随机性 0.3-0.8
top_p 核采样阈值 0.9
num_ctx 上下文窗口大小 2048-8192
repeat_penalty 重复惩罚 1.1

Modelfile 还能做更高级的事情,比如合并模型。我曾经把 CodeLlama 和 Llama-Chinese 合并,做出一个既懂代码又懂中文的模型。做法很简单:

FROM llama3.2:1b
ADAPTER code-llama-lora.gguf
PARAMETER num_ctx 4096

不过说实话,模型合并是个坑。我踩过最大的坑是参数不兼容——两个模型的 embedding 维度不一样,直接合并会报错。建议你先用 ollama show 查看模型详情,确认兼容性。

2.3 REST API 调用:让模型为应用服务

命令行交互终究是玩具。真正要把大模型集成到应用里,得用 REST API。Ollama 默认在 http://localhost:11434 启动 API 服务。

先测试一下服务是否正常:

curl http://localhost:11434/api/tags

返回 JSON 格式的模型列表,说明服务跑起来了。

接下来是最常用的聊天接口:

curl http://localhost:11434/api/chat \
  -d '{
    "model": "llama3.2:1b",
    "messages": [
      {"role": "user", "content": "用 Python 写一个快速排序"}
    ],
    "stream": false
  }'

注意 stream: false 这个参数。默认情况下,Ollama 会流式返回结果,也就是一个字一个字地吐出来。如果你在做 Web 应用,流式响应能提升用户体验。但如果是后端批处理,建议关掉流式,一次性拿到完整结果。

用 Python 调用就更方便了:

import requests
import json

url = "http://localhost:11434/api/chat"
payload = {
    "model": "llama3.2:1b",
    "messages": [
        {"role": "user", "content": "解释一下什么是 Transformer"}
    ],
    "stream": False
}

response = requests.post(url, json=payload)
result = response.json()
print(result["message"]["content"])
避坑指南: 我曾经在生产环境遇到过 API 超时问题。默认情况下,Ollama 的请求没有超时限制。如果你的模型比较大(比如 70B),生成速度慢,前端请求可能会挂起。建议在代码里设置超时:requests.post(url, json=payload, timeout=60)

除了聊天,还有几个常用 API:

  • /api/generate:纯文本生成,不保留对话历史
  • /api/embeddings:获取文本向量,用于 RAG 场景
  • /api/copy:复制模型,方便做版本管理

2.4 多模型管理:像 Docker 一样管理模型

项目做大了,你手头可能会有十几个模型。怎么管理?Ollama 提供了一套完整的模型管理命令。

先看看我常用的工作流:

# 查看所有模型
ollama list

# 查看模型详细信息
ollama show llama3.2:1b

# 复制模型(用于备份或改名)
ollama cp llama3.2:1b my-backup-llama

# 删除模型
ollama rm my-backup-llama

你可能会问:「为什么要复制模型?」我在做模型调优时,经常需要对比不同参数的效果。比如我调了一个 temperature=0.3 的版本,又调了一个 temperature=0.7 的版本。复制一份出来,分别修改 Modelfile,就能同时跑两个版本对比。

多模型同时运行也是可以的。Ollama 支持并行加载多个模型,只要你的显存够大。比如:

# 终端1:运行小模型做简单问答
ollama run llama3.2:1b

# 终端2:运行大模型做复杂推理
ollama run qwen2.5:7b

不过要注意显存分配。我试过同时跑 7B 和 13B 两个模型,显存直接爆了。建议用 nvidia-smi 实时监控显存使用情况。

管理技巧: 给模型命名时,建议用「项目名-模型名-版本号」的格式。比如 chatbot-llama3.2-v1。这样时间久了也不会乱。

2.5 本章知识体系

说了这么多,我用一张图把本章的核心逻辑串起来:

Ollama 核心功能 模型拉取与运行 Modelfile 定制 REST API 调用 多模型管理 ollama pull ollama run --keepalive FROM / SYSTEM PARAMETER ADAPTER 合并 /api/chat /api/generate /api/embeddings ollama list ollama cp/rm

这张图把本章的四个核心模块串起来了。从上往下看,模型拉取是基础,Modelfile 定制是进阶,REST API 是应用落地,多模型管理是工程化必备。每个模块之间都有联系,比如你通过 Modelfile 定制了一个模型,然后通过 REST API 对外提供服务,最后用多模型管理来维护不同版本。

说实话,Ollama 的设计理念很符合工程实践——简单、可组合、可扩展。你不需要成为底层算法专家,也能把大模型用起来。但要注意,工具只是起点,真正有价值的是你如何用它解决实际问题。

好了,这一章的内容就到这里。记住:多动手,多踩坑,经验都是试出来的。


专注资料整理