Ollama 使用指南¶
Ollama 是一个本地部署的开源 LLM 运行框架,支持在本地运行 Llama、Mistral、Gemma 等多种开源模型,提供数据隐私保护和无网络依赖的本地推理能力。
模型概览¶
推荐模型¶
| 模型 | 上下文 | 特色 | 适用场景 |
|---|---|---|---|
| llama3 | 128K | Meta 开源旗舰 | 通用对话、复杂推理 |
| llama3.2 | 128K | 最新版本、性能优化 | 多场景通用 |
| mistral | 32K | 平衡性能和速度 | 代码生成、通用任务 |
| gemma2 | 8K | Google 开源 | 轻量级任务 |
| qwen2 | 32K | 阿里开源、中文优化 | 中文场景 |
| codegemma | 8K | 代码专项 | 代码生成、补全 |
| llava | - | 多模态(仅图片) | 图文理解 |
模型选择建议¶
from tfrobot.brain.chain.llms import Ollama
# 通用场景(推荐)
llm = Ollama(model="llama3")
# 中文场景
llm = Ollama(model="qwen2")
# 代码生成
llm = Ollama(model="codegemma")
# 多模态(仅支持图片)
llm = Ollama(model="llava")
安装与配置¶
安装 Ollama¶
- 下载安装 Ollama
# macOS
brew install ollama
# Linux
curl -fsSL https://ollama.com/install.sh | sh
# Windows
# 从 https://ollama.com/download 下载安装程序
- 启动 Ollama 服务
ollama serve
- 拉取模型
# 拉取 Llama 3
ollama pull llama3
# 拉取其他模型
ollama pull mistral
ollama pull qwen2
配置参数¶
from tfrobot.brain.chain.llms import Ollama
llm = Ollama(
model="llama3",
base_url="http://localhost:11434", # Ollama 服务地址
timeout=120.0, # 请求超时时间
num_ctx=64000, # 上下文长度(默认 64K)
temperature=0.7, # 0.0-1.0,控制随机性
top_p=0.9, # 0.0-1.0,核采样
top_k=40, # 1-∞,top-k 采样
num_gpu=-1, # GPU 层数(-1 = 使用所有可用 GPU)
num_thread=8, # CPU 线程数
)
基础使用¶
简单对话¶
from tfrobot.brain.chain.llms import Ollama
from tfrobot.schema.message.conversation.message_dto import TextMessage
llm = Ollama(model="llama3")
result = llm.complete(
current_input=TextMessage(content="你好,请介绍一下你自己")
)
print(result.generations[0].text)
流式输出¶
llm = Ollama(
model="llama3",
stream=True
)
result = llm.complete(
current_input=TextMessage(content="写一首关于春天的诗")
)
# result.generations[0].text 会逐步生成
工具调用¶
原生模式¶
from tfrobot.brain.chain.llms import OllamaWithTools
from tfrobot.brain.chain.prompt.tool_prompt import ToolPrompt
from tfrobot.drive.tool.tool import tool
@tool
def get_weather(city: str) -> str:
"""获取指定城市的天气"""
return f"{city} 今天晴天,温度 25°C"
llm = OllamaWithTools(model="llama3")
llm.system_msg_prompt = [ToolPrompt()]
result = llm.complete(
current_input=TextMessage(content="北京今天的天气怎么样?"),
tools=[get_weather]
)
Ollama vs OllamaWithTools¶
- Ollama:基础模型,需要手动配置
ToolPrompt - OllamaWithTools:预配置
ToolPrompt,更方便
# 方式一:使用 Ollama
llm = Ollama(model="llama3")
llm.system_msg_prompt.append(ToolPrompt())
# 方式二:使用 OllamaWithTools(推荐)
llm = OllamaWithTools(model="llama3")
多模态支持¶
注意:Ollama 仅支持图片多模态(llava 模型),不支持音频、视频和 PDF。
图片理解¶
from tfrobot.schema.message.conversation.message_dto import MultiPartMessage
from tfrobot.schema.message.msg_part import TextPart, ImagePart
# 使用 llava 模型
llm = Ollama(model="llava")
msg = MultiPartMessage(content=[
TextPart(text="这张图片里有什么?"),
ImagePart(
image_url=ImgUrl(url="path/to/image.jpg"),
),
])
result = llm.complete(current_input=msg)
高级配置¶
GPU 加速¶
# 使用所有可用 GPU
llm = Ollama(
model="llama3",
num_gpu=-1 # 使用所有 GPU
)
# 使用指定 GPU 层数
llm = Ollama(
model="llama3",
num_gpu=4 # 使用 4 层 GPU
)
# 禁用 GPU(纯 CPU)
llm = Ollama(
model="llama3",
num_gpu=0
)
上下文长度¶
# 设置上下文长度
llm = Ollama(
model="llama3",
num_ctx=128000 # 128K tokens
)
批处理大小¶
llm = Ollama(
model="llama3",
num_batch=512 # 批处理大小
)
重复惩罚¶
llm = Ollama(
model="llama3",
repeat_penalty=1.1 # 重复惩罚(1.0 = 无惩罚)
)
性能优化¶
模型量化¶
Ollama 自动使用量化模型以减少内存占用:
# Ollama 默认使用 4-bit 量化
# 如需更高精度,可以拉取其他量化版本
# 拉取 8-bit 量化版本
# ollama pull llama3:8b-instruct-q8_0
内存优化¶
import psutil
# 根据可用内存调整参数
available_memory_gb = psutil.virtual_memory().available / (1024**3)
if available_memory_gb < 8:
# 低内存配置
llm = Ollama(
model="llama3",
num_ctx=32000,
num_gpu=0 # 使用 CPU
)
else:
# 高内存配置
llm = Ollama(
model="llama3",
num_ctx=128000,
num_gpu=-1 # 使用所有 GPU
)
并行处理¶
import asyncio
async def batch_process(llm, inputs):
tasks = [llm.async_complete(current_input=inp) for inp in inputs]
results = await asyncio.gather(*tasks)
return results
上下文管理¶
上下文压缩¶
当上下文超出限制时,Chain 会自动触发压缩:
# Chain 自动处理
from tfrobot.brain.chain import SingleChain
chain = SingleChain(llm=llm)
result = chain.run(input_message=user_input)
手动压缩¶
try:
result = llm.complete(current_input=user_input)
except Exception as e:
if "context" in str(e).lower():
# 手动压缩
compacted, _, _, _, _ = llm.collapse_context(
current_input=user_input,
conversation=conversation,
to_size=30000
)
result = llm.complete(current_input=user_input, conversation=compacted)
错误处理¶
常见错误¶
| 错误类型 | 原因 | 解决方案 |
|---|---|---|
ConnectionError |
Ollama 服务未启动 | 运行 ollama serve |
ModelNotFound |
模型未拉取 | 运行 ollama pull <model> |
ContextLengthExceeded |
上下文超长 | 使用 Chain 的 compact 功能 |
OutOfMemory |
内存不足 | 减少上下文长度或使用量化模型 |
手动错误处理¶
import requests
try:
result = llm.complete(current_input=user_input)
except requests.exceptions.ConnectionError:
print("Ollama 服务未启动,请运行: ollama serve")
except Exception as e:
if "model" in str(e).lower() and "not found" in str(e).lower():
print(f"模型未找到,请运行: ollama pull {llm.model}")
elif "memory" in str(e).lower():
print("内存不足,请尝试减少上下文长度或使用量化模型")
else:
raise
最佳实践¶
1. Temperature 设置¶
# 需要创造性(如写作)
llm = Ollama(model="llama3", temperature=1.0)
# 需要稳定性(如代码生成)
llm = Ollama(model="llama3", temperature=0.0)
2. Prompt 工程¶
llm.system_msg_prompt = [
MemoPrompt(template="你是一个专业的 Python 开发者。"),
ToolPrompt(),
]
llm.after_input_msg_prompt = [
MemoPrompt(template="请使用 Markdown 格式回复,代码块标明语言。"),
]
3. 选择合适的模型¶
# 根据任务选择模型
def get_llm_for_task(task_type: str) -> Ollama:
if task_type == "code":
return Ollama(model="codegemma")
elif task_type == "chinese":
return Ollama(model="qwen2")
elif task_type == "vision":
return Ollama(model="llava")
else:
return Ollama(model="llama3")
4. 监控资源使用¶
import psutil
def check_resources():
"""检查系统资源"""
cpu_percent = psutil.cpu_percent()
memory = psutil.virtual_memory()
print(f"CPU 使用率: {cpu_percent}%")
print(f"内存使用率: {memory.percent}%")
print(f"可用内存: {memory.available / (1024**3):.2f} GB")
check_resources()
5. 使用 Docker 部署¶
# 使用 Docker 运行 Ollama
docker run -d \
-v ollama:/root/.ollama \
-p 11434:11434 \
--name ollama \
ollama/ollama
# 拉取模型
docker exec -it ollama ollama pull llama3
数据隐私与安全¶
本地部署优势¶
- 数据隐私:所有数据在本地处理,不会上传到云端
- 无网络依赖:无需互联网连接即可使用
- 完全控制:可以修改和微调模型
- 成本为零:无需支付 API 费用
安全建议¶
# 敏感数据处理
llm = Ollama(model="llama3")
# 敏感数据在本地处理,不会泄露
sensitive_data = "用户的敏感信息"
result = llm.complete(
current_input=TextMessage(content=f"分析以下数据:{sensitive_data}")
)