Ollama本地大模型运行指南

Ollama本地大模型运行指南

概述与背景

Ollama是一个开源工具,让你能够在本地计算机上运行大语言模型(LLM)。无需云端API,无需网络连接,完全离线使用。对于隐私保护、成本控制或开发测试场景,Ollama提供了理想的解决方案。

graph TB
    subgraph Ollama架構
        A[用戶請求] --> B[Ollama服務]
        B --> C{模型選擇}
        C --> D[Llama 3.2]
        C --> E[Qwen2.5]
        C --> F[Mistral]
        C --> G[自定義模型]
        
        D --> H[GPU加速<br/>NVIDIA/AMD/Metal]
        E --> H
        F --> H
        G --> H
        
        H --> I[本地推理]
        I --> J[返回結果]
        J --> A
    end

    style A fill:#e1f5fe
    style B fill:#fff3e0
    style C fill:#f3e5f5
    style H fill:#ffcdd2
    style I fill:#c8e6c9
    style J fill:#c8e6c9
graph LR
    subgraph Ollama vs 雲端API對比
        A[本地 Ollama] --> A1[免費使用]
        A --> A2[數據不出本地]
        A --> A3[完全離線]
        A --> A4[100+開源模型]
        
        B[OpenAI API] --> B1[按量計費]
        B --> B2[數據上傳雲端]
        B --> B3[需聯網使用]
        B --> B4[GPT系列模型]
        
        C[Claude API] --> C1[按量計費]
        C --> C2[數據上傳雲端]
        C --> C3[需聯網使用]
        C --> C4[Claude系列模型]
    end

    style A fill:#c8e6c9
    style B fill:#fff9c4
    style C fill:#fff9c4

为什么选择Ollama?

对比维度OllamaOpenAI APIClaude API
成本免费$0.03-0.06/1K tokens$0.003-0.015/1K tokens
隐私数据不出本地数据上传云端数据上传云端
离线使用✅ 完全支持❌ 需联网❌ 需联网
模型选择开源模型GPT系列Claude系列
自定义✅ 完全可控❌ 受限❌ 受限

核心优势

  • 完全离线:无需网络即可使用
  • 隐私保护:数据不出本地,适合处理敏感信息
  • 免费使用:无API费用,无使用次数限制
  • 模型丰富:支持Llama、Qwen、Mistral、DeepSeek等100+模型
  • 易于集成:提供RESTful API接口,支持Python/JS/Go等SDK
  • 硬件加速:支持NVIDIA/AMD GPU和Apple Metal

本指南将帮助你从零开始,在本地运行和调用大语言模型,覆盖安装、使用、API集成、自定义模型、性能优化等完整流程。


实战步骤

graph TD
    A[開始部署] --> B[安裝Ollama]
    B --> C{操作系統?}
    C -->|Linux| D[一鍵安裝腳本]
    C -->|macOS| E[Homebrew安裝]
    C -->|Windows| F[安裝包下載]
    
    D --> G[啟動服務]
    E --> G
    F --> G
    
    G --> H[拉取模型]
    H --> I{模型類型?}
    I -->|通用對話| J[llama3.2]
    I -->|中文優化| K[qwen2.5]
    I -->|代碼生成| L[codellama]
    
    J --> M[運行測試]
    K --> M
    L --> M
    
    M --> N[API集成]
    N --> O[應用開發]

    style A fill:#fff9c4
    style C fill:#e1f5fe
    style I fill:#e1f5fe
    style O fill:#c8e6c9
sequenceDiagram
    participant U as 用戶
    participant O as Ollama CLI
    participant S as Ollama Server
    participant M as 本地模型

    Note over U,M: 模型拉取流程
    U->>O: ollama pull llama3.2
    O->>S: 請求下載模型
    S->>S: 從Registry下載層
    S->>S: 驗證模型完整性
    S-->>O: 下載完成
    O-->>U: 模型就緒

    Note over U,M: 推理調用流程
    U->>O: ollama run llama3.2
    O->>S: 加載模型到內存
    S->>M: 初始化推理引擎
    U->>O: 輸入提示
    O->>S: 發送推理請求
    S->>M: 執行推理
    M-->>S: 生成結果
    S-->>O: 返回回應
    O-->>U: 顯示結果

第一步:安装Ollama

1.1 Linux安装

# 一键安装(推荐)
curl -fsSL https://ollama.ai/install.sh | sh

# 或手动安装
curl -L https://ollama.ai/download/ollama-linux-amd64 -o /usr/local/bin/ollama
chmod +x /usr/local/bin/ollama

# 启动服务
ollama serve

# 验证安装
ollama --version

Linux系统要求

  • Ubuntu 22.04+ / Debian 12+ / CentOS 8+
  • 内存:至少8GB(推荐16GB+)
  • 存储:20GB+(模型占用空间较大)

1.2 macOS安装

# 使用Homebrew
brew install ollama

# 或下载安装包
# https://ollama.ai/download/Ollama-darwin.zip

# 启动应用(首次需在Applications中打开)
open -a Ollama

macOS系统要求

  • macOS 11 Big Sur或更高版本
  • Apple Silicon(M1/M2/M3)或Intel Mac
  • 内存:8GB+

1.3 Windows安装

下载安装包:https://ollama.ai/download

Windows系统要求

  • Windows 10 64位或更高版本
  • 内存:8GB+
  • 如需GPU加速,需要NVIDIA显卡并安装最新驱动

1.4 Docker安装

# CPU版本
docker run -d \
  -v ollama:/root/.ollama \
  -p 11434:11434 \
  --name ollama \
  ollama/ollama

# GPU版本(NVIDIA)
docker run -d \
  --gpus=all \
  -v ollama:/root/.ollama \
  -p 11434:11434 \
  --name ollama \
  ollama/ollama

# AMD GPU版本
docker run -d \
  --device /dev/kfd \
  --device /dev/dri \
  -v ollama:/root/.ollama \
  -p 11434:11434 \
  --name ollama \
  ollama/ollama:rocm

Docker安装优势

  • 环境隔离,不影响系统
  • 易于版本管理
  • 方便迁移和备份

第二步:运行第一个模型

2.1 基本使用

# 拉取并运行模型(首次会自动下载)
ollama run llama3.2

# 拉取指定参数版本
ollama run llama3.2:1b    # 1.2GB,适合入门
ollama run llama3.2:3b    # 2GB,性能均衡

# 常用开源模型
ollama run qwen2.5:7b           # 阿里Qwen,中文友好
ollama run codellama:7b         # Meta代码模型
ollama run mistral:7b           # Mistral AI
ollama run deepseek-coder:6.7b  # DeepSeek代码模型
ollama run gemma2:9b            # Google Gemma
ollama run phi3:mini            # 微信Phi-3,轻量级

2.2 模型版本说明

模型标签格式:模型名:参数量-量化级别

# 示例
llama3.2:1b      # 1B参数版本
llama3.2:3b      # 3B参数版本
llama3.2:latest  # 最新版本(默认)

# 量化版本(节省显存)
llama3.2:3b-q4_0  # 4位量化
llama3.2:3b-q8_0  # 8位量化(精度更高)

2.3 模型管理命令

# 查看已安装模型
ollama list
# 输出示例:
# NAME               ID              SIZE    MODIFIED
# llama3.2:latest    a80c4f17e551    2.0 GB  2 hours ago
# qwen2.5:7b         2a8d8f1c3b45    4.7 GB  1 day ago

# 查看模型详情
ollama show llama3.2
# 输出包含:架构、参数量、量化方式、系统提示等

# 删除模型
ollama rm llama3.2

# 拉取但不运行(用于预下载)
ollama pull llama3.2

# 更新模型到最新版本
ollama pull llama3.2

# 推送自定义模型到仓库
ollama push my-model

第三步:交互使用

3.1 命令行对话

$ ollama run llama3.2

>>> 你好,请介绍一下你自己
我是Llama,一个由Meta开发的大型语言模型...

>>> 如何学习编程?
学习编程可以从以下几个步骤开始...

>>> /help
Available commands:
  /set <parameter> <value>  Set parameters
  /show <property>          Show model information
  /load <model>             Load a model
  /save <model>             Save current model
  /bye                      Exit

>>> /set temperature 0.7
Set parameter 'temperature' to 0.7

>>> /bye
Goodbye!

3.2 常用参数设置

# 方式1:命令行参数
ollama run llama3.2 --temperature 0.7 --top-p 0.9

# 方式2:交互中设置
>>> /set temperature 0.7
>>> /set top_p 0.9
>>> /set num_ctx 4096

参数说明

参数范围默认值说明
temperature0-20.7创造性控制,越高越随机
top_p0-10.9核采样,控制词汇选择范围
top_k1-10040保留候选词数量
num_ctx512-1280002048上下文窗口大小
num_predict-1-∞-1最大生成token数(-1为无限)
stop字符串数组[]停止词

3.3 多轮对话示例

>>> 我想学习Python
Python是一门很好的入门语言!你想从哪个方面开始学习?

>>> 数据分析方向
Python数据分析主要使用以下库:
1. NumPy - 数值计算
2. Pandas - 数据处理
3. Matplotlib - 数据可视化
4. Scikit-learn - 机器学习

>>> 给我推荐一个学习路线
好的,我推荐以下学习路线:
第一周:Python基础语法
第二周:NumPy数组操作
第三周:Pandas数据处理
...

第四步:API调用

4.1 RESTful API基础

Ollama默认在 http://localhost:11434 提供API服务。

生成文本接口

curl http://localhost:11434/api/generate -d '{
  "model": "llama3.2",
  "prompt": "为什么天空是蓝色的?",
  "stream": false
}'

# 响应示例
{
  "model": "llama3.2",
  "created_at": "2024-01-15T10:30:00Z",
  "response": "天空呈现蓝色是因为瑞利散射...",
  "done": true,
  "total_duration": 1234567890,
  "load_duration": 12345678,
  "prompt_eval_duration": 123456789,
  "eval_duration": 987654321,
  "eval_count": 150
}

聊天接口

curl http://localhost:11434/api/chat -d '{
  "model": "llama3.2",
  "messages": [
    {"role": "system", "content": "你是一个专业的科学顾问"},
    {"role": "user", "content": "解释一下量子计算"}
  ],
  "stream": false
}'

# 响应示例
{
  "model": "llama3.2",
  "created_at": "2024-01-15T10:30:00Z",
  "message": {
    "role": "assistant",
    "content": "量子计算是一种利用量子力学原理..."
  },
  "done": true
}

流式输出

curl http://localhost:11434/api/chat -d '{
  "model": "llama3.2",
  "messages": [{"role": "user", "content": "讲个故事"}],
  "stream": true
}'

# 响应是多个JSON行
{"model":"llama3.2","created_at":"...","message":{"role":"assistant","content":""}}
{"model":"llama3.2","created_at":"...","message":{"role":"assistant","content":""}}
{"model":"llama3.2","created_at":"...","message":{"role":"assistant","content":""}}
...
{"model":"llama3.2","done":true}

4.2 Python集成

使用requests库

import requests
import json

def chat(message, model="llama3.2"):
    """基础聊天函数"""
    response = requests.post(
        "http://localhost:11434/api/chat",
        json={
            "model": model,
            "messages": [{"role": "user", "content": message}],
            "stream": False
        }
    )
    return response.json()["message"]["content"]

def chat_stream(message, model="llama3.2"):
    """流式聊天"""
    response = requests.post(
        "http://localhost:11434/api/chat",
        json={
            "model": model,
            "messages": [{"role": "user", "content": message}],
            "stream": True
        },
        stream=True
    )
    for line in response.iter_lines():
        if line:
            data = json.loads(line)
            if "message" in data:
                yield data["message"]["content"]

# 使用
result = chat("解释一下量子计算")
print(result)

# 流式输出
for chunk in chat_stream("讲个故事"):
    print(chunk, end="", flush=True)

使用ollama-python官方库

pip install ollama
import ollama

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

# 流式输出
for chunk in ollama.chat(
    model='llama3.2',
    messages=[{'role': 'user', 'content': '讲个故事'}],
    stream=True
):
    print(chunk['message']['content'], end='', flush=True)

# 生成嵌入向量
embedding = ollama.embeddings(
    model='nomic-embed-text',
    prompt='Hello world'
)
print(embedding['embedding'])  # 768维向量

# 多文本嵌入
embeddings = ollama.embed(
    model='nomic-embed-text',
    input=['Hello', 'World', '你好']
)
print(len(embeddings['embeddings']))  # 3

# 拉取模型
ollama.pull('llama3.2')

# 列出模型
models = ollama.list()
for m in models['models']:
    print(f"{m['name']}: {m['size'] / 1e9:.2f} GB")

4.3 JavaScript/TypeScript集成

npm install ollama
import ollama from 'ollama'

// 基础聊天
const response = await ollama.chat({
  model: 'llama3.2',
  messages: [{ role: 'user', content: '你好' }]
})
console.log(response.message.content)

// 流式输出
const stream = await ollama.chat({
  model: 'llama3.2',
  messages: [{ role: 'user', content: '讲个故事' }],
  stream: true
})
for await (const chunk of stream) {
  process.stdout.write(chunk.message.content)
}

// 生成嵌入
const embedding = await ollama.embeddings({
  model: 'nomic-embed-text',
  prompt: 'Hello world'
})
console.log(embedding.embedding.length)  // 768

4.4 其他语言SDK

Go

go get github.com/ollama/ollama-go

Java(使用OkHttp):

OkHttpClient client = new OkHttpClient();
String json = "{\"model\":\"llama3.2\",\"messages\":[{\"role\":\"user\",\"content\":\"你好\"}]}";
RequestBody body = RequestBody.create(json, MediaType.parse("application/json"));
Request request = new Request.Builder()
    .url("http://localhost:11434/api/chat")
    .post(body)
    .build();
Response response = client.newCall(request).execute();

第五步:自定义模型

5.1 Modelfile基础

Modelfile是Ollama自定义模型的核心配置文件。

基础结构

# 指定基础模型
FROM llama3.2

# 设置参数
PARAMETER temperature 0.7
PARAMETER top_p 0.9
PARAMETER num_ctx 4096

# 系统提示词(定义模型角色)
SYSTEM 你是一位专业的软件架构师,擅长解释复杂的技术概念。

# 提示词模板(可选)
TEMPLATE """
{{ .System }}

用户:{{ .Prompt }}
助手:
"""

# 停止词(可选)
PARAMETER stop "用户:"
PARAMETER stop "assistant:"

5.2 创建自定义模型

示例1:代码助手

# 保存为 Modelfile.code
FROM llama3.2

PARAMETER temperature 0.3
PARAMETER top_p 0.95
PARAMETER num_ctx 8192

SYSTEM 你是一个专业的编程助手,擅长多种编程语言。请用简洁的代码示例回答问题,并解释关键逻辑。

# 创建模型
ollama create code-assistant -f Modelfile.code

# 运行
ollama run code-assistant

示例2:中文翻译助手

# 保存为 Modelfile.translate
FROM qwen2.5:7b

PARAMETER temperature 0.3

SYSTEM 你是一个专业的翻译助手,精通中英互译。请保持原文风格,准确传达语义。对于专业术语,请提供原文和译文的对照。

# 创建
ollama create translator -f Modelfile.translate

示例3:文档摘要专家

# 保存为 Modelfile.summary
FROM llama3.2

PARAMETER temperature 0.2
PARAMETER num_ctx 16000

SYSTEM 你是一个文档摘要专家。请用以下格式总结内容:
1. 核心观点(一句话)
2. 关键要点(3-5条)
3. 重要数据(如有)
4. 建议行动(如适用)

# 创建
ollama create summarizer -f Modelfile.summary

5.3 查看和编辑模型

# 查看现有模型的Modelfile
ollama show llama3.2 --modelfile

# 导出现有模型
ollama show my-model --modelfile > Modelfile.export

# 基于现有模型修改
ollama create my-model-v2 -f Modelfile.export

5.4 多模态模型

# LLaVA - 视觉理解模型
ollama run llava

# 在API中使用图片
curl http://localhost:11434/api/chat -d '{
  "model": "llava",
  "messages": [
    {
      "role": "user",
      "content": "描述这张图片",
      "images": ["iVBORw0KGgoAAAANSUhEUgA..."]
    }
  ]
}'

# Python示例
import ollama
import base64

with open("image.jpg", "rb") as f:
    image_data = base64.b64encode(f.read()).decode()

response = ollama.chat(
    model='llava',
    messages=[{
        'role': 'user',
        'content': '描述这张图片',
        'images': [image_data]
    }]
)
print(response['message']['content'])

第六步:GPU加速

6.1 检查GPU支持

# 运行时查看GPU使用情况
ollama run llama3.2 --verbose

# 输出示例
# GPU 0: NVIDIA GeForce RTX 3080 (10GB)
#     VRAM used: 4.2 GB
#     Compute capability: 8.6

支持的GPU

  • NVIDIA:GTX 10系列及以上(需要CUDA 11+)
  • AMD:RX 6000系列及以上(ROCm支持)
  • Apple:M1/M2/M3系列(Metal支持)

6.2 GPU配置

NVIDIA GPU

# 安装NVIDIA Container Toolkit(Docker用户)
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg

# 指定使用的GPU
CUDA_VISIBLE_DEVICES=0 ollama run llama3.2

# 多GPU负载均衡
ollama run llama3.2 --gpu 0,1

# 查看GPU状态
nvidia-smi

Apple Silicon

# Metal自动启用,无需配置
# 查看Metal状态
OLLAMA_DEBUG=1 ollama run llama3.2

# 输出包含:
# Metal GPU: Apple M2 Pro
# Memory: 16GB unified

AMD GPU

# 使用ROCm版本
ollama run llama3.2 --gpu amd

# 或设置环境变量
HSA_OVERRIDE_GFX_VERSION=10.3.0 ollama run llama3.2

6.3 显存管理

# 限制显存使用
OLLAMA_MAX_VRAM=8GB ollama run llama3.2

# 强制使用CPU(避免显存不足)
OLLAMA_GPU_LAYERS=0 ollama run llama3.2

# 查看显存占用
nvidia-smi --query-gpu=memory.used,memory.total --format=csv

第七步:性能优化

7.1 模型量化

量化可以大幅减少模型大小和显存占用。

# 查看可用量化版本
ollama show llama3.2 --modelfile

# 常见量化级别对比
量化级别显存占用速度精度损失推荐场景
q4_0最小最快较大内存受限场景
q4_1中等日常使用
q5_0较小平衡场景
q8_0很小高精度需求
fp16最大最慢最高精度
# 使用量化版本
ollama run llama3.2:3b-q4_0  # 4位量化,更快
ollama run llama3.2:3b-q8_0  # 8位量化,更准

7.2 上下文长度优化

# 方式1:运行时设置
ollama run llama3.2 --num-ctx 8192

# 方式2:Modelfile设置
PARAMETER num_ctx 8192

# 方式3:API调用设置
curl http://localhost:11434/api/chat -d '{
  "model": "llama3.2",
  "messages": [...],
  "options": {
    "num_ctx": 8192
  }
}'

上下文长度与显存关系

上下文长度显存增量(7B模型)适用场景
2048(默认)基准短对话
4096+1GB中等长度文档
8192+2GB长文档处理
16384+4GB书籍摘要

7.3 批处理与并发

# 异步批处理
import asyncio
import ollama

async def chat_async(model, message):
    return await ollama.async_chat(
        model=model,
        messages=[{'role': 'user', 'content': message}]
    )

async def process_batch(prompts):
    tasks = [chat_async('llama3.2', p) for p in prompts]
    results = await asyncio.gather(*tasks)
    return results

# 使用
prompts = ["解释Python", "介绍Java", "什么是Rust"]
results = asyncio.run(process_batch(prompts))
for r in results:
    print(r['message']['content'])

并发限制

# 设置最大并发请求数
OLLAMA_MAX_QUEUE=10 ollama serve

# 默认值:5

7.4 预加载与缓存

# 预加载模型到内存
ollama run llama3.2 --keepalive 1h

# API中设置keepalive
curl http://localhost:11434/api/chat -d '{
  "model": "llama3.2",
  "messages": [...],
  "keep_alive": "10m"
}'

第八步:生产部署

8.1 服务配置

# 修改监听地址(允许外部访问)
OLLAMA_HOST=0.0.0.0:11434 ollama serve

# 设置模型存储路径
OLLAMA_MODELS=/data/ollama ollama serve

# 设置日志级别
OLLAMA_DEBUG=1 ollama serve

# systemd服务配置
sudo systemctl edit ollama.service
# 添加:
[Service]
Environment="OLLAMA_HOST=0.0.0.0:11434"
Environment="OLLAMA_MODELS=/data/ollama"

8.2 反向代理配置

Nginx配置

upstream ollama {
    server 127.0.0.1:11434;
    keepalive 64;
}

server {
    listen 80;
    server_name api.example.com;

    location /api/ollama/ {
        proxy_pass http://ollama/;
        proxy_http_version 1.1;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Connection "";
        
        # 流式响应支持
        proxy_buffering off;
        proxy_cache off;
        chunked_transfer_encoding on;
    }
}

8.3 安全配置

# 基础认证(API Key)
# 在应用层实现,Ollama本身不提供认证

# 示例:Nginx基础认证
sudo apt install apache2-utils
sudo htpasswd -c /etc/nginx/.htpasswd admin

# Nginx配置添加
auth_basic "Ollama API";
auth_basic_user_file /etc/nginx/.htpasswd;

8.4 监控与日志

# 查看服务状态
systemctl status ollama

# 查看日志
journalctl -u ollama -f

# Prometheus监控(需额外配置)
# Ollama不原生支持Prometheus,可通过API包装

推荐模型选择

按用途分类

用途推荐模型大小显存需求说明
通用对话llama3.2:3b2GB4GB性能均衡,响应快
qwen2.5:7b4.7GB8GB中文友好,质量高
mistral:7b4.1GB8GB多语言支持好
代码生成codellama:7b4GB8GBMeta官方代码模型
deepseek-coder:6.7b4GB8GB中文代码,质量高
starcoder2:7b4GB8GB多语言代码
轻量级phi3:mini2.3GB4GB微软,性价比高
gemma2:2b1.4GB3GBGoogle,速度快
嵌入向量nomic-embed-text274MB512MB高质量向量
mxbai-embed-large669MB1GB英文向量
视觉理解llava:7b4.7GB8GB图片描述
bakllava4.7GB8GB多模态

按硬件选择

硬件配置推荐模型说明
8GB内存,无GPUllama3.2:1b, phi3:mini小模型,纯CPU运行
16GB内存,无GPUllama3.2:3b, gemma2:2b中等模型,CPU可运行
RTX 3060 (12GB)qwen2.5:7b, codellama:7b可运行7B模型
RTX 3080/4080 (16GB)mixtral:8x7b-q4可运行MoE模型
Apple M2 Pro (16GB)llama3.2:7b, qwen2.5:7bMetal加速,效果好

常见问题解决

Q1: 内存不足怎么办?

# 方案1:使用更小的模型
ollama run llama3.2:1b  # 仅需1.2GB

# 方案2:使用量化版本
ollama run llama3.2:3b-q4_0  # 减少一半显存

# 方案3:减少上下文长度
PARAMETER num_ctx 1024

# 方案4:强制CPU运行
OLLAMA_GPU_LAYERS=0 ollama run llama3.2

Q2: 速度太慢怎么优化?

诊断步骤

# 1. 检查是否使用GPU
ollama run llama3.2 --verbose | grep GPU

# 2. 检查显存是否足够
nvidia-smi

# 3. 检查模型加载时间
time ollama run llama3.2 "Hello"

优化方案

问题解决方案
未使用GPU安装CUDA驱动,重启服务
显存不足使用量化模型或更小参数
模型太大换用小模型(如phi3:mini)
上下文太长减少num_ctx参数
频繁加载设置keepalive保持模型在内存

Q3: 端口被占用怎么办?

# 修改默认端口
OLLAMA_HOST=0.0.0.0:11435 ollama serve

# 或修改systemd配置
sudo systemctl edit ollama
# 添加:
[Service]
Environment="OLLAMA_HOST=0.0.0.0:11435"

Q4: 如何迁移模型?

# 导出模型
ollama show my-model --modelfile > Modelfile.backup

# 复制模型文件
cp -r ~/.ollama/models/manifests/registry.ollama.ai/library/my-model /backup/

# 在新机器上导入
ollama create my-model -f Modelfile.backup

Q5: 如何批量处理文档?

import os
import ollama
from pathlib import Path

def process_documents(directory, output_dir):
    """批量处理文档"""
    Path(output_dir).mkdir(exist_ok=True)
    
    for file in Path(directory).glob("*.txt"):
        with open(file, 'r') as f:
            content = f.read()
        
        response = ollama.chat(
            model='llama3.2',
            messages=[{
                'role': 'user',
                'content': f'请总结以下文档的核心内容:\n\n{content}'
            }]
        )
        
        output_file = Path(output_dir) / f"{file.stem}_summary.txt"
        with open(output_file, 'w') as f:
            f.write(response['message']['content'])
        
        print(f"Processed: {file.name}")

# 使用
process_documents('./documents', './summaries')

Q6: 如何实现RAG(检索增强生成)?

import ollama
import chromadb
from chromadb.config import Settings

# 初始化向量数据库
client = chromadb.Client(Settings(
    chroma_db_impl="duckdb+parquet",
    persist_directory="./chroma_db"
))
collection = client.create_collection("documents")

# 添加文档
def add_document(text, doc_id):
    embedding = ollama.embeddings(
        model='nomic-embed-text',
        prompt=text
    )
    collection.add(
        embeddings=[embedding['embedding']],
        documents=[text],
        ids=[doc_id]
    )

# 检索相关文档
def rag_query(query, n_results=3):
    query_embedding = ollama.embeddings(
        model='nomic-embed-text',
        prompt=query
    )
    
    results = collection.query(
        query_embeddings=[query_embedding['embedding']],
        n_results=n_results
    )
    
    context = "\n\n".join(results['documents'][0])
    
    response = ollama.chat(
        model='llama3.2',
        messages=[{
            'role': 'user',
            'content': f"""基于以下上下文回答问题:

{context}

问题:{query}"""
        }]
    )
    
    return response['message']['content']

最佳实践总结

1. 模型选择

  • 生产环境:选择稳定的官方模型(如llama3.2、qwen2.5)
  • 开发测试:可尝试新模型,但需评估质量
  • 成本敏感:优先小模型(1B-3B参数)
  • 质量优先:使用7B以上模型 + 低量化

2. 性能优化

  • GPU加速是必须的(有GPU时)
  • 合理设置上下文长度(不要过大)
  • 使用量化模型节省资源
  • 预加载常用模型(keepalive)

3. 安全考虑

  • 本地部署,数据不出本地
  • API层添加认证(生产环境)
  • 定期更新模型版本
  • 监控资源使用情况

4. 运维建议

  • 使用systemd管理服务
  • 配置日志收集
  • 定期备份自定义模型
  • 监控GPU/内存使用率

参考资料


总结

Ollama本地部署核心要点:

  • 安装简单:支持多平台,一键安装
  • 模型丰富:100+开源模型,持续更新
  • API友好:RESTful接口,多语言SDK
  • GPU支持:充分利用本地硬件
  • 可定制:Modelfile自定义模型行为
  • 完全免费:无API费用,无限制使用

通过Ollama,你可以低成本、高隐私地使用大语言模型,适合:

  • 隐私敏感场景(医疗、金融)
  • 离线环境(无网络访问)
  • 成本控制(无API费用)
  • 定制需求(特定领域模型)
  • 开发测试(快速原型验证)

💬 評論區

返回文章列表