切换语言
切换主题

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 参数详解

这部分是整篇文章最干货的地方。我把自己调参数踩过的坑都整理出来,给你一个可以直接抄的配置表。

先看完整的参数清单:

参数默认值类型干啥用的怎么调
temperature0.8float控制随机性,越高越”放飞”代码 0.3,创意 1.0
num_ctx2048int上下文窗口大小长文档用 4096-8192
top_k40int只从概率最高的 K 个词里选一般不动,除非输出太乱
top_p0.9float核采样,控制多样性和 temperature 配合用
min_p0.0float过滤掉概率太低的词高质量输出设 0.05
seed0int固定随机种子,复现输出测试时设 42 或固定值
stopstring看到这个就停止生成多个 stop 可以叠加
num_predict-1int最大输出长度,-1 表示不限限制输出设 100-500
repeat_penalty1.1float惩罚重复内容长文生成提高到 1.5
repeat_last_n64int检测最近 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,能有效减少”正如前面所说”、“综上所述”这类废话。

不同场景的参数对比表

我总结了四种常见场景的最佳配置,你可以直接抄:

场景temperaturenum_ctx其他参数建议
代码助手0.34096stop ”```”, seed 42(方便复现)
创意写作1.02048top_p 0.95, repeat_penalty 1.5
技术问答0.54096min_p 0.05(过滤低质量词)
JSON 输出0.12048stop “\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

    步骤1: 创建 Modelfile 文件

    新建一个名为 Modelfile 的文本文件,写入基础配置:

    • FROM llama3.2(指定基础模型)
    • SYSTEM "你的系统提示词"(定义角色)
    • PARAMETER temperature 0.3(设置温度参数)
  2. 2

    步骤2: 生成定制模型

    在终端运行创建命令:

    ```bash
    ollama create my-model -f Modelfile
    ```

    my-model 是你给模型起的名字,可以自定义。
  3. 3

    步骤3: 运行并测试

    直接运行创建好的模型:

    ```bash
    ollama run my-model
    ```

    测试几个问题,观察输出是否符合预期。
  4. 4

    步骤4: 迭代优化

    如果输出不理想:

    • 调整 temperature 参数(代码0.3/创意0.8)
    • 修改 SYSTEM 提示词
    • 添加 MESSAGE 示例

    修改后重新运行 `ollama create my-model -f Modelfile` 覆盖即可。

常见问题

Modelfile 和直接设置参数有什么区别?
Modelfile 把配置固化下来,一次创建永久生效。直接设置参数(如 ollama run 时传递)每次都要重复,而且无法保存 SYSTEM 提示词等复杂配置。
temperature 参数应该设置多少?
根据场景选择:

• 代码审查、技术问答:0.3 左右,输出稳定
• 创意写作、头脑风暴:0.8-1.0,增加多样性
• JSON 输出、固定格式:0.1-0.2,确保精准

低于 0.2 会变得死板,高于 1.0 可能偏离主题。
num_ctx 调大会占用多少内存?
根据模型大小和 num_ctx 值不同,大致参考:

• 8GB 内存:num_ctx 最多 4096
• 16GB 内存:num_ctx 可以到 8192
• 32GB 以上:可尝试 16384

建议根据实际内存情况逐步调整测试。
如何查看已有模型的 Modelfile?
使用命令 `ollama show --modelfile 模型名` 可以导出模型的完整 Modelfile 配置,方便学习或修改。
SYSTEM 和 MESSAGE 有什么区别?
两者作用不同:

• SYSTEM:定义模型的角色和行为规则,每次对话都生效
• MESSAGE:预设对话历史,用于 few-shot 示例

建议同时使用,SYSTEM 定义角色,MESSAGE 给出几个问答示例。
创建后想修改参数怎么办?
修改 Modelfile 文件后,重新运行 `ollama create 模型名 -f Modelfile` 即可覆盖同名模型,无需删除。如果想保留原版本,可以用不同的模型名。

14 分钟阅读 · 发布于: 2026年4月5日 · 修改于: 2026年4月5日

评论

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

相关文章