Ollama 高级用法¶
为什么要学 Ollama 高级用法¶
Ollama 是本地运行大语言模型的首选工具,但大多数用户只停留在 ollama run 的基础使用层面。掌握高级用法意味着你能够自定义模型参数、构建 Modelfile、管理多模型并发服务、优化显存占用、集成 API 到自有应用,以及通过量化和上下文窗口调优实现更好的推理效果。对于需要在本地环境中部署 AI 服务的开发者和研究人员来说,这些能力是不可或缺的。
核心概念¶
Ollama 高级用法围绕几个关键机制展开:
| 概念 | 白话解释 | 用途 |
|---|---|---|
| Modelfile | 类似 Dockerfile 的模型定义文件 | 自定义模型参数、系统提示词、模板 |
| 量化级别 | 模型精度压缩(Q4_0/Q5_K_M/Q8_0等) | 在显存和质量之间找平衡 |
| 上下文窗口 | 模型单次能处理的 token 数量 | 控制对话长度与显存消耗 |
| 并发调度 | 同时运行多个模型或多个请求 | 多用户/多应用共享本地 GPU |
| REST API | Ollama 内置的 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|>
"""
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:
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: 多个应用同时请求时响应很慢?¶
调整并行参数:
Q: 如何查看模型实际使用了多少显存?¶
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