Ollama模板全解析
本文来自「大千AI助手」技术实战系列,专注用真话讲技术,拒绝过度包装。
往期文章推荐:
- 14.Ollama完全指南:从零开始玩转本地大模型部署
- 13.django中如何解析content-type=application/json的请求
- 12.实测DeepSeek分词机制:你的输入如何变成计费Token?
- 11.英语分词进化论:BPE相关论文汇总
- 10.硬核实战 | 3分钟Docker部署ClickHouse列存数据库
- 9.技术深解 | DeepSeek-R1-0528训练参数全透视:163K上下文与MoE高效架构的基石
- 8.DeepSeek最新升级实测:推理能力翻倍,但离世界顶尖还有多远?
- 7.血泪教训!Redis默认配置竟会导致数据丢失?Docker生产部署指南
- 6.Function Call:大模型如何突破自身局限“使用工具“
- 5.DeepSeek动手实践:创建一个自动连点器
- 4.告别无效提示!使用少样本学习让AI秒懂你的需求
- 3.解密PromptTemplate:为什么说它是AI时代的Jinja模板?
- 2.LangChain Core架构解析:模块化设计与LCEL原语实现原理
- 1.拒绝重复造轮子!LangChain如何简化LLM应用开发?
什么是Ollama模板?
Ollama模板是控制AI模型输入输出格式的核心配置,它决定了:
-
1. 如何将用户输入、系统指令和对话历史组织成模型能理解的格式
-
2. 模型响应后如何结构化输出结果
-
3. 多轮对话中消息的排列和组织方式
为什么需要关注模板?
-
• 效果差异:同样的模型,不同模板可能导致完全不同的输出质量
-
• 场景适配:对话、工具调用、长文本处理等不同场景需要不同模板
-
• 性能影响:合理的模板能减少不必要的token消耗
核心特点
-
• 基于Go模板语法
-
• 支持条件判断、循环等逻辑控制
-
• 可访问完整的对话上下文信息
ollama模板简介
-
• ollama是go实现的,模板是需要满足go的模板格式
默认模板
-
• 导入到ollama中的模型如果没有设置模板则使用默认的模板
{{ .Prompt }}
模型模板
-
• 模型的模板可以通过命令
ollama show --template <model-name>
查看-
• 实例 -
ollama show --template llava:7b
-
• 结果 -
[INST] {{ if .System }}{{ .System }} {{ end }}{{ .Prompt }} [/INST]
-
-
-
• 修改模型的模板
-
• 可以在
ollama create
新建模型时在Modelfile中通过TEMPLATE
命令修改模型的模板信息-
• 实例
-
-
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|>
"""
ollama中模板语法
-
• ollama是go实现的,模板需要满足go的模板格式
变量替换
-
•
{{ .System }}
引用变量System
的值,比jinja2多一个点.
循环遍历
-
• 遍历列表,并访问属性 -
{{- range .Messages }} {{ .Content }} {{ end }}
条件判断
-
• 取值相等判断 -
{{- if eq .Role "user" }} 123 {{- end }}
-
• 条件与判断 -
{{- if and (eq 1 1) $.System}} {{ $.System }} {{ else if eq 1 1 }} {{ .Content }} {{- end }}
主要变量
-
•
{{ .System }}
- 系统提示 -
•
{{ .Prompt }}
- 用户输入的提示或问题 -
•
{{ .Response }}
- 模型生成的响应字符串 -
•
{{ .Suffix }}
- 追加到模型生成的响应字符串后的字符串 -
•
{{ .Messages }}
- 消息列表(每个元素都是一个字典)-
•
{{ .Messages[].Role }}
- 该条消息来源的角色类型(system, user, assistant, tool)-
• 通常会被替换为
<|System|>、<|User|>、<|Assistant|>、<|Tool|>
,后边紧跟对应的文本字符串 -
•
system
- 用来定义系统的行为、指令或上下文设置,主要用来提供模型的初始指令,定义对话的规则或格式或者提供背景信息或上下文 -
•
user
- 表示用户的输入或问题 -
•
assistant
- 表示模型的响应或输出,主要在多轮对话中使用 -
•
tool
- 表示外部工具或插件的调用结果,比如函数调用、插件系统等外部工具
-
-
•
{{ .Messages[].Content }}
- 消息内容字符串 -
•
{{ .Messages[].ToolCalls }}
- 模型可以调用的工具列表-
•
{{ .Messages[].ToolCalls[].Function }}
- 函数对象 -
•
{{ .Messages[].ToolCalls[].Function.Name }}
- 函数名 -
•
{{ .Messages[].ToolCalls[].Function.Arguments }}
- 函数参数字典(参数名:参数值)
-
-
-
•
{{ .Tools }}
- 模型可以访问的工具列表-
•
{{ .Tools[].Type }}
- 类型名称(取值function) -
•
{{ .Tools[].Function }}
- 函数对象-
•
{{ .Tools[].Function.Name }}
- 函数名 -
•
{{ .Tools[].Function.Description }}
- 函数描述 -
•
{{ .Tools[].Function.Parameters }}
- 函数参数对象-
•
{{ .Tools[].Function.Parameters.Type }}
- 函数参数类型(取值object) -
•
{{ .Tools[].Function.Parameters.Required }}
- 函数必须的properties列表 -
•
{{ .Tools[].Function.Parameters.Properties }}
- property名到property定义的字典-
•
{{ .Tools[].Function.Parameters.Properties[].Type }}
- property类型 -
•
{{ .Tools[].Function.Parameters.Properties[].Description }}
- property描述 -
•
{{ .Tools[].Function.Parameters.Properties[].Enum }}
- 有效值的列表
-
-
-
-
-
•
{{ .Time }}
- 时间戳或时间相关信息 -
•
{{ .Model }}
- 模型名称或版本信息
实际应用案例
构建自定义对话模板
FROM llama3.2
TEMPLATE """[系统指令]{{ .System }}[结束指令]
[用户问题]{{ .Prompt }}[结束问题]
[AI回答]"""
参考
本文由「大千AI助手」原创发布,专注用真话讲AI,回归技术本质。拒绝神话或妖魔化。搜索「大千AI助手」关注我,一起撕掉过度包装,学习真实的AI技术!