Ollama Template 详解


Ollama Template 详解

官网 https://github.com/ollama/ollama/blob/main/docs/template.md
Ollama 提供了一个强大的模板引擎,基于 Go 的内置模板引擎,用于为大型语言模型构建提示。此功能是一个宝贵的工具,可帮助您充分利用模型。

1 基本模板结构

一个基本的 Go 模板由三个主要部分组成:

  • 布局:模板的整体结构。
  • 变量:动态数据的占位符,在渲染模板时会被实际值替换。
  • 函数:可用于操作模板内容的自定义函数或逻辑。

1.1 示例

以下是一个简单聊天模板的示例:

{{- range .Messages }}
{{ .Role }}: {{ .Content }}
{{- end }}

在这个示例中,我们有以下内容:

  • 基本消息结构(布局)
  • 三个变量:MessagesRoleContent(变量)
  • 一个自定义函数(操作),用于遍历项目数组(range .Messages)并显示每个项目

2 为模型添加模板

默认情况下,导入到 Ollama 的模型具有默认模板 {{ .Prompt }},即用户输入会原封不动地发送给 LLM。这对于文本或代码补全模型是合适的,但对于聊天或指令模型则缺乏必要的标记。
在这些模型中省略模板会将正确模板化输入的责任推给用户。添加模板可以让用户轻松地从模型中获得最佳结果。
要在模型中添加模板,您需要在 Modelfile 中添加 TEMPLATE 指令。以下是一个使用 Meta 的 Llama 3 的示例:

FROM llama3.2

TEMPLATE """{{- if .System }}<|start_header_id|>system<|end_header_id|>

{{ .System }}<|eot_id|>
{{- end }}
{{- range .Messages }}<|start_header_id|>{{ .Role }}<|end_header_id|>

{{ .Content }}<|eot_id|>
{{- end }}<|start_header_id|>assistant<|end_header_id|>
"""

3 变量

System (string):系统(system)提示
Prompt (string):用户(user)提示
Response (string):助手(assistant)回复
Suffix (string):插入在助手响应后的文本
Messages (list):消息列表
Messages[].Role (string):角色可以是system(系统)、user(用户)、assistant(助手)或tool(工具)中的一个
Messages[].Content (string): 消息内容 
Messages[].ToolCalls (list):模型想要调用的工具列表
Messages[].ToolCalls[].Function (object):调用函数
Messages[].ToolCalls[].Function.Name (string):函数名称
Messages[].ToolCalls[].Function.Arguments (map):参数名称到参数值的映射
Tools (list):模型可以访问的工具列表
Tools[].Type (string):模式类型。type 始终为 function
Tools[].Function (object):函数定义
Tools[].Function.Name (string):函数名称
Tools[].Function.Description (string):函数描述
Tools[].Function.Parameters (object):函数参数
Tools[].Function.Parameters.Type (string):模式类型。type始终为object
Tools[].Function.Parameters.Required (list):所需属性列表
Tools[].Function.Parameters.Properties (map):属性名称到属性定义的映射
Tools[].Function.Parameters.Properties[].Type (string):属性类型
Tools[].Function.Parameters.Properties[].Description (string):属性描述
Tools[].Function.Parameters.Properties[].Enum (list):有效值列表

4 提示和最佳实践

在使用 Go 模板时,请牢记以下提示和最佳实践:

  • 注意点号(dot):控制流结构(如rangewith)会改变 . 的值。
  • 超出作用域的变量:使用 $.引用当前不在作用域内的变量,从根开始。
  • 空白控制:使用-来修剪前导({{-)和尾随(-}})空白。

5 示例

5.1 示例消息

5.1.1 ChatML

ChatML 是一种流行的模板格式。它可以用于诸如 Databrick 的 DBRX、Intel 的 Neural Chat 和 Microsoft 的 Orca 2 等模型。

{{- range .Messages }}<|im_start|>{{ .Role }}
{{ .Content }}<|im_end|>
{{ end }}<|im_start|>assistant

5.2 示例工具

可以通过在模板中添加{{ .Tools }}节点来为模型添加工具支持。此功能对于训练用于调用外部工具的模型非常有用,并且可以成为检索实时数据或执行复杂任务的强大工具。

5.2.1 Mistral

Mistral v0.3 和 Mixtral 8x22B 支持工具调用。

{{- range $index, $_ := .Messages }}
{{- if eq .Role "user" }}
{{- if and (le (len (slice $.Messages $index)) 2) $.Tools }}[AVAILABLE_TOOLS] {{ json $.Tools }}[/AVAILABLE_TOOLS]
{{- end }}[INST] {{ if and (eq (len (slice $.Messages $index)) 1) $.System }}{{ $.System }}

{{ end }}{{ .Content }}[/INST]
{{- else if eq .Role "assistant" }}
{{- if .Content }} {{ .Content }}</s>
{{- else if .ToolCalls }}[TOOL_CALLS] [
{{- range .ToolCalls }}{"name": "{{ .Function.Name }}", "arguments": {{ json .Function.Arguments }}}
{{- end }}]</s>
{{- end }}
{{- else if eq .Role "tool" }}[TOOL_RESULTS] {"content": {{ .Content }}}[/TOOL_RESULTS]
{{- end }}
{{- end }}

5.3 示例:中间填充(Fill-in-Middle)

可以通过在模板中添加 {{ .Suffix }} 节点来为模型添加中间填充支持。此功能对于训练用于在用户输入中间生成文本的模型(例如代码补全模型)非常有用。

5.3.1 CodeLlama

CodeLlama 7B 和 13B 代码补全模型支持中间填充。

<PRE> {{ .Prompt }} <SUF>{{ .Suffix }} <MID>

注意:
CodeLlama 34B 和 70B 代码补全以及所有指令和 Python 微调模型不支持中间填充。

5.3.3 Codestral

Codestral 22B 支持中间填充。

[SUFFIX]{{ .Suffix }}[PREFIX] {{ .Prompt }}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值