模型自定义

通过 Modelfile 可以自定义模型的行为,包括系统提示、参数设置、模板等。

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 指令

指定基础模型:

FROM llama3.2
FROM llama3.2:3b
FROM ./my-model.gguf

使用本地 GGUF 文件:

FROM ./model.gguf

SYSTEM 指令

设置系统提示:

SYSTEM 你是一个专业的 Python 开发者,擅长编写清晰、高效的代码。

多行系统提示:

SYSTEM """你是一个专业的技术文档撰写者。

你的职责是:
1. 编写清晰的技术文档
2. 使用简洁的语言
3. 提供代码示例
4. 解释关键概念"""

PARAMETER 指令

常用参数

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随机种子整数

TEMPLATE 指令

模板变量

  • {{ .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 指令

预设对话消息:

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 }}

# 输出
"""

Python 创建工具

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
})