🦙 本地化AI的最佳选择

Ollama 完整教程

像Docker一样简单地运行大语言模型

🚀 一键安装 💻 本地运行 🔒 数据安全 ⚡ 性能优异

🎯 Ollama 是什么?

Ollama 是一个开源工具,让你能像使用Docker一样简单地 在本地运行大语言模型。无需复杂配置,一条命令即可运行Llama 3、Mistral、Qwen等主流模型。

核心理念:"Get up and running with large language models, locally." 让AI能力真正触手可及,数据完全掌控在自己手中。

✅ 核心优势

  • 简单:一条命令安装和运行
  • 本地化:无需联网,数据私密
  • 免费:完全开源,无API费用
  • 高性能:CPU/GPU自动优化
  • 模型丰富:支持100+开源模型

🎯 适用场景

  • • 企业内部知识库问答
  • • 敏感数据处理(医疗、金融)
  • • 离线环境AI应用
  • • AI功能快速原型验证
  • • 学习LLM技术

📊 技术规格

  • 语言:Go(高性能)
  • 推理引擎:llama.cpp
  • 量化支持:Q4/Q5/Q8/FP16
  • 平台:Mac/Linux/Windows
  • 加速:Metal/CUDA/ROCm

Ollama vs 云端API 对比

对比项 Ollama(本地) 云端API
成本 ✓ 免费(仅硬件) 按token计费
数据隐私 ✓ 完全私密 上传到服务器
网络依赖 ✓ 离线可用 需要联网
响应速度 ✓ 本地秒级 依赖网络
模型性能 中等(受硬件限制) ✓ 最强
扩展性 受硬件限制 ✓ 无限扩展

🚀 快速开始

🍎

macOS 安装

方式1:官方安装包

# 1. 下载安装包
# 访问 https://ollama.com/download
# 下载 Ollama-darwin.zip

# 2. 安装
# 双击.zip解压,拖到Applications

# 3. 验证
ollama --version

方式2:Homebrew

# 使用Homebrew安装
brew install ollama

# 验证安装
ollama --version

# 启动服务
ollama serve

💡 硬件要求:Apple Silicon(M1/M2/M3)自动使用Metal加速,Intel Mac使用CPU

🐧

Linux 安装

# 一键安装脚本
curl -fsSL https://ollama.com/install.sh | sh

# 启动服务
ollama serve

# 后台运行(推荐)
nohup ollama serve > ollama.log 2>&1 &

# 设置开机自启(systemd)
sudo systemctl enable ollama
sudo systemctl start ollama

GPU加速支持:

  • NVIDIA:自动检测CUDA,需安装CUDA 11.8+和对应驱动
  • AMD:支持ROCm 5.7+
  • CPU:无GPU时自动回退到CPU模式
🪟

Windows 安装

# 1. 下载Windows安装包
# 访问 https://ollama.com/download
# 下载 OllamaSetup.exe

# 2. 运行安装程序
# 双击安装,自动配置环境变量

# 3. 打开PowerShell验证
ollama --version

# 4. 启动服务(自动启动)
# 服务会作为后台进程运行

⚠️ GPU要求:需要NVIDIA GPU + CUDA 11.8+,或使用CPU模式(较慢)

🎉 运行第一个模型

# 下载并运行Llama 3.2(3B参数,约2GB)
ollama run llama3.2

# 首次运行会自动下载模型
# 下载完成后进入对话模式
>>> 你好!请介绍一下自己
我是一个AI助手,基于Llama 3.2模型...

>>> /bye  # 退出对话

推荐入门模型:

  • llama3.2:3b - 小巧快速(2GB)
  • qwen2.5:7b - 中文友好(4.7GB)
  • gemma2:9b - 性能均衡(5.4GB)

性能模型:

  • llama3.1:70b - 顶级性能(40GB)
  • qwen2.5:72b - 中文最强(42GB)
  • mixtral:8x7b - MoE架构(26GB)

🏗️ 架构设计与技术特点

Ollama 架构图

CLI / API
用户交互层 - 命令行工具和REST API
Ollama Server
Go实现的服务端 - 模型管理、请求调度
llama.cpp
C++推理引擎 - 高性能模型推理
Hardware
CPU / GPU(Metal/CUDA/ROCm)

llama.cpp 推理引擎

核心优势

  • • C++实现,性能极致优化
  • • 支持CPU/GPU混合推理
  • • 内存占用优化(量化支持)
  • • 跨平台兼容性好
# 性能对比(7B模型推理)
PyTorch FP16:  ~8 tokens/s(8GB显存)
llama.cpp Q4:  ~25 tokens/s(3GB显存)
llama.cpp Q8:  ~18 tokens/s(5GB显存)

# 量化几乎无精度损失,速度提升3倍!

📦 Modelfile 模型定义

# Modelfile示例
FROM llama3.2

# 设置系统提示词
SYSTEM """
你是一个专业的AI助手。
"""

# 参数配置
PARAMETER temperature 0.8
PARAMETER top_p 0.9
PARAMETER top_k 40

# 模板定义
TEMPLATE """

User: 
Assistant:
"""

💡 类似Dockerfile,声明式定义模型行为

🎯 量化技术详解

量化级别 大小 精度 速度
Q4_K_M 最小 良好 最快
Q5_K_M 中等 很好
Q8_0 较大 优秀 中等
F16 最大 完美 较慢

🔧 服务端架构

Go Server特点

  • • 高并发:goroutine处理多请求
  • • 模型缓存:内存中保留热门模型
  • • 智能卸载:长时间不用自动释放
  • • REST API:兼容OpenAI API格式

📦 模型管理

基本命令

模型操作

# 下载模型
ollama pull llama3.2

# 运行模型
ollama run llama3.2

# 列出已下载模型
ollama list

# 删除模型
ollama rm llama3.2

# 查看模型信息
ollama show llama3.2

模型搜索

# 访问模型库
# https://ollama.com/library

# 按类别筛选
- Code: codellama, deepseek-coder
- Math: mathstral
- Chinese: qwen2.5, chatglm3
- Vision: llava, bakllava

🔥 热门模型推荐

Llama 系列(Meta)

llama3.2:3b

大小:2GB | 速度:快

适合:日常对话、快速原型

llama3.1:8b

大小:4.7GB | 速度:中

适合:通用应用、RAG

llama3.1:70b

大小:40GB | 速度:慢

适合:专业应用、高质量输出

Qwen 系列(阿里)⭐ 中文推荐

qwen2.5:7b

大小:4.7GB | 中文优秀

适合:中文对话、客服

qwen2.5:14b

大小:9GB | 性能强

适合:复杂任务、推理

qwen2.5:72b

大小:42GB | 最强中文

适合:专业应用、生产环境

专业领域模型

deepseek-coder:6.7b

领域:代码生成

特点:代码补全、调试

mathstral:7b

领域:数学推理

特点:数学题求解

llava:13b

领域:多模态

特点:图像理解

🔌 API 调用指南

REST API(兼容OpenAI格式)

Python调用

import requests

url = "http://localhost:11434/api/generate"

data = {
    "model": "llama3.2",
    "prompt": "为什么天空是蓝色的?",
    "stream": False
}

response = requests.post(url, json=data)
result = response.json()

print(result["response"])

流式输出

data = {
    "model": "llama3.2",
    "prompt": "讲个故事",
    "stream": True
}

response = requests.post(url, json=data, stream=True)

for line in response.iter_lines():
    if line:
        chunk = json.loads(line)
        print(chunk["response"], end="", flush=True)

OpenAI 兼容 API

# 使用OpenAI Python库调用Ollama
from openai import OpenAI

client = OpenAI(
    base_url="http://localhost:11434/v1",
    api_key="ollama"  # Ollama不需要真实key,随便填
)

response = client.chat.completions.create(
    model="llama3.2",
    messages=[
        {"role": "system", "content": "你是一个有帮助的AI助手"},
        {"role": "user", "content": "解释量子纠缠"}
    ],
    temperature=0.7,
    max_tokens=500
)

print(response.choices[0].message.content)

兼容性优势:

  • ✓ 无缝替换OpenAI API,只需修改base_url
  • ✓ 支持LangChain、LlamaIndex等框架
  • ✓ 现有OpenAI代码几乎零改动

Go语言集成

package main

import (
    "bytes"
    "encoding/json"
    "fmt"
    "io"
    "net/http"
)

type OllamaRequest struct {
    Model  string `json:"model"`
    Prompt string `json:"prompt"`
    Stream bool   `json:"stream"`
}

type OllamaResponse struct {
    Response string `json:"response"`
    Done     bool   `json:"done"`
}

func CallOllama(prompt string) (string, error) {
    url := "http://localhost:11434/api/generate"
    
    reqData := OllamaRequest{
        Model:  "llama3.2",
        Prompt: prompt,
        Stream: false,
    }
    
    jsonData, _ := json.Marshal(reqData)
    resp, err := http.Post(url, "application/json", bytes.NewBuffer(jsonData))
    if err != nil {
        return "", err
    }
    defer resp.Body.Close()
    
    body, _ := io.ReadAll(resp.Body)
    
    var result OllamaResponse
    json.Unmarshal(body, &result)
    
    return result.Response, nil
}

func main() {
    answer, err := CallOllama("Go语言的优势是什么?")
    if err != nil {
        panic(err)
    }
    fmt.Println(answer)
}

⭐ 实战 Ollama + RAG 完整实现

# Python + Ollama + ChromaDB 实现本地RAG
from langchain_community.llms import Ollama
from langchain_community.embeddings import OllamaEmbeddings
from langchain_community.vectorstores import Chroma
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.chains import RetrievalQA
from langchain.prompts import PromptTemplate

# 1. 初始化Ollama
llm = Ollama(
    model="qwen2.5:7b",
    temperature=0.2,
    base_url="http://localhost:11434"
)

embeddings = OllamaEmbeddings(
    model="nomic-embed-text",  # 专门的embedding模型
    base_url="http://localhost:11434"
)

# 2. 加载文档
from langchain_community.document_loaders import TextLoader

loader = TextLoader("./docs/knowledge.txt", encoding='utf-8')
documents = loader.load()

# 3. 分割文档
text_splitter = RecursiveCharacterTextSplitter(
    chunk_size=500,
    chunk_overlap=50,
    separators=["\n\n", "\n", "。", " "]
)
splits = text_splitter.split_documents(documents)

# 4. 构建向量数据库
vectorstore = Chroma.from_documents(
    documents=splits,
    embedding=embeddings,
    collection_name="local_knowledge",
    persist_directory="./chroma_db"
)

# 5. 定义Prompt
prompt_template = """基于以下文档回答问题。如果文档中没有相关信息,请说"我不知道"。

文档:
{context}

问题:{question}

回答:"""

PROMPT = PromptTemplate(
    template=prompt_template,
    input_variables=["context", "question"]
)

# 6. 创建RAG链
qa_chain = RetrievalQA.from_chain_type(
    llm=llm,
    chain_type="stuff",
    retriever=vectorstore.as_retriever(search_kwargs={"k": 3}),
    return_source_documents=True,
    chain_type_kwargs={"prompt": PROMPT}
)

# 7. 使用
question = "深度学习的核心概念是什么?"
result = qa_chain.invoke({"query": question})

print(f"问题:{question}")
print(f"回答:{result['result']}")
print(f"参考文档数:{len(result['source_documents'])}")

本地RAG优势:

  • ✓ 完全免费:无API调用成本
  • ✓ 数据私密:企业敏感数据不外传
  • ✓ 低延迟:本地推理,无网络等待
  • ✓ 可控性:完全掌控模型行为

🛠️ 二次开发指南

1. 创建自定义模型

创建Modelfile

# Modelfile
FROM qwen2.5:7b

# 系统提示词
SYSTEM """
你是一个专业的Python编程助手。
你擅长:
1. 代码生成和优化
2. Bug调试
3. 架构设计建议
4. 最佳实践推荐

回答时请:
- 提供完整可运行的代码
- 添加详细注释
- 说明使用方法
"""

# 参数设置
PARAMETER temperature 0.3
PARAMETER top_p 0.9
PARAMETER top_k 40
PARAMETER num_ctx 4096

# 对话模板
TEMPLATE """


### 用户问题:


### 助手回答:
"""

构建和使用

# 从Modelfile创建模型
ollama create python-assistant -f ./Modelfile

# 运行自定义模型
ollama run python-assistant

# 测试
>>> 写一个快速排序算法

# 列出模型
ollama list
# 输出会看到 python-assistant

# 分享Modelfile
# 可以将Modelfile上传到GitHub
# 其他人直接ollama create即可使用

高级用法:

  • ADAPTER:加载LoRA微调适配器
  • LICENSE:添加许可证信息
  • MESSAGE:预设对话示例

2. 模型微调与导入

# 方式1:导入GGUF格式模型
# 从HuggingFace下载GGUF文件
ollama create my-model -f Modelfile

# Modelfile内容
FROM ./models/my-custom-model.gguf
SYSTEM "自定义系统提示词"

# 方式2:从HuggingFace直接导入
# 需要先转换为GGUF格式
# 使用 llama.cpp 的转换工具

# 方式3:使用LoRA适配器
FROM llama3.2
ADAPTER ./adapters/my-lora.bin

# LoRA可以通过微调训练获得
# 只需很少的数据就能定制模型行为

3. Web应用集成示例

# Flask + Ollama 聊天应用
from flask import Flask, request, jsonify, render_template
import requests
import json

app = Flask(__name__)

OLLAMA_URL = "http://localhost:11434/api/generate"

@app.route('/')
def index():
    return render_template('chat.html')

@app.route('/api/chat', methods=['POST'])
def chat():
    data = request.json
    user_message = data.get('message')
    
    # 调用Ollama
    ollama_req = {
        "model": "qwen2.5:7b",
        "prompt": user_message,
        "stream": False,
        "options": {
            "temperature": 0.8,
            "top_p": 0.9
        }
    }
    
    response = requests.post(OLLAMA_URL, json=ollama_req)
    result = response.json()
    
    return jsonify({
        "response": result["response"],
        "model": result["model"],
        "eval_count": result.get("eval_count", 0),
        "eval_duration": result.get("eval_duration", 0)
    })

if __name__ == '__main__':
    app.run(port=5000)

前端HTML(chat.html)

<!DOCTYPE html>
<html>
<body>
    <div id="chat-box"></div>
    <input id="user-input" type="text" />
    <button onclick="sendMessage()">发送</button>
    
    <script>
    async function sendMessage() {
        const input = document.getElementById('user-input');
        const message = input.value;
        
        const response = await fetch('/api/chat', {
            method: 'POST',
            headers: {'Content-Type': 'application/json'},
            body: JSON.stringify({message})
        });
        
        const data = await response.json();
        displayMessage('用户', message);
        displayMessage('AI', data.response);
        input.value = '';
    }
    </script>
</body>
</html>

🎓 进阶技巧

⚡ 性能优化

1. 选择合适的量化级别

# 小显存用Q4
ollama pull llama3.2:3b-q4_K_M

# 平衡性能用Q5
ollama pull llama3.2:3b-q5_K_M

# 追求质量用Q8或FP16
ollama pull llama3.2:3b-q8_0

2. GPU层数调整

# 部分层放GPU,部分放CPU
export OLLAMA_NUM_GPU=20

# 查看GPU使用
nvidia-smi

3. 并发请求处理

# 设置并发数
export OLLAMA_NUM_PARALLEL=4

# 增加上下文窗口
export OLLAMA_MAX_LOADED_MODELS=2

🔄 多模型管理

# 同时运行多个模型
# 模型会自动加载到内存

# 轻量模型处理简单任务
ollama run llama3.2:3b "总结:..."

# 重量模型处理复杂任务
ollama run qwen2.5:72b "深度分析:..."

# 查看内存中的模型
ollama ps

# 输出示例:
# NAME          ID        SIZE   PROCESSOR  UNTIL
# llama3.2:3b   xxx       2.0GB  100% GPU   4m
# qwen2.5:72b   xxx       42GB   50% GPU    10m

🐳 Docker部署

# Docker运行Ollama
docker run -d \
  -v ollama:/root/.ollama \
  -p 11434:11434 \
  --gpus=all \
  --name ollama \
  ollama/ollama

# 在容器中运行模型
docker exec -it ollama ollama run llama3.2

# Kubernetes部署
# 使用StatefulSet + PVC存储模型
# 配置GPU资源请求

🔧 集成到现有项目

# 将OpenAI替换为Ollama
# 修改前
from openai import OpenAI
client = OpenAI(api_key="sk-xxx")

# 修改后(仅2行改动)
from openai import OpenAI
client = OpenAI(
    base_url="http://localhost:11434/v1",
    api_key="ollama"
)

# 其余代码完全不变!
response = client.chat.completions.create(
    model="qwen2.5:7b",  # 改用本地模型
    messages=[...]
)

🎯 生产环境最佳实践

部署建议

  • • 使用systemd管理服务
  • • 配置日志轮转
  • • 设置健康检查
  • • 使用Nginx反向代理

监控告警

  • • Prometheus采集metrics
  • • GPU使用率监控
  • • 响应时间告警
  • • 错误率追踪

安全加固

  • • 限制API访问IP
  • • 添加认证token
  • • 请求频率限制
  • • 输入内容过滤

📚 学习资源

🎯 开始使用Ollama

本地化AI的最佳选择 - 免费、私密、高性能

💰

完全免费

开源无限制

🔒

数据私密

本地运行

简单易用

一条命令

📦

模型丰富

100+选择

"Get up and running with large language models, locally."