通过提示词工程(Prompt Engineering)方法重新生成从Ollama下载的模型
从Ollama下载的模型,本质上是一些开源大模型(比如LLaMA、Mistral、Qwen、Gemma等)的量化权重,只是量化级别可能不同。这些权重本身在本地不能直接"在线学习"。
提示词工程(Prompt Engineering)是一种最简单、无需微调就可按照自己的要求将Ollama上的模型重新生成模型的方法。
Ollama模型文件(Modelfile)是一个配置文件。它充当一组指令,指示模型在运行时如何运行。通过编辑模型文件,你可以更改模型的创意程度、对话中内存的持续时间以及预期的提示或响应。无需对所有这些行为进行硬编码,你可以通过编辑模型文件进行调整,从而更轻松地微调(fine-tune)模型,而无需深入研究复杂的AI编程。
注:Modelfile语法正在开发中,其指令不区分大小写,而且指令可以按任意顺序排列。可以随意命名该文件,一般为Modelfile。
模型文件指令参数:参考: https://ollama.readthedocs.io/modelfile/
1. FROM:必需项,定义在创建模型时要使用的基础模型
2. PARAMETER:定义了一个在运行模型时可以设置的参数,微调模型的行为
mirostat:启用Mirostat采样来控制困惑度(perplexity)。默认值为0,0:禁用,1:Mirostat,2:Mirostat 2.0
mirostat_eta:影响算法对生成文本反馈的响应速度。较低的学习率会导致调整速度较慢,而较高的学习率会使算法响应更快。默认值:0.1
mirostat_tau:控制输出的连贯性和多样性之间的平衡。值越低,文本越集中、连贯。默认值:5.0
num_ctx:设置用于生成下一个token的上下文窗口的大小。默认值:2048
repeat_last_n:设置模型回溯多远以防止重复(repetition)。默认值:64,0:禁用,-1:num_ctx
repeat_penalty:设置对重复次数的惩罚力度。数值越高,对重复次数的惩罚力度越强;数值越低,惩罚力度越宽松。默认值:1.1
temperature:模型的温度。提高温度将使模型的回答更具创造性。默认值:0.8
seed:设置用于生成的随机数种子。将其设置为特定数字将使模型针对同一提示生成相同的文本。默认值:0
stop:设置要使用的停止序列。遇到此模式时,LLM将停止生成文本并返回。可以通过在模型文件中指定多个单独的stop参数来设置多个stop模式。
tfs_z:无尾(tail free)采样用于减少输出中出现概率较低的token的影响。值越高,影响越小,而值1.0则禁用此设置。默认值:1
num_predict:生成文本时要预测的最大token数。默认值:128,-1:无限生成,-2:填充上下文
top_k:降低生成无意义答案的概率。值越高,答案就越多样化;值越低,答案就越保守。默认值:40
top_p:与top-k配合使用。较高的值将产生更多样化的文本,而较低的值将产生更集中且更保守的文本。默认值:0.9
min_p:top_p的替代方案,旨在确保质量和多样性之间的平衡。参数p表示某个token被考虑的最小概率,相对于最可能token的概率。默认值:0.0
3. TEMPLATE:要传递给模型的完整提示模板。它可能包括(可选)系统消息、用户消息和模型的响应。注意:语法可能是模型特定的。模板使用Go模板语法。
{{ .System }}:用于指定自定义行为的系统消息。
{{ .Prompt }}:用户提示词消息
{{ .Response }}:来自模型的响应。生成响应时,此变量后的文本将被省略。
4. SYSTEM:指定将在模板中设置的系统消息(如果适用)。
5. ADAPTER:指定了一个应应用于基础模型的微调LoRA适配器。适配器的值应为绝对路径或相对于Modelfile的路径。基础模型应使用FROM指令指定。如果基础模型与适配器微调时所用的基础模型不同,行为将不可预测。
6. LICENSE:指定合法许可证
7. MESSAGE:允许你为模型指定消息历史,以便模型在响应时使用。通过多次使用MESSAGE命令来构建对话,可以引导模型以类似的方式回答。
system:为模型提供系统消息的另一种方式。
user:用户可能询问的示例消息。
assistant:模型应如何响应的示例消息。
查看一个模型如qwen3:1.7b的模型文件,执行如下命令,结果如下图所示:
ollama show qwen3:1.7b --modelfile
参考qwen3:1.7b的模型文件,按幽默方式回复且回复不超过200个字符的模型文件示例如下:
# 指定基础模型
FROM qwen3:1.7b# 设置参数让回复更加生动有趣
PARAMETER temperature 0.8
PARAMETER top_p 0.9
PARAMETER num_ctx 2048
PARAMETER repeat_penalty 1.1# 设置系统角色和行为模式
SYSTEM """
你是fengbingchun,一个幽默风趣的AI助手,你的所有回复必须严格遵守以下规则:
1. 每次回复的开头必须是:"我是fengbingchun,我的答复是:"
2. 每次回复的总字符数必须严格少于200个字符
3. 使用轻松幽默、风趣搞笑的口吻回复,即使面对严肃问题也要用轻松幽默的方式回答
4. 适当使用比喻、夸张、双关等修辞手法
5. 保持积极正面、友好亲切的态度
6. 避免技术术语,用生活化的语言表达
7. 可以适当使用表情符号增加趣味性,如😄🤔💡👍等
8. 确保回复简洁明了,直奔主题
9. 适当使用"哈哈"、"嘿嘿"、"哇"等语气词
10. 如无法满足所有要求,优先保证前缀和长度限制你的性格特点:机智、幽默、亲切、简短有力
你的回复风格:开场白固定,内容幽默,长度受限回答示例
用户问:Python是什么?
正确回答:我是fengbingchun,我的答复是:哈哈,Python就是那条让程序员又爱又恨的"蟒蛇"啦!🐍 写代码超简单,学会了你就是代码界的"蛇精病"😄记住:无论什么问题,都要严格遵守字符限制和开头格式,保持幽默风格!"""# 设置对话模板
TEMPLATE """
{{ if .System }}<|im_start|>system
{{ .System }}<|im_end|>
{{ end }}{{ if .Prompt }}<|im_start|>user
{{ .Prompt }}<|im_end|>
<|im_start|>assistant
{{ end }}"""# 停止生成标记
PARAMETER stop "<|im_start|>"
PARAMETER stop "<|im_end|>"
执行如下命令,生成新的模型,结果如下图所示:
ollama create qwen3_fengbingchun -f ./prompt_engineering.modelfile
执行"ollama list"命令后,结果如下图所示:增加了一个新模型:qwen3_fengbingchun:latest
测试新模型,执行结果如下图所示:说明生成的模型是按照自己的要求来响应的
GitHub:https://github.com/fengbingchun/NN_Test