Chapter 03

Modelfile 自定义模型

Modelfile 是 Ollama 的模型蓝图文件,类比 Docker 的 Dockerfile。通过 Modelfile,你可以定制模型行为、固化系统提示词、调整生成参数,打造完全属于自己的专属 AI 助手。

Modelfile 核心语法

Modelfile 是一个纯文本文件,包含若干条指令。每条指令以关键字开头,定义模型的不同方面:

FROM — 基础模型(必须,第一条指令)
指定要派生的基础模型,可以是 Ollama 库中的模型名称,也可以是本地 GGUF 文件路径。派生意味着继承基础模型的所有权重,然后通过其他指令覆盖配置。
SYSTEM — 系统提示词
注入到每次对话开始前的系统级指令,用于设定 AI 的角色、行为边界、回复风格等。SYSTEM 内容对用户不可见,但对模型的行为影响极大。这是定制 AI 助手性格的核心手段。
PARAMETER — 生成参数
覆盖模型默认的生成超参数,控制输出的随机性、多样性和长度。每行一个参数,格式为 PARAMETER 参数名 值
TEMPLATE — 聊天模板
定义用户消息和助手消息如何格式化后输入给模型。通常不需要手动设置(基础模型已内置正确模板),只有从原始 GGUF 文件创建时才需要指定。
MESSAGE — 预置对话示例
在 SYSTEM 之后注入示例对话(few-shot prompting),帮助模型学习期望的回复格式和风格。格式:MESSAGE user 用户说的话 / MESSAGE assistant 助手的回答
# Modelfile 完整结构示例

# FROM:必须是第一条指令
FROM llama3.2  # 使用已下载的 Ollama 模型
# FROM /path/to/model.gguf  # 或本地 GGUF 文件

# SYSTEM:设定角色和行为规范
SYSTEM """
你是一个专业的全栈开发工程师,专注于 Python 和 TypeScript。
回答规范:
1. 优先给出可运行的代码示例
2. 代码必须包含类型注解和注释
3. 对每个关键概念给出简短解释
4. 若问题超出技术范围,礼貌说明你只回答技术问题
语言:始终用中文回答,代码注释也用中文
"""

# PARAMETER:调整生成行为
PARAMETER temperature 0.3    # 低随机性,代码更稳定
PARAMETER top_p 0.9           # 核采样
PARAMETER top_k 40            # 保留概率最高的 40 个 token
PARAMETER num_ctx 8192        # 上下文窗口长度
PARAMETER repeat_penalty 1.1  # 避免重复

# MESSAGE:few-shot 示例(可选)
MESSAGE user 帮我写一个读取 JSON 文件的函数
MESSAGE assistant """
```python
import json
from pathlib import Path
from typing import Any

def read_json(file_path: str | Path) -> Any:
    """读取 JSON 文件并返回解析后的数据。"""
    path = Path(file_path)
    if not path.exists():
        raise FileNotFoundError(f"文件不存在: {file_path}")
    with open(path, encoding="utf-8") as f:
        return json.load(f)
```
"""

关键生成参数详解

理解各参数的作用,才能精确调控模型输出风格:

参数默认值取值范围作用与调优建议
temperature0.80.0 – 2.0控制随机性。0=确定性,1=正常,>1=更随机。代码任务设 0.1–0.3,创意写作设 0.8–1.2
top_p0.90.0 – 1.0核采样:只考虑概率之和达到 top_p 的 token。与 temperature 配合,通常二选一调整
top_k401 – 100+每步只从概率最高的 k 个 token 中采样。越小输出越保守
num_ctx2048512 – 131072上下文长度(Token)。越大能记住更长对话,但成比例增加内存
repeat_penalty1.11.0 – 1.5惩罚重复 token,防止模型陷入循环。1.0=不惩罚,1.3=强惩罚
num_predict-1-1 (无限) / 正整数最大生成 token 数。-1=不限制
seed随机任意整数固定随机种子,相同输入每次输出相同(可复现结果)

实战:构建编程助手

以下是一个完整的生产级编程助手 Modelfile,限制模型只回答编程相关问题,并优化代码生成风格:

# 第一步:创建 Modelfile 文件
cat > ~/Modelfile.coder << 'EOF'
FROM qwen2.5-coder:7b

SYSTEM """
你是 CodePal,一个专业的编程助手。你的专长包括:
- Python、TypeScript/JavaScript、Go、Rust、SQL
- 数据结构与算法
- 系统设计与架构
- 代码审查与重构

行为规范:
1. 只回答与编程、软件开发、计算机科学相关的问题
2. 对于非技术问题,回复:"我只能回答编程和技术相关的问题,请重新提问"
3. 代码块必须指定语言标识(```python, ```typescript 等)
4. 复杂代码需附带解释,说明思路和关键点
5. 优先提供可直接运行的完整示例,避免伪代码
6. 指出代码中可能的边界情况和错误处理

回答语言:根据用户使用的语言自动切换(中文/英文)
"""

PARAMETER temperature 0.2
PARAMETER top_p 0.95
PARAMETER num_ctx 16384
PARAMETER repeat_penalty 1.05
EOF

# 第二步:基于 Modelfile 创建自定义模型
ollama create codepal -f ~/Modelfile.coder

# 输出:
# transferring model data
# creating model layer
# creating template layer
# creating system layer
# creating parameters layer
# writing manifest
# success

# 第三步:运行自定义模型
ollama run codepal
# >>> 帮我实现一个 LRU 缓存

# 验证模型已创建
ollama list
# NAME              ID              SIZE    MODIFIED
# codepal:latest    d8e5f3a1b2c4    4.7 GB  Just now

基于本地 GGUF 文件创建模型

Ollama 也支持直接从社区下载的 GGUF 文件创建模型,无需经过官方库:

# 从 Hugging Face 下载 GGUF 文件
# 例:下载 Llama 3.2 的 GGUF 版本
pip install huggingface_hub

python3 -c "
from huggingface_hub import hf_hub_download
hf_hub_download(
    repo_id='bartowski/Llama-3.2-3B-Instruct-GGUF',
    filename='Llama-3.2-3B-Instruct-Q4_K_M.gguf',
    local_dir='./models'
)
"

# 创建 Modelfile 引用本地文件
cat > Modelfile.local << 'EOF'
FROM ./models/Llama-3.2-3B-Instruct-Q4_K_M.gguf

TEMPLATE """{{ if .System }}<|start_header_id|>system<|end_header_id|>

{{ .System }}<|eot_id|>{{ end }}{{ if .Prompt }}<|start_header_id|>user<|end_header_id|>

{{ .Prompt }}<|eot_id|>{{ end }}<|start_header_id|>assistant<|end_header_id|>

{{ .Response }}<|eot_id|>"""

SYSTEM "你是一个有帮助的 AI 助手,用中文回答问题。"
PARAMETER temperature 0.7
PARAMETER stop "<|eot_id|>"
EOF

# 创建模型
ollama create my-llama3 -f Modelfile.local

发布模型到 Ollama 库

如果你创建了有价值的自定义模型,可以发布到 Ollama 官方库与社区共享:

# 前提:在 ollama.com 注册账号,用户名为 yourname

# 1. 用你的用户名前缀命名模型
ollama create yourname/codepal-zh -f ~/Modelfile.coder

# 2. 登录 Ollama(需要在 ollama.com 生成 key)
ollama login

# 3. 推送到官方库
ollama push yourname/codepal-zh

# 4. 他人即可通过以下命令安装你的模型
# ollama pull yourname/codepal-zh

# 复制现有模型(本地重命名)
ollama cp codepal codepal-backup
Modelfile 调优最佳实践 1. SYSTEM 提示词越具体越好,用编号列出具体规则而非泛泛描述。2. temperature 对代码任务设 0.1-0.3,对创意任务设 0.7-1.0。3. num_ctx 设置为实际需求的 1.5 倍(如最长对话 4000 token,设 6144)。4. 使用 MESSAGE 注入 2-3 个高质量示例,效果远超冗长的 SYSTEM 描述。
SYSTEM 提示词注意事项 SYSTEM 指令通过 Modelfile 固化,不会在每次对话中出现在用户可见的消息列表中,但确实会被模型看到。对于安全敏感场景,需要知道:本地模型没有内容过滤层,SYSTEM 的限制指令可能被特定格式的 prompt 绕过。不要依赖 SYSTEM 作为唯一的安全屏障。
本章小结 Modelfile 是 Ollama 定制能力的核心。关键指令:FROM 指定基础模型,SYSTEM 设定角色,PARAMETER 调整生成行为,MESSAGE 注入示例。创建流程:写 Modelfile → ollama create 名称 -f 文件ollama run 名称。代码任务推荐 temperature 0.2,通用对话推荐 0.7。下一章深入 CLI 的高级使用技巧与批量处理脚本。