这是《本地部署大模型》系列的第二篇。在上一篇中,我们完成了 Ollama + Open WebUI 的基础搭建。本文将深入进阶配置、性能优化和实战场景。

一、进阶配置

1.1 Ollama 配置文件详解

Ollama 的配置文件位于 ~/.ollama/config.json(Linux/Mac)或 %USERPROFILE%\.ollama\config.json(Windows)。

常用配置项:

{
  "num_parallel": 4,
  "max_loaded_models": 2,
  "cuda": true,
  "host": "0.0.0.0:11434"
}
配置项 说明 推荐值
num_parallel 并发请求数 2-4(根据显存调整)
max_loaded_models 同时加载的模型数 1-2(显存有限时设为1)
cuda 是否启用 CUDA 加速 true(有 NVIDIA 显卡时)
host 监听地址 127.0.0.1:11434(仅本机)

1.2 环境变量配置

通过环境变量可以精细控制 Ollama 的行为:

# Linux/Mac - 添加到 ~/.bashrc 或 ~/.zshrc
export OLLAMA_HOST=0.0.0.0:11434        # 监听地址
export OLLAMA_NUM_PARALLEL=4            # 并发数
export OLLAMA_MAX_LOADED_MODELS=2       # 最大加载模型数
export OLLAMA_KEEP_ALIVE=5m             # 模型保持加载时间
export OLLAMA_GPU_LAYERS=33             # GPU 加速的层数(-1 为全部)

Windows PowerShell:

[System.Environment]::SetEnvironmentVariable("OLLAMA_HOST", "0.0.0.0:11434", "User")
[System.Environment]::SetEnvironmentVariable("OLLAMA_NUM_PARALLEL", "4", "User")

1.3 Open WebUI 高级配置

# Docker 部署时传入配置
docker run -d \
  -p 3000:8080 \
  -e WEBUI_AUTH=true \
  -e DEFAULT_MODELS="qwen3:8b" \
  -e OLLAMA_BASE_URL="http://host.docker.internal:11434" \
  --add-host=host.docker.internal:host-gateway \
  -v open-webui:/app/backend/data \
  ghcr.io/open-webui/open-webui:main

常用环境变量:

环境变量 说明 默认值
WEBUI_AUTH 是否启用用户认证 true
DEFAULT_MODELS 默认模型
OLLAMA_BASE_URL Ollama API 地址 http://localhost:11434
ENABLE_SIGNUP 是否允许注册 true

二、性能调优

2.1 GPU 加速配置

NVIDIA GPU
# 检查驱动和 CUDA
nvidia-smi
nvcc --version
强制使用 GPU
export CUDA_VISIBLE_DEVICES=0
指定 GPU 层数(-1 表示全部层都在 GPU 上)
ollama run qwen3:8b --gpu-layers -1
Apple Silicon (M1/M2/M3/M4)

macOS 上 Ollama 会自动使用 Metal 加速。性能参考:

芯片 内存 Qwen3-8B 速度 Qwen3-14B 速度
M1 8GB ~15 tokens/s 不推荐
M2 16GB ~25 tokens/s ~15 tokens/s
M3 Pro 18GB ~35 tokens/s ~22 tokens/s
M4 Max 36GB ~50 tokens/s ~35 tokens/s

2.2 模型量化选择

GGUF 格式支持多种量化级别:

量化级别 大小(8B 模型) 精度 速度 推荐场景
Q2_K ~2.8GB 最快 资源极度受限
Q3_K_M ~3.5GB 中低 日常轻度使用
Q4_K_M ~4.5GB 平衡 推荐默认
Q5_K_M ~5.5GB 中高 较慢 对质量有要求
Q8_0 ~8.5GB 很高 很慢 最高精度

选择建议:日常使用选 Q4_K_M,代码生成选 Q5_K_M 或更高。

2.3 内存优化

当显存不足时,Ollama 会自动将部分层放到 CPU 中(CPU offloading):

# 限制 GPU 层数,平衡显存和内存
ollama run qwen3:8b --gpu-layers 20
查看模型层分布
ollama show qwen3:8b --modelfile

三、模型管理最佳实践

3.1 自定义模型

通过 Modelfile 预设模型行为:

# Modelfile
FROM qwen3:8b
PARAMETER temperature 0.7
PARAMETER top_p 0.9
PARAMETER num_ctx 8192
SYSTEM """
你是一个专业的全栈开发工程师。
回答问题时:
先给出简明的结论
提供具体的代码示例
解释关键原理
指出常见陷阱
"""

创建并使用:

# 创建自定义模型
ollama create my-dev-assistant -f Modelfile
使用自定义模型
ollama run my-dev-assistant

3.2 模型存储管理

# 查看已下载模型
ollama list
查看模型占用空间
du -sh ~/.ollama/models/
删除不需要的模型
ollama rm model-name
迁移模型到其他磁盘
mv ~/.ollama/models /data/ollama-models
ln -s /data/ollama-models ~/.ollama/models

3.3 多模型工作流

针对不同任务使用不同模型是本地部署的核心优势:

# 下载多个模型
ollama pull qwen3:8b          # 通用助手
ollama pull qwen3-coder:7b    # 代码生成
ollama pull gemma3:4b         # 轻量快速任务

在 Open WebUI 中,可以通过设置默认模型或在每次对话时切换。

四、实战:RAG 知识库搭建

4.1 什么是 RAG?

RAG(Retrieval-Augmented Generation,检索增强生成)是一种让大模型基于你的私有文档回答问题的技术。

工作流程:

  1. 将文档切分成小段落(chunk)
  2. 将段落转化为向量并存储
  3. 用户提问时,检索最相关的段落
  4. 将检索结果注入到 Prompt 中,让模型基于此回答

4.2 Open WebUI 内置 RAG

Open WebUI 内置了简单的 RAG 功能:

  1. 进入 Workspace → Knowledge 创建知识库
  2. 上传 PDF、TXT、Markdown 等文档
  3. 系统自动处理文档切分和向量化
  4. 在对话中选择知识库,AI 会基于文档内容回答

4.3 进阶:使用 LangChain 构建 RAG

对于更复杂的场景,可以使用 LangChain + Ollama 构建自定义 RAG:

from langchain_community.llms import Ollama
from langchain_community.vectorstores import Chroma
from langchain_community.embeddings import OllamaEmbeddings
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_community.document_loaders import PyPDFLoader
1. 加载文档
loader = PyPDFLoader("your_document.pdf")
documents = loader.load()
2. 切分文档
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=500,
chunk_overlap=50
)
chunks = text_splitter.split_documents(documents)
3. 创建向量存储
embeddings = OllamaEmbeddings(model="qwen3:8b")
vectorstore = Chroma.from_documents(chunks, embeddings)
4. 创建检索器
retriever = vectorstore.as_retriever(search_kwargs={"k": 3})
5. 创建 RAG 链
from langchain.chains import RetrievalQA
llm = Ollama(model="qwen3:8b")
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff",
retriever=retriever,
return_source_documents=True
)
6. 提问
result = qa_chain.invoke({"query": "这份文档的核心观点是什么?"})
print(result["result"])

4.4 安装依赖

pip install langchain langchain-community chromadb pypdf

五、API 集成与二次开发

5.1 Ollama REST API

Ollama 提供了标准的 REST API,可以直接集成到任何应用中:

import requests
import json
对话接口
response = requests.post(
"http://localhost:11434/api/chat",
json={
"model": "qwen3:8b",
"messages": [
{"role": "system", "content": "你是一个技术助手"},
{"role": "user", "content": "解释一下什么是微服务"}
],
"stream": False
}
)
print(response.json()["message"]["content"])

5.2 流式输出

import requests
import json
response = requests.post(
"http://localhost:11434/api/chat",
json={
"model": "qwen3:8b",
"messages": [{"role": "user", "content": "写一首诗"}],
"stream": True
},
stream=True
)
for line in response.iter_lines():
if line:
data = json.loads(line)
if "message" in data:
print(data["message"]["content"], end="", flush=True)

5.3 OpenAI 兼容接口

Ollama 兼容 OpenAI API 格式,可以直接使用 OpenAI SDK:

from openai import OpenAI
client = OpenAI(
base_url="http://localhost:11434/v1",
api_key="ollama"  # 任意值即可
)
response = client.chat.completions.create(
model="qwen3:8b",
messages=[
{"role": "user", "content": "你好,介绍一下你自己"}
]
)
print(response.choices[0].message.content)

这意味着所有基于 OpenAI SDK 开发的应用,只需要改一行 base_url 就能切换到本地模型。

六、常见踩坑与解决方案

6.1 模型加载慢

现象:第一次运行模型时等待时间很长。

原因:模型需要从磁盘加载到内存/显存。

解决

  • 设置 OLLAMA_KEEP_ALIVE=10m 让模型保持加载更久
  • 使用 --gpu-layers 减少需要加载的层数
  • 使用更小的量化版本

6.2 生成质量不佳

现象:回答不准确、重复、或答非所问。

解决

  • 调整 temperature(降低可减少随机性)
  • 使用更大的模型(14B > 8B)
  • 优化系统提示词,给出明确的指令和格式要求
  • 使用 RAG 注入相关上下文

6.3 OOM(内存不足)

现象:运行时报错 out of memory

解决

# 减少并发数
export OLLAMA_NUM_PARALLEL=1
减少 GPU 层数
ollama run qwen3:8b --gpu-layers 10
使用更小的模型
ollama pull gemma3:4b

6.4 Docker 容器无法访问 Ollama

解决

# 方式一:使用 host 网络模式(Linux)
docker run --network host ...
方式二:确保添加了 host 映射
docker run --add-host=host.docker.internal:host-gateway ...
方式三:使用宿主机 IP
docker run -e OLLAMA_BASE_URL="http://172.17.0.1:11434" ...

七、总结

通过本系列两篇文章,我们完成了:

上篇

  • Ollama 和 Open WebUI 的概念理解
  • 多平台环境搭建
  • 基础对话和文件上传使用

下篇

  • 性能调优(GPU 加速、量化选择、内存优化)
  • 模型管理(自定义模型、版本管理)
  • RAG 知识库搭建(内置 + LangChain)
  • API 集成(REST API、OpenAI 兼容接口)
  • 常见问题排查

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐