Ollama 是一个开源工具,让你能像使用Docker一样简单地 在本地运行大语言模型。无需复杂配置,一条命令即可运行Llama 3、Mistral、Qwen等主流模型。
核心理念:"Get up and running with large language models, locally." 让AI能力真正触手可及,数据完全掌控在自己手中。
| 对比项 | Ollama(本地) | 云端API |
|---|---|---|
| 成本 | ✓ 免费(仅硬件) | 按token计费 |
| 数据隐私 | ✓ 完全私密 | 上传到服务器 |
| 网络依赖 | ✓ 离线可用 | 需要联网 |
| 响应速度 | ✓ 本地秒级 | 依赖网络 |
| 模型性能 | 中等(受硬件限制) | ✓ 最强 |
| 扩展性 | 受硬件限制 | ✓ 无限扩展 |
方式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
# 一键安装脚本 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加速支持:
# 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 # 退出对话
推荐入门模型:
性能模型:
核心优势
# 性能对比(7B模型推理) PyTorch FP16: ~8 tokens/s(8GB显存) llama.cpp Q4: ~25 tokens/s(3GB显存) llama.cpp Q8: ~18 tokens/s(5GB显存) # 量化几乎无精度损失,速度提升3倍!
# 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特点
模型操作
# 下载模型 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
llama3.2:3b
大小:2GB | 速度:快
适合:日常对话、快速原型
llama3.1:8b
大小:4.7GB | 速度:中
适合:通用应用、RAG
llama3.1:70b
大小:40GB | 速度:慢
适合:专业应用、高质量输出
qwen2.5:7b
大小:4.7GB | 中文优秀
适合:中文对话、客服
qwen2.5:14b
大小:9GB | 性能强
适合:复杂任务、推理
qwen2.5:72b
大小:42GB | 最强中文
适合:专业应用、生产环境
deepseek-coder:6.7b
领域:代码生成
特点:代码补全、调试
mathstral:7b
领域:数学推理
特点:数学题求解
llava:13b
领域:多模态
特点:图像理解
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 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)
兼容性优势:
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)
}
# 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优势:
创建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即可使用
高级用法:
# 方式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可以通过微调训练获得 # 只需很少的数据就能定制模型行为
# 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运行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=[...]
)
本地化AI的最佳选择 - 免费、私密、高性能
完全免费
开源无限制
数据私密
本地运行
简单易用
一条命令
模型丰富
100+选择
"Get up and running with large language models, locally."