本地跑大模型越来越方便了,Ollama把模型部署的复杂度降到了和Docker拉镜像差不多的水平。装好就能用,还有REST API可以集成到自己的应用里。
安装
Ollama的安装极其简单。
macOS / Linux一键安装:
curl -fsSL https://ollama.com/install.sh | sh
装完后Ollama会作为后台服务运行,默认监听localhost:11434。
Windows直接下载安装包,双击安装。
验证安装:
ollama --version
# ollama version is 0.1.xx
拉取和运行模型
和Docker Hub类似,Ollama有自己的模型仓库:
# 拉取模型
ollama pull llama2 # Meta的Llama 2(7B)
ollama pull codellama # 代码专用模型
ollama pull qwen:7b # 通义千问7B
ollama pull mistral # Mistral 7B
ollama pull llama2:13b # 指定参数量
# 查看已下载的模型
ollama list
# 删除模型
ollama rm llama2
模型文件存储在~/.ollama/models目录下。7B模型大约需要4-8GB空间(取决于量化级别)。
命令行对话
最简单的用法,直接在终端对话:
# 启动对话
ollama run llama2
# 指定模型对话
ollama run codellama
# 带系统提示词
ollama run llama2 --system "你是一个Python编程助手,用中文回答"
进入对话模式后直接输入文字就能交互。输入/bye退出。
>>> 用Python写一个快速排序
Sure! Here's a quicksort implementation in Python:
def quicksort(arr):
if len(arr) <= 1:
return arr
pivot = arr[len(arr) // 2]
left = [x for x in arr if x < pivot]
middle = [x for x in arr if x == pivot]
right = [x for x in arr if x > pivot]
return quicksort(left) + middle + quicksort(right)
codellama在代码任务上表现不错,日常写写脚本够用了。
REST API调用
Ollama提供HTTP API,可以集成到任何应用中。
curl示例:
# 生成(非流式)
curl http://localhost:11434/api/generate -d '{
"model": "llama2",
"prompt": "什么是快速排序?用中文简要说明。",
"stream": false
}'
# 对话模式(带上下文)
curl http://localhost:11434/api/chat -d '{
"model": "qwen:7b",
"messages": [
{"role": "system", "content": "你是一个编程助手"},
{"role": "user", "content": "Python的GIL是什么?"}
],
"stream": false
}'
Python调用:
import requests
import json
def chat(model, messages, stream=False):
"""调用Ollama API"""
url = "http://localhost:11434/api/chat"
payload = {
"model": model,
"messages": messages,
"stream": stream
}
if stream:
# 流式输出
response = requests.post(url, json=payload, stream=True)
for line in response.iter_lines():
if line:
data = json.loads(line)
if not data.get("done"):
print(data["message"]["content"], end="", flush=True)
print()
else:
response = requests.post(url, json=payload)
result = response.json()
return result["message"]["content"]
# 使用
messages = [
{"role": "system", "content": "你是一个Python专家"},
{"role": "user", "content": "解释一下Python的装饰器"}
]
# 非流式
answer = chat("qwen:7b", messages)
print(answer)
# 流式(逐字输出)
chat("qwen:7b", messages, stream=True)
流式输出体验好很多,尤其是模型较大、推理较慢的时候,用户不用干等着。
API参数控制:
payload = {
"model": "llama2",
"messages": messages,
"stream": False,
"options": {
"temperature": 0.7, # 创造性,0-1
"top_p": 0.9, # 核采样
"num_predict": 512, # 最大生成token数
"num_ctx": 4096, # 上下文窗口
}
}
自定义Modelfile
Modelfile类似Dockerfile,可以基于现有模型自定义:
# 文件名:Modelfile
FROM llama2
# 设置系统提示词
SYSTEM """
你是一个资深的代码审查专家。你的职责是:
1. 找出代码中的bug和潜在问题
2. 提出改进建议
3. 用中文回答
回答要简洁有条理。
"""
# 调整参数
PARAMETER temperature 0.3
PARAMETER num_ctx 4096
PARAMETER top_p 0.9
构建和使用:
# 从Modelfile构建自定义模型
ollama create code-reviewer -f Modelfile
# 使用自定义模型
ollama run code-reviewer
# 也可以通过API调用
curl http://localhost:11434/api/generate -d '{
"model": "code-reviewer",
"prompt": "审查这段代码:
def login(user, pwd):
if pwd == "admin123":
return True
return check_db(user, pwd)",
"stream": false
}'
Modelfile还支持TEMPLATE指令自定义提示词模板、ADAPTER加载LoRA权重等进阶用法。
硬件需求和性能
实际体验:
- 7B模型:8GB内存就能跑,16GB比较舒服。推理速度在M1 Mac上大概10-20 token/s
- 13B模型:至少16GB内存,推理速度约5-10 token/s
- NVIDIA GPU:有GPU的话Ollama会自动使用CUDA加速,速度提升3-5倍
- 量化:默认下载的模型都是4-bit量化版,平衡了大小和质量
总结
Ollama的出现大大降低了本地大模型的使用门槛。安装、拉模型、对话、API调用,全流程都很顺畅。配合Modelfile自定义,可以快速搭建各种特定场景的AI助手。对于不想把数据发到云端的场景(公司内部代码、隐私数据),本地模型是个很好的选择。