Ollama Modelfile 参数详解:创建专属定制模型的完整指南
上篇文章说完怎么让模型跑起来,有个问题一直跟着我——回答太飘了。
怎么说呢,我问 llama3.2 一个简单的代码问题,它有时给我三行简洁答案,有时给我写一篇论文。温度参数调到 0.8,它开始”创意发挥”;调到 0.1,它又变得死板,像在背书。更头疼的是每次对话都要重新设置 system prompt,复制粘贴到想吐。
后来我发现 Ollama 有个东西叫 Modelfile。说白了就是给模型写一份”性格简历”——一次配置,永久生效。这篇文章我把自己踩过的坑和调试经验整理出来,包括 10 个核心参数的调优建议,还有 4 个可以直接用的实战模板。
如果你还没装过 Ollama,建议先看上一篇入门文章。这篇是进阶内容,默认你已经会 ollama run 了。
一、Modelfile 是什么,为什么需要它
Modelfile 就像是模型的”配置蓝图”,跟 Dockerfile 的概念差不多——你告诉 Ollama 用哪个模型做基础,设置什么参数,系统提示词写什么,然后给它起个名字。之后每次用这个名字调用,所有配置自动生效。
简单说,它解决三个痛点:
痛点一:每次都要重复设置
你肯定遇到过这种情况:打开终端,ollama run llama3.2,然后打一句 system prompt。第二天再来一次。第三天又来……烦不烦?Modelfile 把这些固定配置写死,一次配置,终身有效。
痛点二:输出风格不稳定
同一个模型,不同参数设置下,输出天差地别。代码助手需要稳定输出,创意写作需要多样发挥。你不可能每次都记住”哦对了,这个任务要用 temperature 0.3,那个要用 0.8”——Modelfile 直接帮你存好预设。
痛点三:模型变体管理
你想要一个”代码审查版 llama3.2”,一个”写作助手版 llama3.2”,一个”JSON输出版 llama3.2”。怎么办?复制三份模型?不用。用 Modelfile 创建三个命名变体就行,底层还是同一个模型文件,只是配置不同。
基本流程就三步:
# 1. 创建一个 Modelfile 文件
echo 'FROM llama3.2
SYSTEM "你是一个代码审查专家"' > Modelfile
# 2. 用 ollama create 生成新模型
ollama create my-coder -f Modelfile
# 3. 直接运行
ollama run my-coder
就这么简单。接下来详细说说 Modelfile 里面能写什么。
二、Modelfile 结构与 8 大指令
Modelfile 的语法很简单:注释用 #,指令用大写单词开头。类似这样:
# 这是一个注释
FROM llama3.2
PARAMETER temperature 0.8
SYSTEM "你是一个友好的助手"
整个文件就两种东西:注释和指令。指令又分为 8 种,我先给你一个全景图:
| 指令 | 作用 | 必需吗 | 什么时候用 |
|---|---|---|---|
| FROM | 指定基础模型 | 必需 | 每个文件必须有 |
| PARAMETER | 设置推理参数 | 可选 | 调整温度、上下文等 |
| TEMPLATE | 提示词模板 | 可选 | 自定义对话格式 |
| SYSTEM | 系统消息 | 可选 | 设定角色和行为 |
| ADAPTER | 加载 LoRA 适配器 | 可选 | 模型微调时用 |
| LICENSE | 许可声明 | 可选 | 发布模型时需要 |
| MESSAGE | 预设对话历史 | 可选 | few-shot 示例 |
| REQUIRES | 版本要求 | 可选 | 特定版本功能 |
说实话,日常使用 90% 的情况只需要 FROM、PARAMETER 和 SYSTEM 这仨。其他的等遇到具体需求再看。
FROM 指令的三种用法
FROM 是唯一必需的指令,有三种写法:
写法一:用模型名(最常见)
FROM llama3.2
FROM llama3.2:3b
FROM mistral:latest
直接用 Ollama 支持的模型名就行。冒号后面是版本标签,不写默认 latest。
写法二:用本地 GGUF 文件
FROM ./my-model.gguf
如果你从别处下载了 GGUF 格式的模型文件,可以直接指向它。
写法三:用 Safetensors 目录
FROM ./my-safetensors-dir
这种情况比较少见,一般是从 Hugging Face 下载的模型原始格式。
好,基础结构说完了。接下来是重头戏——PARAMETER 参数。
三、PARAMETER 参数详解
这部分是整篇文章最干货的地方。我把自己调参数踩过的坑都整理出来,给你一个可以直接抄的配置表。
先看完整的参数清单:
| 参数 | 默认值 | 类型 | 干啥用的 | 怎么调 |
|---|---|---|---|---|
| temperature | 0.8 | float | 控制随机性,越高越”放飞” | 代码 0.3,创意 1.0 |
| num_ctx | 2048 | int | 上下文窗口大小 | 长文档用 4096-8192 |
| top_k | 40 | int | 只从概率最高的 K 个词里选 | 一般不动,除非输出太乱 |
| top_p | 0.9 | float | 核采样,控制多样性 | 和 temperature 配合用 |
| min_p | 0.0 | float | 过滤掉概率太低的词 | 高质量输出设 0.05 |
| seed | 0 | int | 固定随机种子,复现输出 | 测试时设 42 或固定值 |
| stop | 无 | string | 看到这个就停止生成 | 多个 stop 可以叠加 |
| num_predict | -1 | int | 最大输出长度,-1 表示不限 | 限制输出设 100-500 |
| repeat_penalty | 1.1 | float | 惩罚重复内容 | 长文生成提高到 1.5 |
| repeat_last_n | 64 | int | 检测最近 N 个词是否重复 | 和 repeat_penalty 配合 |
下面我挑几个最重要的参数详细说说。
temperature:创造性 vs 稳定性
这是最容易理解的参数。temperature 高(比如 1.0),模型会”放飞自我”,选择概率较低但更有创意的词;temperature 低(比如 0.1),模型会变得保守,只选概率最高的词,输出更稳定。
我测试过 llama3.2 在不同 temperature 下回答同一个问题的差异:
问:Python 如何读取文件?
- temperature 0.1:输出像教科书,只有最标准答案
- temperature 0.5:会补充一些实用提示,比如”注意编码问题”
- temperature 0.8:可能会讲到不同场景的不同方法,甚至举例
- temperature 1.0:回答五花八门,有时会偏离主题
我的经验:
- 写代码、技术问答:0.3 左右,要稳定
- 创意写作、头脑风暴:0.8-1.0,需要惊喜
- JSON 输出、固定格式:0.1-0.2,要精准
num_ctx:上下文窗口
这个参数决定了模型能”记住”多少内容。默认 2048 tokens,大概是 1500-2000 个汉字。
你想让它读一篇长文章然后总结?2048 可能不够。你聊了很久的对话,它突然忘记前面的内容?大概率是 num_ctx 太小。
重要提醒:num_ctx 调大会占用更多内存。我测试 llama3.2 时,num_ctx 从 2048 调到 8192,内存占用翻了一倍多。如果你的机器只有 8GB 内存,调到 4096 就差不多了。
我的经验:
- 短对话、简单问答:2048 默认够用
- 代码审查、技术讨论:4096 比较舒服
- 长文档处理、小说写作:8192(前提是内存够)
stop:停止序列
这个参数很好用——告诉模型”看到这个就停”。
比如你让模型输出 JSON,担心它输出太多废话:
PARAMETER stop "\n\n"
PARAMETER stop "```"
模型看到两个换行或者代码块符号就会停止,输出更干净。
stop 可以叠加多个,这点很多人不知道。
repeat_penalty:防止废话
模型有个毛病:容易重复说同一句话。repeat_penalty 就是用来惩罚重复内容的。
默认值 1.1,我已经觉得不够用了。让它写长文章时,我一般设到 1.3-1.5,能有效减少”正如前面所说”、“综上所述”这类废话。
不同场景的参数对比表
我总结了四种常见场景的最佳配置,你可以直接抄:
| 场景 | temperature | num_ctx | 其他参数建议 |
|---|---|---|---|
| 代码助手 | 0.3 | 4096 | stop ”```”, seed 42(方便复现) |
| 创意写作 | 1.0 | 2048 | top_p 0.95, repeat_penalty 1.5 |
| 技术问答 | 0.5 | 4096 | min_p 0.05(过滤低质量词) |
| JSON 输出 | 0.1 | 2048 | stop “\n\n”, stop ”```” |
看到这里,你应该对每个参数有概念了。接下来是实战环节——我给你四个可以直接用的 Modelfile 模板。
四、实战案例:4 个完整 Modelfile
理论说完了,直接上代码。这四个模板我都实际测试过,你可以复制粘贴后直接运行。
案例 1:角色扮演——猪八戒助手
这是我做的一个好玩的小模型,专门模仿猪八戒说话:
# 猪八戒助手 Modelfile
FROM llama3.2
SYSTEM """你是西游记中的猪八戒,说话风格要幽默、接地气。
回答问题时:
- 偶尔抱怨师傅太唠叨
- 提到吃的会很兴奋
- 用"俺老猪"自称
- 遇到困难会说"散伙算了"""
PARAMETER temperature 0.8
PARAMETER num_ctx 2048
为什么这样配置:
temperature 设 0.8,让猪八戒说话更有”性格”,不会太死板。SYSTEM 里写了具体的行为规则——提到吃的要兴奋、用”俺老猪”自称——这些细节让角色更鲜活。
使用方法:
ollama create pig-bajie -f Modelfile
ollama run pig-bajie
你可以试着问它:“如何学好编程?“看看它怎么回答。
案例 2:专业助手——Python 代码审查
这个是我日常工作用的配置,专门审查代码:
# Python 代码审查助手 Modelfile
FROM llama3.2:3b
SYSTEM """你是资深 Python 开发者,审查代码时关注:
1. 类型安全——是否有潜在的类型错误
2. 异常处理——边界情况是否覆盖
3. 性能瓶颈——有没有不必要的循环或重复计算
4. 安全隐患——敏感数据是否暴露
回复格式:
问题 → 影响 → 建议 → 代码示例"""
PARAMETER temperature 0.3
PARAMETER num_ctx 8192
PARAMETER seed 42
为什么这样配置:
temperature 0.3 保证输出稳定——审查代码不需要”创意发挥”。num_ctx 设 8192 因为代码文件可能很长。seed 42 是为了复现——同样的问题给出同样的建议,方便对比测试。
使用效果:我把一段几百行的 Python 代码丢进去,它会按照”问题→影响→建议→示例”的格式给出清晰的审查报告。
案例 3:结构化输出——JSON 格式
如果你需要把模型的输出喂给其他程序,JSON 格式最方便:
# JSON 输出助手 Modelfile
FROM llama3.2
SYSTEM """你的输出必须是合法的 JSON 格式。
分析结果格式:
{"result": "分析内容", "confidence": 0-100, "tags": ["标签1", "标签2"]}
不要输出任何其他内容,不要加代码块标记。"""
PARAMETER temperature 0.1
PARAMETER num_ctx 2048
PARAMETER stop "\n\n"
PARAMETER stop "```"
MESSAGE user 分析这段代码的安全风险
MESSAGE assistant {"result": "存在 SQL 注入风险,用户输入未过滤", "confidence": 85, "tags": ["安全", "SQL"]}
为什么这样配置:
temperature 0.1 是为了输出最稳定——JSON 格式容不得半点偏差。stop 参数过滤掉换行和代码块符号,防止模型输出多余内容。MESSAGE 部分是一个 few-shot 示例——告诉模型”输出要像这样”。
这个配置我用在自动化流程里:把错误日志丢给模型,它输出结构化的分析结果,然后程序自动处理。
案例 4:长上下文——文档摘要
处理长文章时,上下文窗口要够大:
# 文档摘要助手 Modelfile
FROM llama3.2
SYSTEM """你是文档摘要专家,输出要求:
- 总结不超过 5 个要点
- 每个要点不超过 50 字
- 先提取核心观点,再补充细节
- 使用中文输出"""
PARAMETER temperature 0.5
PARAMETER num_ctx 8192
PARAMETER num_predict 300
为什么这样配置:
temperature 0.5——摘要需要稳定,但也不能太死板(太低会把摘要写成流水账)。num_ctx 8192 确保能处理长文档。num_predict 300 限制输出长度——摘要不应该比原文还长。
我用这个配置处理技术文章:把一篇 3000 字的文章丢进去,它给我 5 个要点,每个 50 字以内,读起来效率高多了。
小结
这四个模板覆盖了常见需求。你可以根据自己需要修改 SYSTEM 内容或者调整参数——反正 Modelfile 改完重新 ollama create 就行,调试成本很低。
五、TEMPLATE 和 MESSAGE 进阶
前面几个案例都没用到 TEMPLATE,因为这个参数属于”进阶功能”——当你需要精细控制对话格式时才用。
TEMPLATE 的 Go template 语法
Ollama 使用 Go 的 template 语法,三个关键变量:
{{ .System }}—— 你的 SYSTEM 内容{{ .Prompt }}—— 用户输入{{ .Response }}—— 模型输出(用来定义输出格式)
一个简单的例子:
FROM llama3.2
TEMPLATE """{{ .System }}
用户问题:{{ .Prompt }}
回答:{{ .Response }}"""
SYSTEM "你是一个技术专家"
这个 TEMPLATE 定义了对话的结构:先放 SYSTEM 内容,再放用户问题,最后是模型的回答。
说实话,大部分情况下不需要自定义 TEMPLATE——Ollama 的默认模板已经够用了。什么时候需要改?
场景一:集成其他工具
你把 Ollama 接到某个聊天系统,它有特定的输入格式要求。这时候用 TEMPLATE 做适配。
场景二:特殊对话格式
你想让对话有”前缀”,比如每句话开头加 [AI] 或者 [USER],可以用 TEMPLATE 实现。
MESSAGE:预设对话历史
MESSAGE 的作用是”给模型看几个例子”。前面的 JSON 输出案例就用到了:
MESSAGE user 分析这段代码的安全风险
MESSAGE assistant {"result": "存在 SQL 注入风险", "confidence": 85}
这相当于告诉模型:“用户问这种问题,你应该这样回答”——few-shot 学习的概念。
你可以预设多条对话历史:
MESSAGE user 你好
MESSAGE assistant 你好,有什么我可以帮你的?
MESSAGE user 天气怎么样
MESSAGE assistant 我不知道实时天气,建议你查看天气应用。
模型启动时就会”记住”这些对话,之后的新对话会延续这个风格。
如何查看模型的 Modelfile
如果你想看看某个模型的 Modelfile 是怎么写的,可以用这个命令:
ollama show --modelfile llama3.2
输出内容很长,包含模型默认的所有配置。复制出来修改,就能创建你的定制版本。
这个命令特别有用——当你看到一个效果很好的模型(比如别人分享的定制版),用 ollama show 导出它的 Modelfile,学习人家是怎么配置的。
六、常见问题与避坑指南
调参数这事,踩坑是必经之路。我把遇到的几个典型问题整理出来,给你避雷。
问题一:temperature 调太低,输出像背书
有人以为 temperature 越低越好——输出稳定嘛。我一开始也这么想,把代码助手的 temperature 设到 0.05。
结果呢?模型回答问题像在背诵标准答案,没有任何灵活性。问它”Python 怎么读文件”,它给我三种方法,但每个方法都是教科书式的标准写法,没有任何实用提示。
我的教训:temperature 不是越低越好。代码审查用 0.3 就够了,低于 0.2 会变得死板。你想要精准输出(比如 JSON),确实要低,但日常对话没必要。
问题二:num_ctx 调太大,内存爆了
有一次我心血来潮,把 num_ctx 设到 16384——想让它处理超长文档。运行了几分钟后,系统开始疯狂 swap,整个机器卡得动不了。
我的机器只有 16GB 内存。llama3.2:3b 本身占用大概 2GB,num_ctx 从 2048 调到 16384,内存占用直接翻到 8GB 多。再加上其他程序……
教训:num_ctx 不是随便往上调的。根据你的内存情况来:
- 8GB 内存:num_ctx 最多 4096
- 16GB 内存:num_ctx 可以到 8192
- 32GB 以上:才有条件试 16384
问题三:SYSTEM 和 MESSAGE 搞混
这两个指令作用不同,容易混淆:
- SYSTEM:永久生效的角色设定,每次对话都会带着
- MESSAGE:预设的对话历史,相当于 few-shot 示例
举个例子:你想让模型扮演代码审查专家,SYSTEM 写角色定义,MESSAGE 写几个问答示例。
很多人只写 SYSTEM,不写 MESSAGE,结果模型”知道自己是代码审查专家”,但不知道该怎么回答具体问题。加几条 MESSAGE 示例后,输出质量明显好多了。
问题四:创建后想更新怎么办
Modelfile 创建的模型,想改配置怎么办?
简单——重新 ollama create 同名覆盖:
# 第一次创建
ollama create my-coder -f Modelfile
# 想改配置?修改 Modelfile 后再跑一次
ollama create my-coder -f Modelfile
Ollama 会直接覆盖同名模型,不需要先删除。当然,如果你不想覆盖,换个名字就行:
ollama create my-coder-v2 -f Modelfile
问题五:如何复现别人的 Modelfile
看到别人分享的定制模型效果不错,想学习人家怎么配置的:
# 先拉取那个模型
ollama pull someone-elses-model
# 导出它的 Modelfile
ollama show --modelfile someone-elses-model > learned-modelfile
# 查看、学习、修改
cat learned-modelfile
这个命令我经常用——从社区的定制模型里学到不少参数调优技巧。
总结
说了这么多,Modelfile 的核心逻辑就一句话:把配置固化下来,避免每次手动调整。
给你三个立刻可以做的事:
1. 创建一个角色扮演模型
试试猪八戒助手的模板,或者换成你喜欢的人物(比如哆啦A梦、钢铁侠)。运行几轮对话,感受 temperature 参数对输出风格的影响。
2. 对比不同参数的输出
同一个问题,用 temperature 0.3 和 0.8 分别跑一次,看看输出有什么差异。这个实验我做过很多次,每次都有新发现。
3. 找一个你常用的场景
代码审查、文档摘要、创意写作——选一个你日常会用的场景,把上面的模板改成你需要的版本。调试几轮后,你会有一个专属的定制模型。
下一篇我会讲 Ollama 的 API 集成——怎么把本地模型接到你的程序里,用 OpenAI 兼容接口调用。Modelfile 配好之后,API 调用会更稳定——参数不需要在代码里传递,直接用定制模型就行。
有问题可以留言,我踩过的坑可能能帮你避开几个。
创建 Ollama 定制模型
使用 Modelfile 配置并创建专属模型
⏱️ 预计耗时: 10 分钟
- 1
步骤1: 创建 Modelfile 文件
新建一个名为 Modelfile 的文本文件,写入基础配置:
• FROM llama3.2(指定基础模型)
• SYSTEM "你的系统提示词"(定义角色)
• PARAMETER temperature 0.3(设置温度参数) - 2
步骤2: 生成定制模型
在终端运行创建命令:
```bash
ollama create my-model -f Modelfile
```
my-model 是你给模型起的名字,可以自定义。 - 3
步骤3: 运行并测试
直接运行创建好的模型:
```bash
ollama run my-model
```
测试几个问题,观察输出是否符合预期。 - 4
步骤4: 迭代优化
如果输出不理想:
• 调整 temperature 参数(代码0.3/创意0.8)
• 修改 SYSTEM 提示词
• 添加 MESSAGE 示例
修改后重新运行 `ollama create my-model -f Modelfile` 覆盖即可。
常见问题
Modelfile 和直接设置参数有什么区别?
temperature 参数应该设置多少?
• 代码审查、技术问答:0.3 左右,输出稳定
• 创意写作、头脑风暴:0.8-1.0,增加多样性
• JSON 输出、固定格式:0.1-0.2,确保精准
低于 0.2 会变得死板,高于 1.0 可能偏离主题。
num_ctx 调大会占用多少内存?
• 8GB 内存:num_ctx 最多 4096
• 16GB 内存:num_ctx 可以到 8192
• 32GB 以上:可尝试 16384
建议根据实际内存情况逐步调整测试。
如何查看已有模型的 Modelfile?
SYSTEM 和 MESSAGE 有什么区别?
• SYSTEM:定义模型的角色和行为规则,每次对话都生效
• MESSAGE:预设对话历史,用于 few-shot 示例
建议同时使用,SYSTEM 定义角色,MESSAGE 给出几个问答示例。
创建后想修改参数怎么办?
14 分钟阅读 · 发布于: 2026年4月5日 · 修改于: 2026年4月5日
相关文章
Ollama + Open WebUI:搭建本地 ChatGPT 界面(完整指南)
Ollama + Open WebUI:搭建本地 ChatGPT 界面(完整指南)
Ollama API 调用:从 curl 到 OpenAI SDK 兼容接口
Ollama API 调用:从 curl 到 OpenAI SDK 兼容接口
Ollama 模型管理:下载、切换、删除与版本控制完全指南

评论
使用 GitHub 账号登录后即可评论