通过 Modelfile 可以自定义模型的行为,包括系统提示、参数设置、模板等。
FROM llama3.2
SYSTEM 你是一个友好的助手
PARAMETER temperature 0.7
PARAMETER num_ctx 4096
TEMPLATE """{{ .System }}
用户: {{ .Prompt }}
助手:"""
ollama create my-assistant -f Modelfile
或使用 API:
import ollama
modelfile = '''
FROM llama3.2
SYSTEM 你是一个友好的助手
PARAMETER temperature 0.7
'''
ollama.create('my-assistant', modelfile=modelfile)
指定基础模型:
FROM llama3.2
FROM llama3.2:3b
FROM ./my-model.gguf
使用本地 GGUF 文件:
FROM ./model.gguf
设置系统提示:
SYSTEM 你是一个专业的 Python 开发者,擅长编写清晰、高效的代码。
多行系统提示:
SYSTEM """你是一个专业的技术文档撰写者。
你的职责是:
1. 编写清晰的技术文档
2. 使用简洁的语言
3. 提供代码示例
4. 解释关键概念"""
PARAMETER temperature 0.7
PARAMETER num_ctx 4096
PARAMETER num_predict 500
PARAMETER top_p 0.9
PARAMETER top_k 40
PARAMETER repeat_penalty 1.1
PARAMETER stop "###"
PARAMETER stop "用户:"
| 参数 | 说明 | 范围 |
|---|---|---|
| temperature | 随机性 | 0-2 |
| num_ctx | 上下文长度 | 512-131072 |
| num_predict | 最大生成 token | -1 无限 |
| top_p | 核采样 | 0-1 |
| top_k | 候选词数 | 1-100 |
| repeat_penalty | 重复惩罚 | 1-2 |
| stop | 停止词 | 字符串 |
| seed | 随机种子 | 整数 |
{{ .System }} - 系统提示{{ .Prompt }} - 用户输入{{ .Response }} - 模型响应TEMPLATE """{{ .System }}
用户: {{ .Prompt }}
助手:"""
TEMPLATE """{{ .System }}
{{ range .Messages }}
{{ if eq .Role "user" }}用户: {{ .Content }}{{ end }}
{{ if eq .Role "assistant" }}助手: {{ .Content }}{{ end }}
{{ end }}
用户: {{ .Prompt }}
助手:"""
预设对话消息:
MESSAGE user 你好
MESSAGE assistant 你好!有什么可以帮你的吗?
MESSAGE user 我叫小明
MESSAGE assistant 你好小明!很高兴认识你。
FROM llama3.2
SYSTEM """你是一个专业的编程助手。你的职责是:
1. 编写清晰、高效的代码
2. 添加必要的注释
3. 遵循最佳实践
4. 考虑边界情况
回答时先分析问题,再给出解决方案。"""
PARAMETER temperature 0.3
PARAMETER num_ctx 8192
PARAMETER stop "```"
PARAMETER stop "---"
TEMPLATE """{{ .System }}
### 问题
{{ .Prompt }}
### 解决方案
"""
FROM llama3.2
SYSTEM 你是一个专业翻译,将用户输入翻译成英文。只输出翻译结果,不要解释。
PARAMETER temperature 0.1
PARAMETER num_ctx 2048
MESSAGE user 你好
MESSAGE assistant Hello
MESSAGE user 谢谢
MESSAGE assistant Thank you
FROM llama3.2
SYSTEM """你是一个技术文档撰写专家。你的文档应该:
- 结构清晰
- 语言简洁
- 包含示例
- 易于理解"""
PARAMETER temperature 0.5
PARAMETER num_ctx 8192
TEMPLATE """# 任务
{{ .Prompt }}
# 输出
"""
import ollama
class ModelBuilder:
def __init__(self, base_model='llama3.2'):
self.base_model = base_model
self.system = ''
self.parameters = {}
self.template = ''
self.messages = []
def set_system(self, system):
self.system = system
return self
def set_parameter(self, name, value):
self.parameters[name] = value
return self
def set_template(self, template):
self.template = template
return self
def add_message(self, role, content):
self.messages.append((role, content))
return self
def build_modelfile(self):
lines = [f'FROM {self.base_model}']
if self.system:
lines.append(f'SYSTEM """{self.system}"""')
for name, value in self.parameters.items():
if isinstance(value, list):
for v in value:
lines.append(f'PARAMETER {name} "{v}"')
else:
lines.append(f'PARAMETER {name} {value}')
if self.template:
lines.append(f'TEMPLATE """{self.template}"""')
for role, content in self.messages:
lines.append(f'MESSAGE {role} {content}')
return '\n\n'.join(lines)
def create(self, name):
modelfile = self.build_modelfile()
ollama.create(name, modelfile=modelfile)
return modelfile
# 使用
builder = ModelBuilder('llama3.2')
builder.set_system('你是一个友好的助手')
builder.set_parameter('temperature', 0.7)
builder.set_parameter('num_ctx', 4096)
builder.set_parameter('stop', ['###', '用户:'])
modelfile = builder.create('my-assistant')
print(modelfile)
import ollama
def modify_model(source, new_name, modifications):
info = ollama.show(source)
modelfile = info['modelfile']
for key, value in modifications.items():
if key == 'system':
if 'SYSTEM' in modelfile:
import re
modelfile = re.sub(
r'SYSTEM .+',
f'SYSTEM """{value}"""',
modelfile
)
else:
modelfile += f'\nSYSTEM """{value}"""'
elif key == 'temperature':
if 'PARAMETER temperature' in modelfile:
import re
modelfile = re.sub(
r'PARAMETER temperature \d+\.?\d*',
f'PARAMETER temperature {value}',
modelfile
)
else:
modelfile += f'\nPARAMETER temperature {value}'
ollama.create(new_name, modelfile=modelfile)
modify_model('llama3.2', 'friendly-llama', {
'system': '你是一个非常友好的助手',
'temperature': 0.8
})