跳转至

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