Modelfile 是 Ollama 定义自定义模型的核心配置文件。深入介绍 Modelfile 的所有指令,包括 FROM、PARAMETER、TEMPLATE、SYSTEM 等。
| 指令 | 说明 | 必需 |
|---|---|---|
| FROM | 指定基础模型 | 是 |
| PARAMETER | 设置模型参数 | 否 |
| TEMPLATE | 定义对话模板 | 否 |
| SYSTEM | 设置系统提示词 | 否 |
| ADAPTER | 指定适配器文件 | 否 |
| LICENSE | 声明许可证 | 否 |
| MESSAGE | 预设对话消息 | 否 |
指定构建自定义模型的基础模型。
FROM <模型名>:<标签>
或使用本地文件:
FROM <文件路径>
FROM llama3.2
FROM llama3.2:3b
FROM qwen2.5:7b
FROM ./models/my-model.gguf
FROM my-custom-model
设置模型运行时的参数。
PARAMETER <参数名> <值>
控制输出随机性:
PARAMETER temperature 0.7
| 值 | 效果 |
|---|---|
| 0.0 | 最确定,输出最稳定 |
| 0.5 | 平衡 |
| 1.0 | 默认值 |
| 2.0 | 最随机 |
核采样参数:
PARAMETER top_p 0.9
限制候选词数量:
PARAMETER top_k 40
上下文窗口大小:
PARAMETER num_ctx 4096
最大生成 token 数:
PARAMETER num_predict 512
| 值 | 说明 |
|---|---|
| -1 | 无限制 |
| -2 | 无限制但会自动停止 |
| 正数 | 限制最大数量 |
设置停止词:
PARAMETER stop "###"
PARAMETER stop "<|end|>"
可以设置多个停止词。
重复惩罚:
PARAMETER repeat_penalty 1.1
值越大,越不容易重复。
重复惩罚的窗口大小:
PARAMETER repeat_last_n 64
随机种子:
PARAMETER seed 42
设置后输出可复现。
Mirostat 采样:
PARAMETER mirostat 0
| 值 | 说明 |
|---|---|
| 0 | 禁用 |
| 1 | Mirostat 1 |
| 2 | Mirostat 2 |
Mirostat 学习率:
PARAMETER mirostat_eta 0.1
Mirostat 目标熵:
PARAMETER mirostat_tau 5.0
保留的初始 token 数:
PARAMETER num_keep 0
批处理大小:
PARAMETER num_batch 512
GPU 层数:
PARAMETER num_gpu 35
主 GPU 设备:
PARAMETER main_gpu 0
低显存模式:
PARAMETER low_vram false
使用 FP16 存储键值:
PARAMETER f16_kv true
输出所有 token 的 logits:
PARAMETER logits_all false
仅加载词汇表:
PARAMETER vocab_only false
使用内存映射:
PARAMETER use_mmap true
锁定内存:
PARAMETER use_mlock false
仅用于嵌入:
PARAMETER embedding_only false
RoPE 基础频率:
PARAMETER rope_frequency_base 10000.0
RoPE 频率缩放:
PARAMETER rope_frequency_scale 1.0
PARAMETER temperature 0.7
PARAMETER top_p 0.9
PARAMETER top_k 40
PARAMETER num_ctx 4096
PARAMETER repeat_penalty 1.1
定义对话的格式模板。
TEMPLATE """模板内容"""
| 变量 | 说明 |
|---|---|
| .System | 系统提示词 |
| .Prompt | 用户输入 |
| .First | 是否第一条消息 |
| .Messages | 消息历史 |
TEMPLATE """{{ .System }}
User: {{ .Prompt }}
Assistant:"""
TEMPLATE """{{ .System }}
{{ range .Messages }}
{{ if eq .Role "user" }}User: {{ .Content }}{{ end }}
{{ if eq .Role "assistant" }}Assistant: {{ .Content }}{{ end }}
{{ end }}
Assistant:"""
TEMPLATE """<|begin_of_text|><|start_header_id|>system<|end_header_id|>
{{ .System }}<|eot_id|><|start_header_id|>user<|end_header_id|>
{{ .Prompt }}<|eot_id|><|start_header_id|>assistant<|end_header_id|>
"""
设置系统提示词。
SYSTEM <提示词>
或使用多行:
SYSTEM """多行
提示词
内容"""
SYSTEM 你是一个有帮助的助手。
SYSTEM """你是一个专业的编程助手。
你的职责:
1. 编写高质量代码
2. 解释代码原理
3. 提供最佳实践"""
预设对话消息,用于 few-shot 学习。
MESSAGE <角色> <内容>
角色可以是:user、assistant、system
FROM llama3.2
SYSTEM 你是一个翻译助手。
MESSAGE user 你好
MESSAGE assistant Hello
MESSAGE user 谢谢
MESSAGE assistant Thank you
这样模型会学习这些示例的回复风格。
指定 LoRA 适配器文件。
ADAPTER <文件路径>
FROM llama3.2
ADAPTER ./my-adapter.bin
声明模型的许可证。
LICENSE """许可证内容"""
LICENSE """MIT License
Copyright (c) 2024
Permission is hereby granted..."""
使用 # 添加注释:
# 这是一个注释
FROM llama3.2 # 行尾注释
# 参数配置
PARAMETER temperature 0.7 # 控制随机性
# 基于 Llama 3.2 创建编程助手
FROM llama3.2:3b
# 系统提示词
SYSTEM """你是一个专业的 Python 编程助手。
你的职责:
1. 编写高质量的 Python 代码
2. 解释代码的工作原理
3. 遵循 PEP 8 编码规范
4. 提供最佳实践建议"""
# 参数配置
PARAMETER temperature 0.3
PARAMETER top_p 0.9
PARAMETER num_ctx 4096
PARAMETER repeat_penalty 1.1
# 停止词
PARAMETER stop "<|end|>"
PARAMETER stop "<|eot_id|>"
# 预设示例
MESSAGE user 写一个快速排序
MESSAGE assistant ```python
def quick_sort(arr):
if len(arr) <= 1:
return arr
pivot = arr[len(arr) // 2]
left = [x for x in arr if x < pivot]
middle = [x for x in arr if x == pivot]
right = [x for x in arr if x > pivot]
return quick_sort(left) + middle + quick_sort(right)
这是一个经典的快速排序实现。
LICENSE """MIT License"""
## 调试技巧
### 查看模型的 Modelfile
```bash
ollama show my-model --modelfile
创建模型时会自动验证:
ollama create test-model -f Modelfile
如果有语法错误会提示。
创建多个版本对比效果:
# 版本 1
ollama create test-v1 -f Modelfile.v1
# 版本 2
ollama create test-v2 -f Modelfile.v2
# 对比运行
ollama run test-v1
ollama run test-v2