Ollama本地大模型:一键部署与API调用

本地跑大模型越来越方便了,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助手。对于不想把数据发到云端的场景(公司内部代码、隐私数据),本地模型是个很好的选择。