跳转至

Ollama 高级用法

一句话概述:Ollama 是本地运行大语言模型的首选工具,但大多数用户只停留在 ollama run 的基础使用层面。

核心知识点速查表

知识点说明
为什么要学 Ollama 高级用法见对应章节
核心概念见对应章节
安装配置见对应章节
快速上手见对应章节
进阶用法见对应章节
常见问题见对应章节
参考资源见对应章节

为什么要学 Ollama 高级用法

Ollama 是本地运行大语言模型的首选工具,但大多数用户只停留在 ollama run 的基础使用层面。掌握高级用法意味着你能够自定义模型参数、构建 Modelfile、管理多模型并发服务、优化显存占用、集成 API 到自有应用,以及通过量化和上下文窗口调优实现更好的推理效果。对于需要在本地环境中部署 AI 服务的开发者和研究人员来说,这些能力是不可或缺的。


核心概念

Ollama 高级用法围绕几个关键机制展开:

概念白话解释用途
Modelfile类似 Dockerfile 的模型定义文件自定义模型参数、系统提示词、模板
量化级别模型精度压缩(Q4_0/Q5_K_M/Q8_0等)在显存和质量之间找平衡
上下文窗口模型单次能处理的 token 数量控制对话长度与显存消耗
并发调度同时运行多个模型或多个请求多用户/多应用共享本地 GPU
REST APIOllama 内置的 HTTP 接口将模型集成到任意应用
GPU Layers模型层在 GPU 上加载的数量精细控制显存使用
Keep Alive模型在内存中保持的时间平衡响应速度和资源释放

安装配置

基础安装

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

# macOS
brew install ollama

# Windows
# 从 https://ollama.com/download 下载安装包

高级配置

# 设置环境变量(Linux/macOS)
export OLLAMA_HOST=0.0.0.0:11434          # 监听所有接口
export OLLAMA_MODELS=/data/ollama/models   # 自定义模型存储路径
export OLLAMA_NUM_PARALLEL=4              # 并行请求数
export OLLAMA_MAX_LOADED_MODELS=3         # 同时加载的模型数
export OLLAMA_KEEP_ALIVE=10m              # 模型保持加载时间
export OLLAMA_GPU_OVERHEAD=256m           # GPU 预留显存

# systemd 服务配置
sudo systemctl edit ollama.service
# 在 [Service] 下添加 Environment 行

GPU 配置

# 查看 GPU 状态
nvidia-smi

# 指定 GPU 设备
export CUDA_VISIBLE_DEVICES=0,1

# 限制显存使用(通过 num_gpu 参数在 Modelfile 中设定)

快速上手

自定义 Modelfile

# 文件名:Modelfile-coder
FROM codellama:13b

# 设置参数
PARAMETER temperature 0.2
PARAMETER top_p 0.9
PARAMETER top_k 40
PARAMETER num_ctx 8192
PARAMETER repeat_penalty 1.1
PARAMETER num_gpu 35

# 系统提示词
SYSTEM """
你是一个专业的代码助手。回答要简洁精确,直接给出代码实现。
使用中文注释,遵循最佳实践。
"""

# 对话模板
TEMPLATE """
{{ if .System }}<|system|>
{{ .System }}<|end|>
{{ end }}{{ if .Prompt }}<|user|>
{{ .Prompt }}<|end|>
{{ end }}<|assistant|>
{{ .Response }}<|end|>
"""
# 创建自定义模型
ollama create my-coder -f Modelfile-coder

# 运行
ollama run my-coder

API 调用

# 生成(流式)
curl http://localhost:11434/api/generate -d '{
  "model": "llama3",
  "prompt": "解释 Python 装饰器",
  "stream": true
}'

# 聊天
curl http://localhost:11434/api/chat -d '{
  "model": "llama3",
  "messages": [
    {"role": "system", "content": "你是技术助手"},
    {"role": "user", "content": "什么是 Docker?"}
  ]
}'

# 嵌入向量
curl http://localhost:11434/api/embeddings -d '{
  "model": "nomic-embed-text",
  "prompt": "Ollama is a tool for running LLMs locally"
}'

Python 集成

import ollama

# 基础调用
response = ollama.chat(
    model='llama3',
    messages=[{'role': 'user', 'content': '你好'}]
)
print(response['message']['content'])

# 流式输出
for chunk in ollama.chat(
    model='llama3',
    messages=[{'role': 'user', 'content': '写一首诗'}],
    stream=True
):
    print(chunk['message']['content'], end='', flush=True)

# 带选项的调用
response = ollama.generate(
    model='llama3',
    prompt='解释量子计算',
    options={
        'temperature': 0.7,
        'num_ctx': 4096,
        'num_predict': 500,
    }
)

进阶用法

多模型管理策略

# 查看已加载模型
ollama ps

# 预加载模型(不生成内容)
curl http://localhost:11434/api/generate -d '{"model": "llama3", "keep_alive": "30m"}'

# 卸载模型
curl http://localhost:11434/api/generate -d '{"model": "llama3", "keep_alive": "0"}'

# 批量拉取模型脚本
models=("llama3" "codellama" "nomic-embed-text" "llava")
for model in "${models[@]}"; do
  ollama pull "$model"
done

显存优化

# Modelfile 中精细控制
FROM llama3:70b-q4_0
PARAMETER num_gpu 40        # 只加载 40 层到 GPU
PARAMETER num_ctx 2048      # 减少上下文窗口节省显存
PARAMETER num_batch 128     # 批处理大小
# 监控显存使用
watch -n 1 nvidia-smi

# 多 GPU 分配(通过环境变量)
CUDA_VISIBLE_DEVICES=0 ollama serve &
# 另一个实例使用不同端口和 GPU
OLLAMA_HOST=0.0.0.0:11435 CUDA_VISIBLE_DEVICES=1 ollama serve &

模型导入与转换

# 从 GGUF 文件导入
# Modelfile-custom
FROM ./my-model-q5_k_m.gguf
PARAMETER num_ctx 4096
SYSTEM "You are a helpful assistant."

ollama create my-model -f Modelfile-custom

# 从 SafeTensors 导入(需要转换)
# 先用 llama.cpp 的 convert 工具转为 GGUF
python convert_hf_to_gguf.py ./model-dir --outfile model.gguf --outtype q5_k_m

Nginx 反向代理配置

upstream ollama {
    server 127.0.0.1:11434;
}

server {
    listen 443 ssl;
    server_name ai.example.com;

    ssl_certificate /etc/ssl/certs/ai.pem;
    ssl_certificate_key /etc/ssl/private/ai.key;

    location / {
        proxy_pass http://ollama;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_read_timeout 300s;
        proxy_buffering off;  # 重要:流式响应需要关闭缓冲
    }
}

与 OpenAI 兼容的客户端使用

from openai import OpenAI

client = OpenAI(
    base_url="http://localhost:11434/v1",
    api_key="ollama"  # 任意字符串即可
)

response = client.chat.completions.create(
    model="llama3",
    messages=[{"role": "user", "content": "Hello"}],
    temperature=0.7,
)
print(response.choices[0].message.content)

常见问题

Q: 模型加载时显存不足怎么办?

使用更低的量化级别(如 Q4_0 代替 Q8_0),减小 num_ctx,或通过 num_gpu 参数只将部分层加载到 GPU:

PARAMETER num_gpu 20   # 只将 20 层放在 GPU 上,其余用 CPU
PARAMETER num_ctx 2048 # 缩小上下文窗口

Q: 如何让 Ollama 在后台持续运行?

# Linux systemd
sudo systemctl enable ollama
sudo systemctl start ollama

# macOS launchd(brew 安装自动配置)
brew services start ollama

# 手动后台运行
nohup ollama serve > /var/log/ollama.log 2>&1 &

Q: 多个应用同时请求时响应很慢?

调整并行参数:

export OLLAMA_NUM_PARALLEL=4        # 允许 4 个并行请求
export OLLAMA_MAX_LOADED_MODELS=2   # 同时保持 2 个模型

Q: 如何查看模型实际使用了多少显存?

ollama ps  # 显示已加载模型及其大小
nvidia-smi # 查看 GPU 实际占用

Q: Ollama 支持 Function Calling 吗?

从 0.3.0 版本开始支持工具调用(Tool Calling),通过 API 的 tools 参数传入:

response = ollama.chat(
    model='llama3.1',
    messages=[{'role': 'user', 'content': '北京今天天气如何?'}],
    tools=[{
        'type': 'function',
        'function': {
            'name': 'get_weather',
            'description': '获取城市天气',
            'parameters': {
                'type': 'object',
                'properties': {
                    'city': {'type': 'string', 'description': '城市名'}
                },
                'required': ['city']
            }
        }
    }]
)

参考资源

  • 官方文档:https://github.com/ollama/ollama/blob/main/docs/
  • Modelfile 参考:https://github.com/ollama/ollama/blob/main/docs/modelfile.md
  • API 文档:https://github.com/ollama/ollama/blob/main/docs/api.md
  • 模型库:https://ollama.com/library
  • Python SDK:https://github.com/ollama/ollama-python
  • JavaScript SDK:https://github.com/ollama/ollama-js
  • 社区讨论:https://discord.gg/ollama