4. 自定义模型(Modelfile):Modelfile语法详解、从基础模型创建自定义模型、设置系统提示词(SYSTEM)、配置对话模板(TEMPLATE)
好,咱们进入正题。前面几章我们把Ollama跑起来了,也调通了API。但说实话,直接用原版模型做客服,效果往往差强人意。为什么?因为通用模型不懂你的业务规则,也不知道自己是个客服。
这时候,Modelfile就派上用场了。它就像模型的「配方」,让你能基于现有模型,快速调教出一个专属的客服大脑。
核心思想:Modelfile 不是让你从零训练模型,而是通过「配置」来定制模型的行为。你只需要写一个文本文件,Ollama 就能帮你生成一个新模型。
4.1 Modelfile 语法详解
Modelfile 的语法,说白了就是「指令 + 参数」的组合。每条指令独占一行,参数紧跟其后。我刚开始看文档时觉得挺简单,但实际写起来有几个坑,咱们一个个说。
先看一个最简示例:
FROM llama3.2:1b
SYSTEM 你是一个专业的客服助手,请用中文回答用户问题。
TEMPLATE """{{ .System }}
用户: {{ .Prompt }}
助手: """
嗯,就这么几行,一个定制模型就定义好了。下面我把常用指令列出来:
| 指令 | 作用 | 必填 |
|---|---|---|
FROM |
指定基础模型(必填,且必须是第一条指令) | 是 |
SYSTEM |
设置系统提示词,定义模型角色和行为 | 推荐 |
TEMPLATE |
定义对话模板,控制输入输出格式 | 推荐 |
PARAMETER |
设置推理参数,如温度、上下文长度等 | 否 |
LICENSE |
嵌入许可证信息 | 否 |
MESSAGE |
预置对话历史,用于 few-shot 示例 | 否 |
我的习惯:每次写 Modelfile,我都会把 FROM 放在第一行,然后紧跟 SYSTEM,最后是 TEMPLATE。这个顺序最清晰,也最容易排查问题。
4.2 从基础模型创建自定义模型
创建过程分三步走,非常简单:
- 写一个 Modelfile(比如叫
MyModel.Modelfile) - 运行命令:
ollama create my-custom-model -f ./MyModel.Modelfile - 测试模型:
ollama run my-custom-model
举个例子。假设我们要做一个「售后客服」模型:
# 文件: after-sales.Modelfile
FROM llama3.2:1b
SYSTEM 你是一家电商公司的售后客服。你的职责是:
1. 耐心解答用户的退换货问题
2. 不要主动推荐商品
3. 如果用户情绪激动,先安抚再解决问题
4. 所有回答必须用中文
PARAMETER temperature 0.3
PARAMETER top_p 0.9
PARAMETER num_ctx 4096
然后执行:
ollama create after-sales-agent -f ./after-sales.Modelfile
等几秒钟,模型就创建好了。你可以用 ollama list 查看:
NAME ID SIZE MODIFIED
after-sales-agent:latest a1b2c3d4e5f6 1.2 GB 2 minutes ago
llama3.2:1b xyz789abc123 1.1 GB 1 hour ago
我曾经踩过的坑:第一次创建模型时,我把 FROM 写成了 FROM llama3.2:1b 但本地没下载这个模型。结果 ollama create 直接报错。记住,FROM 指定的模型必须先 ollama pull 到本地。
4.3 设置系统提示词(SYSTEM)
SYSTEM 指令是 Modelfile 的灵魂。它定义了模型的「人设」和「行为边界」。说白了,就是告诉模型:你是谁、该做什么、不该做什么。
我总结了一个写 SYSTEM 提示词的「三要三不要」原则:
- 要具体:别说「你是一个好客服」,要说「你负责处理退换货,退款金额超过500元需要请示主管」
- 要结构化:用编号列表,模型更容易遵循
- 要负面约束:明确告诉模型「不要做什么」
- 不要过长:超过500字,模型容易「迷失」
- 不要矛盾:比如既说「要热情」又说「不要闲聊」
- 不要用否定句式:模型对「不要」的理解不如「请」好
来看一个实际项目中的例子。我之前帮一家金融公司做客服系统,他们的 SYSTEM 是这样写的:
SYSTEM 你是XX银行的智能客服助手。
【核心规则】
1. 只回答与银行业务相关的问题(开户、转账、理财、贷款等)
2. 涉及金额、利率等数据时,必须加上「具体以网点公告为准」
3. 如果用户问及非银行业务,请回复:「我是银行客服助手,无法回答此问题」
4. 禁止透露任何客户隐私信息
5. 语气保持专业、礼貌,使用「您」称呼用户
为什么这样写有效?因为每条规则都是「可执行的指令」,而不是模糊的描述。模型看到「必须」「禁止」「请」这类词,执行率会高很多。
4.4 配置对话模板(TEMPLATE)
TEMPLATE 指令,很多人容易忽略。但它其实非常关键。它决定了模型如何理解「系统提示词」、「用户输入」和「历史对话」之间的关系。
不同的基础模型,对模板格式的要求不一样。比如:
- Llama 系列:通常用
[INST]和[/INST]包裹指令 - Mistral 系列:用
[INST]和[/INST]类似 - Qwen 系列:用
<|im_start|>和<|im_end|>
如果你不确定模板怎么写,有个笨办法:先 ollama show 模型名 --modelfile,看看原模型的模板长什么样,然后照着改。
下面是我常用的几个模板模板:
# 通用模板(适合大多数对话场景)
TEMPLATE """{{ .System }}
用户: {{ .Prompt }}
助手: """
# 带历史对话的模板
TEMPLATE """{{ .System }}
{{- range .Messages }}
{{ .Role }}: {{ .Content }}
{{- end }}
用户: {{ .Prompt }}
助手: """
# 指令跟随模板(适合 Llama 系列)
TEMPLATE """[INST] {{ .System }}
{{ .Prompt }} [/INST]"""
我的建议:如果你只是做客服系统,用第一个「通用模板」就够了。它简单、稳定,不容易出幺蛾子。等业务复杂了再考虑带历史对话的模板。
4.5 实战:构建一个完整的客服模型
好了,理论说完了。咱们动手做一个完整的「智能客服」模型。这个模型我实际用在过一个小型电商项目中,效果还不错。
# 文件: smart-cs.Modelfile
FROM llama3.2:1b
# 系统提示词:定义角色和行为
SYSTEM 你是一家在线教育平台的智能客服。
【核心职责】
1. 解答课程咨询(价格、课程内容、学习方式等)
2. 处理报名和退课问题
3. 如果用户问及技术问题(如无法播放视频),引导用户联系技术客服
4. 禁止主动推销课程,除非用户明确询问
5. 语气亲切、耐心,使用「您」和「~哦」等语气词
# 对话模板
TEMPLATE """{{ .System }}
用户: {{ .Prompt }}
客服: """
# 推理参数
PARAMETER temperature 0.4
PARAMETER top_p 0.85
PARAMETER num_ctx 4096
PARAMETER stop "用户:"
PARAMETER stop "客服:"
创建并测试:
ollama create smart-cs -f ./smart-cs.Modelfile
ollama run smart-cs
测试一下效果:
>>> 我想退课,怎么操作?
客服: 您好,退课操作很简单哦。您可以在「我的课程」页面找到需要退课的课程,点击「申请退课」按钮。退款会在3个工作日内原路返回。请问您还有其他问题吗?
嗯,效果不错。语气自然,回答也准确。
注意:如果你发现模型回答时「角色混乱」(比如突然说自己是AI而不是客服),多半是 TEMPLATE 写错了。检查一下模板中的角色名称是否和 SYSTEM 中的一致。
4.6 本章知识体系
下面这张图,帮你理清 Modelfile 的核心逻辑:
这张图展示了 Modelfile 的三大核心指令。FROM 是地基,SYSTEM 是灵魂,TEMPLATE 是骨架。三者缺一不可。
好了,关于 Modelfile 的内容就这些。你可能会觉得:「就这?这么简单?」嗯,确实不复杂。但越简单的东西,越容易在细节上翻车。我建议你动手写一个 Modelfile,跑一遍流程,遇到问题再回来看这章的内容。