Merge pull request #5620 from ollama/mxyng/templates
update embedded templates
This commit is contained in:
commit
cf15589851
29 changed files with 214 additions and 88 deletions
|
@ -161,7 +161,7 @@ func TestChatPrompt(t *testing.T) {
|
||||||
{Role: "user", Content: "A test. And a thumping good one at that, I'd wager."},
|
{Role: "user", Content: "A test. And a thumping good one at that, I'd wager."},
|
||||||
},
|
},
|
||||||
expect: expect{
|
expect: expect{
|
||||||
prompt: "You're a test, Harry! I-I'm a what? You are the Test Who Lived. A test. And a thumping good one at that, I'd wager. ",
|
prompt: "You are the Test Who Lived. You're a test, Harry! I-I'm a what? A test. And a thumping good one at that, I'd wager. ",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
|
@ -546,8 +546,8 @@ func TestCreateDetectTemplate(t *testing.T) {
|
||||||
|
|
||||||
checkFileExists(t, filepath.Join(p, "blobs", "*"), []string{
|
checkFileExists(t, filepath.Join(p, "blobs", "*"), []string{
|
||||||
filepath.Join(p, "blobs", "sha256-553c4a3f747b3d22a4946875f1cc8ed011c2930d83f864a0c7265f9ec0a20413"),
|
filepath.Join(p, "blobs", "sha256-553c4a3f747b3d22a4946875f1cc8ed011c2930d83f864a0c7265f9ec0a20413"),
|
||||||
filepath.Join(p, "blobs", "sha256-9512c372dfc7d84d6065b8dd2b601aeed8cc1a78e7a7aa784a42fff37f5524b7"),
|
filepath.Join(p, "blobs", "sha256-68b0323b2f21572bc09ba07554b16b379a5713ee48ef8c25a7661a1f71cfce77"),
|
||||||
filepath.Join(p, "blobs", "sha256-b8b78cb8c6eefd14c06f1af042e6161255bf87bbf2dd14fce57cdac893db8139"),
|
filepath.Join(p, "blobs", "sha256-eb72fb7c550ee1f1dec4039bd65382acecf5f7536a30fb7ccace39a8d0cb590b"),
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
|
@ -3,6 +3,6 @@
|
||||||
{{- end }}
|
{{- end }}
|
||||||
{{- range .Messages }}<start_{{ .Role }}>{{ .Content }}<end_message>
|
{{- range .Messages }}<start_{{ .Role }}>{{ .Content }}<end_message>
|
||||||
{{- end }}<start_assistant>
|
{{- end }}<start_assistant>
|
||||||
{{- else }}
|
{{- else -}}
|
||||||
{{ if .System }}<start_system>{{ .System }}<end_message>{{ end }}{{ if .Prompt }}<start_user>{{ .Prompt }}<end_message>{{ end }}<start_assistant>{{ .Response }}<end_message>
|
{{ if .System }}<start_system>{{ .System }}<end_message>{{ end }}{{ if .Prompt }}<start_user>{{ .Prompt }}<end_message>{{ end }}<start_assistant>{{ .Response }}<end_message>
|
||||||
{{- end }}
|
{{- end -}}
|
|
@ -1,6 +1,7 @@
|
||||||
{{- if .Messages }}
|
{{- if .Messages }}
|
||||||
{{- if .System }}{{ .System }}
|
{{- if .System }}{{ .System }}
|
||||||
{{- end }}
|
|
||||||
|
{{ end }}
|
||||||
{{- range .Messages }}
|
{{- range .Messages }}
|
||||||
{{- if eq .Role "user" }}### Instruction:
|
{{- if eq .Role "user" }}### Instruction:
|
||||||
{{- else if eq .Role "assistant" }}### Response:
|
{{- else if eq .Role "assistant" }}### Response:
|
||||||
|
@ -8,7 +9,7 @@
|
||||||
{{ .Content }}
|
{{ .Content }}
|
||||||
|
|
||||||
{{ end }}### Response:
|
{{ end }}### Response:
|
||||||
{{ else }}
|
{{ else -}}
|
||||||
{{ if .System }}{{ .System }}
|
{{ if .System }}{{ .System }}
|
||||||
|
|
||||||
{{ end }}{{ if .Prompt }}### Instruction:
|
{{ end }}{{ if .Prompt }}### Instruction:
|
||||||
|
@ -16,4 +17,5 @@
|
||||||
|
|
||||||
{{ end }}### Response:
|
{{ end }}### Response:
|
||||||
{{ .Response }}
|
{{ .Response }}
|
||||||
{{- end }}
|
|
||||||
|
{{ end -}}
|
|
@ -5,11 +5,11 @@
|
||||||
{{- range .Messages }}<|im_start|>{{ .Role }}
|
{{- range .Messages }}<|im_start|>{{ .Role }}
|
||||||
{{ .Content }}<|im_end|>
|
{{ .Content }}<|im_end|>
|
||||||
{{ end }}<|im_start|>assistant
|
{{ end }}<|im_start|>assistant
|
||||||
{{ else }}
|
{{ else -}}
|
||||||
{{ if .System }}<|im_start|>system
|
{{ if .System }}<|im_start|>system
|
||||||
{{ .System }}<|im_end|>
|
{{ .System }}<|im_end|>
|
||||||
{{ end }}{{ if .Prompt }}<|im_start|>user
|
{{ end }}{{ if .Prompt }}<|im_start|>user
|
||||||
{{ .Prompt }}<|im_end|>
|
{{ .Prompt }}<|im_end|>
|
||||||
{{ end }}<|im_start|>assistant
|
{{ end }}<|im_start|>assistant
|
||||||
{{ .Response }}<|im_end|>
|
{{ .Response }}<|im_end|>
|
||||||
{{- end }}
|
{{ end -}}
|
|
@ -8,10 +8,11 @@
|
||||||
{{- end }} {{ .Content }}
|
{{- end }} {{ .Content }}
|
||||||
|
|
||||||
{{ end }}Assistant:
|
{{ end }}Assistant:
|
||||||
{{- else }}
|
{{- else -}}
|
||||||
{{ if .System }}System: {{ .System }}
|
{{ if .System }}System: {{ .System }}
|
||||||
|
|
||||||
{{ end }}{{ if .Prompt }}User: {{ .Prompt }}
|
{{ end }}{{ if .Prompt }}User: {{ .Prompt }}
|
||||||
|
|
||||||
{{ end }}Assistant: <|begin_of_text|>{{ .Response }}
|
{{ end }}Assistant: {{ .Response }}
|
||||||
{{- end }}
|
|
||||||
|
{{ end -}}
|
|
@ -7,7 +7,7 @@
|
||||||
{{ .Content }} <step> {{ end }}Source: assistant
|
{{ .Content }} <step> {{ end }}Source: assistant
|
||||||
Destination: user
|
Destination: user
|
||||||
|
|
||||||
{{ else }}
|
{{ else -}}
|
||||||
{{ if .System }}Source: system
|
{{ if .System }}Source: system
|
||||||
|
|
||||||
{{ .System }} <step> {{ end }}Source: user
|
{{ .System }} <step> {{ end }}Source: user
|
||||||
|
@ -16,4 +16,4 @@ Destination: user
|
||||||
Destination: user
|
Destination: user
|
||||||
|
|
||||||
{{ .Response }} <step>
|
{{ .Response }} <step>
|
||||||
{{- end }}
|
{{- end -}}
|
|
@ -6,8 +6,10 @@
|
||||||
{{ else if eq .Role "assistant" }}Falcon:
|
{{ else if eq .Role "assistant" }}Falcon:
|
||||||
{{ end }}{{ .Content }}
|
{{ end }}{{ .Content }}
|
||||||
{{ end }}Falcon:
|
{{ end }}Falcon:
|
||||||
{{ else }}
|
{{ else -}}
|
||||||
{{ if .System }}{{ .System }}
|
{{ if .System }}System: {{ .System }}
|
||||||
{{ end }}{{ if .Prompt }}User: {{ .Prompt }}
|
{{ end }}{{ if .Prompt }}User:
|
||||||
{{ end }}Assistant: {{ .Response }}
|
{{ .Prompt }}
|
||||||
{{- end }}
|
{{ end }}Falcon:
|
||||||
|
{{ .Response }}
|
||||||
|
{{ end -}}
|
|
@ -8,9 +8,10 @@
|
||||||
{{- end }}
|
{{- end }}
|
||||||
{{ .Content }}<end_of_turn>
|
{{ .Content }}<end_of_turn>
|
||||||
{{ end }}<start_of_turn>model
|
{{ end }}<start_of_turn>model
|
||||||
{{ else }}
|
{{ else -}}
|
||||||
<start_of_turn>user
|
<start_of_turn>user
|
||||||
{{ if .System }}{{ .System }} {{ end }}{{ .Prompt }}<end_of_turn>
|
{{ if .System }}{{ .System }}
|
||||||
|
{{ end }}{{ .Prompt }}<end_of_turn>
|
||||||
<start_of_turn>model
|
<start_of_turn>model
|
||||||
{{ .Response }}<end_of_turn>
|
{{ .Response }}<end_of_turn>
|
||||||
{{- end }}
|
{{ end -}}
|
|
@ -10,9 +10,8 @@
|
||||||
{{ .Content }}
|
{{ .Content }}
|
||||||
|
|
||||||
{{ end }}Answer:
|
{{ end }}Answer:
|
||||||
{{ else }}
|
{{ else -}}
|
||||||
{{ if .System }}
|
{{ if .System }}System:
|
||||||
System:
|
|
||||||
{{ .System }}
|
{{ .System }}
|
||||||
|
|
||||||
{{ end }}{{ if .Prompt }}Question:
|
{{ end }}{{ if .Prompt }}Question:
|
||||||
|
@ -20,4 +19,5 @@ System:
|
||||||
|
|
||||||
{{ end }}Answer:
|
{{ end }}Answer:
|
||||||
{{ .Response }}
|
{{ .Response }}
|
||||||
{{- end }}
|
|
||||||
|
{{ end -}}
|
|
@ -9,8 +9,8 @@
|
||||||
{{- else }} [/INST] {{ .Content }}</s><s>
|
{{- else }} [/INST] {{ .Content }}</s><s>
|
||||||
{{- end }}
|
{{- end }}
|
||||||
{{- end }} [/INST]
|
{{- end }} [/INST]
|
||||||
{{- else }}
|
{{- else -}}
|
||||||
[INST] <<SYS>>{{ .System }}<</SYS>>
|
[INST] <<SYS>>{{ if .System }}{{ .System }}{{ end }}<</SYS>>
|
||||||
|
|
||||||
{{ .Prompt }} [/INST] {{ .Response }}
|
{{ .Prompt }} [/INST] {{ .Response }}</s>
|
||||||
{{- end }}
|
{{- end -}}
|
|
@ -8,7 +8,7 @@
|
||||||
{{ .Content }}<|eot_id|>
|
{{ .Content }}<|eot_id|>
|
||||||
{{- end }}<|start_header_id|>assistant<|end_header_id|>
|
{{- end }}<|start_header_id|>assistant<|end_header_id|>
|
||||||
|
|
||||||
{{ else }}
|
{{ else -}}
|
||||||
{{ if .System }}<|start_header_id|>system<|end_header_id|>
|
{{ if .System }}<|start_header_id|>system<|end_header_id|>
|
||||||
|
|
||||||
{{ .System }}<|eot_id|>{{ end }}{{ if .Prompt }}<|start_header_id|>user<|end_header_id|>
|
{{ .System }}<|eot_id|>{{ end }}{{ if .Prompt }}<|start_header_id|>user<|end_header_id|>
|
||||||
|
@ -16,4 +16,4 @@
|
||||||
{{ .Prompt }}<|eot_id|>{{ end }}<|start_header_id|>assistant<|end_header_id|>
|
{{ .Prompt }}<|eot_id|>{{ end }}<|start_header_id|>assistant<|end_header_id|>
|
||||||
|
|
||||||
{{ .Response }}<|eot_id|>
|
{{ .Response }}<|eot_id|>
|
||||||
{{- end }}
|
{{- end -}}
|
|
@ -9,7 +9,7 @@
|
||||||
{{ .Content }}
|
{{ .Content }}
|
||||||
|
|
||||||
{{ end }}@@ Response
|
{{ end }}@@ Response
|
||||||
{{ else }}
|
{{ else -}}
|
||||||
{{ if .System }}{{ .System }}
|
{{ if .System }}{{ .System }}
|
||||||
|
|
||||||
{{ end }}{{ if .Prompt }}@@ Instruction
|
{{ end }}{{ if .Prompt }}@@ Instruction
|
||||||
|
@ -17,4 +17,5 @@
|
||||||
|
|
||||||
{{ end }}@@ Response
|
{{ end }}@@ Response
|
||||||
{{ .Response }}
|
{{ .Response }}
|
||||||
{{- end }}
|
|
||||||
|
{{ end -}}
|
|
@ -5,5 +5,6 @@
|
||||||
{{- else if eq .Role "assistant" }}[/INST] {{ .Content }}</s>
|
{{- else if eq .Role "assistant" }}[/INST] {{ .Content }}</s>
|
||||||
{{- end }}
|
{{- end }}
|
||||||
{{- end }}[/INST]
|
{{- end }}[/INST]
|
||||||
{{- else }}[INST] {{ if .System }}{{ .System }} {{ end }}{{ .Prompt }} [/INST] {{ .Response }}
|
{{- else -}}
|
||||||
{{- end }}
|
[INST] {{ if .System }}{{ .System }} {{ end }}{{ .Prompt }}[/INST] {{ .Response }}</s>
|
||||||
|
{{- end -}}
|
|
@ -1,11 +1,11 @@
|
||||||
{{- if .Messages }}
|
{{- if .Messages }}
|
||||||
{{- if .System }}GPT Correct System: {{ .System }}<|end_of_turn|>
|
{{- if .System }}GPT4 Correct System: {{ .System }}<|end_of_turn|>
|
||||||
{{- end }}
|
{{- end }}
|
||||||
{{- range .Messages }}GPT Correct
|
{{- range .Messages }}GPT4 Correct
|
||||||
{{- if eq .Role "user" }} User:
|
{{- if eq .Role "user" }} User:
|
||||||
{{- else if eq .Role "assistant" }} Assistant:
|
{{- else if eq .Role "assistant" }} Assistant:
|
||||||
{{- end }} {{ .Content }}<|end_of_turn|>
|
{{- end }} {{ .Content }}<|end_of_turn|>
|
||||||
{{- end }}GPT Correct Assistant:
|
{{- end }}GPT4 Correct Assistant:
|
||||||
{{- else }}
|
{{- else -}}
|
||||||
{{ .System }}<|end_of_turn|>GPT4 Correct User: {{ .Prompt }}<|end_of_turn|>GPT4 Correct Assistant: {{ .Response }}<|end_of_turn|>
|
{{ if .System }}GPT4 Correct System: {{ .System }}<|end_of_turn|>{{ end }}GPT4 Correct User: {{ .Prompt }}<|end_of_turn|>GPT4 Correct Assistant: {{ .Response }}<|end_of_turn|>
|
||||||
{{- end }}
|
{{- end -}}
|
|
@ -5,11 +5,11 @@
|
||||||
{{- range .Messages }}<|{{ .Role }}|>
|
{{- range .Messages }}<|{{ .Role }}|>
|
||||||
{{ .Content }}<|end|>
|
{{ .Content }}<|end|>
|
||||||
{{ end }}<|assistant|>
|
{{ end }}<|assistant|>
|
||||||
{{ else }}
|
{{ else -}}
|
||||||
{{ if .System }}<|system|>
|
{{ if .System }}<|system|>
|
||||||
{{ .System }}<|end|>
|
{{ .System }}<|end|>
|
||||||
{{ end }}{{ if .Prompt }}<|user|>
|
{{ end }}{{ if .Prompt }}<|user|>
|
||||||
{{ .Prompt }}<|end|>
|
{{ .Prompt }}<|end|>
|
||||||
{{ end }}<|assistant|>
|
{{ end }}<|assistant|>
|
||||||
{{ .Response }}<|end|>
|
{{ .Response }}<|end|>
|
||||||
{{- end }}
|
{{ end -}}
|
|
@ -10,7 +10,7 @@
|
||||||
{{ .Content }}</s>
|
{{ .Content }}</s>
|
||||||
{{ end }}
|
{{ end }}
|
||||||
{{ end }}### Assistant:
|
{{ end }}### Assistant:
|
||||||
{{ else }}
|
{{ else -}}
|
||||||
{{ if .System }}### System:
|
{{ if .System }}### System:
|
||||||
{{ .System }}
|
{{ .System }}
|
||||||
|
|
||||||
|
@ -18,5 +18,6 @@
|
||||||
{{ .Prompt }}
|
{{ .Prompt }}
|
||||||
|
|
||||||
{{ end }}### Assistant:
|
{{ end }}### Assistant:
|
||||||
{{ .Response }}
|
{{ .Response }}</s>
|
||||||
{{- end }}
|
|
||||||
|
{{ end -}}
|
|
@ -11,14 +11,13 @@
|
||||||
|
|
||||||
{{ end }}
|
{{ end }}
|
||||||
{{- end }}### Response
|
{{- end }}### Response
|
||||||
{{ else }}
|
{{ else -}}
|
||||||
{{ if .System }}{{ .System }}
|
{{ if .System }}{{ .System }}
|
||||||
|
|
||||||
{{ end }}{{ if .Prompt }}### Instruction
|
{{ end }}{{ if .Prompt }}### Instruction
|
||||||
{{ .Prompt }}
|
{{ .Prompt }}
|
||||||
|
|
||||||
|
|
||||||
{{ end }}### Response
|
{{ end }}### Response
|
||||||
{{ .Response }}<|endoftext|>
|
{{ .Response }}<|endoftext|>
|
||||||
|
|
||||||
{{- end }}
|
{{ end -}}
|
|
@ -143,11 +143,14 @@ func (t *Template) Vars() []string {
|
||||||
|
|
||||||
type Values struct {
|
type Values struct {
|
||||||
Messages []api.Message
|
Messages []api.Message
|
||||||
|
|
||||||
|
// forceLegacy is a flag used to test compatibility with legacy templates
|
||||||
|
forceLegacy bool
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *Template) Execute(w io.Writer, v Values) error {
|
func (t *Template) Execute(w io.Writer, v Values) error {
|
||||||
system, collated := collate(v.Messages)
|
system, collated := collate(v.Messages)
|
||||||
if slices.Contains(t.Vars(), "messages") {
|
if !v.forceLegacy && slices.Contains(t.Vars(), "messages") {
|
||||||
return t.Template.Execute(w, map[string]any{
|
return t.Template.Execute(w, map[string]any{
|
||||||
"System": system,
|
"System": system,
|
||||||
"Messages": collated,
|
"Messages": collated,
|
||||||
|
@ -157,15 +160,19 @@ func (t *Template) Execute(w io.Writer, v Values) error {
|
||||||
var b bytes.Buffer
|
var b bytes.Buffer
|
||||||
var prompt, response string
|
var prompt, response string
|
||||||
for i, m := range collated {
|
for i, m := range collated {
|
||||||
if m.Role == "user" {
|
switch m.Role {
|
||||||
|
case "user":
|
||||||
prompt = m.Content
|
prompt = m.Content
|
||||||
} else {
|
if i != 0 {
|
||||||
|
system = ""
|
||||||
|
}
|
||||||
|
case "assistant":
|
||||||
response = m.Content
|
response = m.Content
|
||||||
}
|
}
|
||||||
|
|
||||||
if i != len(collated)-1 && prompt != "" && response != "" {
|
if i != len(collated)-1 && prompt != "" && response != "" {
|
||||||
if err := t.Template.Execute(&b, map[string]any{
|
if err := t.Template.Execute(&b, map[string]any{
|
||||||
"System": "",
|
"System": system,
|
||||||
"Prompt": prompt,
|
"Prompt": prompt,
|
||||||
"Response": response,
|
"Response": response,
|
||||||
}); err != nil {
|
}); err != nil {
|
||||||
|
@ -178,18 +185,21 @@ func (t *Template) Execute(w io.Writer, v Values) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
var cut bool
|
var cut bool
|
||||||
tree := t.Template.Copy()
|
nodes := deleteNode(t.Template.Root.Copy(), func(n parse.Node) bool {
|
||||||
// for the last message, cut everything after "{{ .Response }}"
|
switch t := n.(type) {
|
||||||
tree.Root.Nodes = slices.DeleteFunc(tree.Root.Nodes, func(n parse.Node) bool {
|
case *parse.ActionNode:
|
||||||
if slices.Contains(parseNode(n), "Response") {
|
case *parse.FieldNode:
|
||||||
|
if slices.Contains(t.Ident, "Response") {
|
||||||
cut = true
|
cut = true
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return cut
|
return cut
|
||||||
})
|
})
|
||||||
|
|
||||||
if err := template.Must(template.New("").AddParseTree("", tree)).Execute(&b, map[string]any{
|
tree := parse.Tree{Root: nodes.(*parse.ListNode)}
|
||||||
"System": system,
|
if err := template.Must(template.New("").AddParseTree("", &tree)).Execute(&b, map[string]any{
|
||||||
|
"System": "",
|
||||||
"Prompt": prompt,
|
"Prompt": prompt,
|
||||||
}); err != nil {
|
}); err != nil {
|
||||||
return err
|
return err
|
||||||
|
@ -286,3 +296,72 @@ func parseNode(n parse.Node) []string {
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// deleteNode walks the node list and deletes nodes that match the predicate
|
||||||
|
// this is currently to remove the {{ .Response }} node from templates
|
||||||
|
func deleteNode(n parse.Node, fn func(parse.Node) bool) parse.Node {
|
||||||
|
var walk func(n parse.Node) parse.Node
|
||||||
|
walk = func(n parse.Node) parse.Node {
|
||||||
|
if fn(n) {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
switch t := n.(type) {
|
||||||
|
case *parse.ListNode:
|
||||||
|
var nodes []parse.Node
|
||||||
|
for _, c := range t.Nodes {
|
||||||
|
if n := walk(c); n != nil {
|
||||||
|
nodes = append(nodes, n)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
t.Nodes = nodes
|
||||||
|
return t
|
||||||
|
case *parse.IfNode:
|
||||||
|
t.BranchNode = *(walk(&t.BranchNode).(*parse.BranchNode))
|
||||||
|
case *parse.WithNode:
|
||||||
|
t.BranchNode = *(walk(&t.BranchNode).(*parse.BranchNode))
|
||||||
|
case *parse.RangeNode:
|
||||||
|
t.BranchNode = *(walk(&t.BranchNode).(*parse.BranchNode))
|
||||||
|
case *parse.BranchNode:
|
||||||
|
t.List = walk(t.List).(*parse.ListNode)
|
||||||
|
if t.ElseList != nil {
|
||||||
|
t.ElseList = walk(t.ElseList).(*parse.ListNode)
|
||||||
|
}
|
||||||
|
case *parse.ActionNode:
|
||||||
|
n := walk(t.Pipe)
|
||||||
|
if n == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
t.Pipe = n.(*parse.PipeNode)
|
||||||
|
case *parse.PipeNode:
|
||||||
|
var commands []*parse.CommandNode
|
||||||
|
for _, c := range t.Cmds {
|
||||||
|
var args []parse.Node
|
||||||
|
for _, a := range c.Args {
|
||||||
|
if n := walk(a); n != nil {
|
||||||
|
args = append(args, n)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(args) == 0 {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
c.Args = args
|
||||||
|
commands = append(commands, c)
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(commands) == 0 {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
t.Cmds = commands
|
||||||
|
}
|
||||||
|
|
||||||
|
return n
|
||||||
|
}
|
||||||
|
|
||||||
|
return walk(n)
|
||||||
|
}
|
||||||
|
|
|
@ -105,8 +105,8 @@ func TestTemplate(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
for n, tt := range cases {
|
for n, tt := range cases {
|
||||||
t.Run(n, func(t *testing.T) {
|
|
||||||
var actual bytes.Buffer
|
var actual bytes.Buffer
|
||||||
|
t.Run(n, func(t *testing.T) {
|
||||||
if err := tmpl.Execute(&actual, Values{Messages: tt}); err != nil {
|
if err := tmpl.Execute(&actual, Values{Messages: tt}); err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
@ -120,6 +120,25 @@ func TestTemplate(t *testing.T) {
|
||||||
t.Errorf("mismatch (-got +want):\n%s", diff)
|
t.Errorf("mismatch (-got +want):\n%s", diff)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
t.Run("legacy", func(t *testing.T) {
|
||||||
|
var legacy bytes.Buffer
|
||||||
|
if err := tmpl.Execute(&legacy, Values{Messages: tt, forceLegacy: true}); err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
legacyBytes := legacy.Bytes()
|
||||||
|
if slices.Contains([]string{"chatqa.gotmpl", "openchat.gotmpl", "vicuna.gotmpl"}, match) && legacyBytes[len(legacyBytes)-1] == ' ' {
|
||||||
|
t.Log("removing trailing space from legacy output")
|
||||||
|
legacyBytes = legacyBytes[:len(legacyBytes)-1]
|
||||||
|
} else if slices.Contains([]string{"codellama-70b-instruct.gotmpl", "llama2-chat.gotmpl", "mistral-instruct.gotmpl"}, match) {
|
||||||
|
t.Skip("legacy outputs cannot be compared to messages outputs")
|
||||||
|
}
|
||||||
|
|
||||||
|
if diff := cmp.Diff(legacyBytes, actual.Bytes()); diff != "" {
|
||||||
|
t.Errorf("mismatch (-got +want):\n%s", diff)
|
||||||
|
}
|
||||||
|
})
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -136,6 +155,21 @@ func TestParse(t *testing.T) {
|
||||||
{"{{ with .Tools }}{{ . }}{{ end }} {{ .System }} {{ .Prompt }}", []string{"prompt", "response", "system", "tools"}},
|
{"{{ with .Tools }}{{ . }}{{ end }} {{ .System }} {{ .Prompt }}", []string{"prompt", "response", "system", "tools"}},
|
||||||
{"{{ range .Messages }}{{ .Role }} {{ .Content }}{{ end }}", []string{"content", "messages", "role"}},
|
{"{{ range .Messages }}{{ .Role }} {{ .Content }}{{ end }}", []string{"content", "messages", "role"}},
|
||||||
{"{{ range .Messages }}{{ if eq .Role \"system\" }}SYSTEM: {{ .Content }}{{ else if eq .Role \"user\" }}USER: {{ .Content }}{{ else if eq .Role \"assistant\" }}ASSISTANT: {{ .Content }}{{ end }}{{ end }}", []string{"content", "messages", "role"}},
|
{"{{ range .Messages }}{{ if eq .Role \"system\" }}SYSTEM: {{ .Content }}{{ else if eq .Role \"user\" }}USER: {{ .Content }}{{ else if eq .Role \"assistant\" }}ASSISTANT: {{ .Content }}{{ end }}{{ end }}", []string{"content", "messages", "role"}},
|
||||||
|
{`{{- if .Messages }}
|
||||||
|
{{- if .System }}<|im_start|>system
|
||||||
|
{{ .System }}<|im_end|>
|
||||||
|
{{ end }}
|
||||||
|
{{- range .Messages }}<|im_start|>{{ .Role }}
|
||||||
|
{{ .Content }}<|im_end|>
|
||||||
|
{{ end }}<|im_start|>assistant
|
||||||
|
{{ else -}}
|
||||||
|
{{ if .System }}<|im_start|>system
|
||||||
|
{{ .System }}<|im_end|>
|
||||||
|
{{ end }}{{ if .Prompt }}<|im_start|>user
|
||||||
|
{{ .Prompt }}<|im_end|>
|
||||||
|
{{ end }}<|im_start|>assistant
|
||||||
|
{{ .Response }}<|im_end|>
|
||||||
|
{{- end -}}`, []string{"content", "messages", "prompt", "response", "role", "system"}},
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, tt := range cases {
|
for _, tt := range cases {
|
||||||
|
@ -145,9 +179,8 @@ func TestParse(t *testing.T) {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
vars := tmpl.Vars()
|
if diff := cmp.Diff(tmpl.Vars(), tt.vars); diff != "" {
|
||||||
if !slices.Equal(tt.vars, vars) {
|
t.Errorf("mismatch (-got +want):\n%s", diff)
|
||||||
t.Errorf("expected %v, got %v", tt.vars, vars)
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -170,7 +203,7 @@ func TestExecuteWithMessages(t *testing.T) {
|
||||||
{"no response", `[INST] {{ if .System }}{{ .System }}{{ "\n\n" }}{{ end }}{{ .Prompt }}[/INST] `},
|
{"no response", `[INST] {{ if .System }}{{ .System }}{{ "\n\n" }}{{ end }}{{ .Prompt }}[/INST] `},
|
||||||
{"response", `[INST] {{ if .System }}{{ .System }}{{ "\n\n" }}{{ end }}{{ .Prompt }}[/INST] {{ .Response }}`},
|
{"response", `[INST] {{ if .System }}{{ .System }}{{ "\n\n" }}{{ end }}{{ .Prompt }}[/INST] {{ .Response }}`},
|
||||||
{"messages", `{{- range $index, $_ := .Messages }}
|
{"messages", `{{- range $index, $_ := .Messages }}
|
||||||
{{- if eq .Role "user" }}[INST] {{ if and (eq (len (slice $.Messages $index)) 1) $.System }}{{ $.System }}{{ "\n\n" }}
|
{{- if eq .Role "user" }}[INST] {{ if and (eq $index 0) $.System }}{{ $.System }}{{ "\n\n" }}
|
||||||
{{- end }}{{ .Content }}[/INST] {{ else if eq .Role "assistant" }}{{ .Content }}
|
{{- end }}{{ .Content }}[/INST] {{ else if eq .Role "assistant" }}{{ .Content }}
|
||||||
{{- end }}
|
{{- end }}
|
||||||
{{- end }}`},
|
{{- end }}`},
|
||||||
|
@ -191,7 +224,7 @@ func TestExecuteWithMessages(t *testing.T) {
|
||||||
{"response", `[INST] {{ if .System }}{{ .System }}{{ "\n\n" }}{{ end }}{{ .Prompt }}[/INST] {{ .Response }}`},
|
{"response", `[INST] {{ if .System }}{{ .System }}{{ "\n\n" }}{{ end }}{{ .Prompt }}[/INST] {{ .Response }}`},
|
||||||
{"messages", `
|
{"messages", `
|
||||||
{{- range $index, $_ := .Messages }}
|
{{- range $index, $_ := .Messages }}
|
||||||
{{- if eq .Role "user" }}[INST] {{ if and (eq (len (slice $.Messages $index)) 1) $.System }}{{ $.System }}{{ "\n\n" }}
|
{{- if eq .Role "user" }}[INST] {{ if and (eq $index 0) $.System }}{{ $.System }}{{ "\n\n" }}
|
||||||
{{- end }}{{ .Content }}[/INST] {{ else if eq .Role "assistant" }}{{ .Content }}
|
{{- end }}{{ .Content }}[/INST] {{ else if eq .Role "assistant" }}{{ .Content }}
|
||||||
{{- end }}
|
{{- end }}
|
||||||
{{- end }}`},
|
{{- end }}`},
|
||||||
|
@ -204,9 +237,9 @@ func TestExecuteWithMessages(t *testing.T) {
|
||||||
{Role: "user", Content: "What is your name?"},
|
{Role: "user", Content: "What is your name?"},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
`[INST] Hello friend![/INST] Hello human![INST] You are a helpful assistant!
|
`[INST] You are a helpful assistant!
|
||||||
|
|
||||||
What is your name?[/INST] `,
|
Hello friend![/INST] Hello human![INST] What is your name?[/INST] `,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"chatml",
|
"chatml",
|
||||||
|
@ -221,7 +254,7 @@ What is your name?[/INST] `,
|
||||||
`},
|
`},
|
||||||
{"messages", `
|
{"messages", `
|
||||||
{{- range $index, $_ := .Messages }}
|
{{- range $index, $_ := .Messages }}
|
||||||
{{- if and (eq .Role "user") (eq (len (slice $.Messages $index)) 1) $.System }}<|im_start|>system
|
{{- if and (eq .Role "user") (eq $index 0) $.System }}<|im_start|>system
|
||||||
{{ $.System }}<|im_end|>{{ "\n" }}
|
{{ $.System }}<|im_end|>{{ "\n" }}
|
||||||
{{- end }}<|im_start|>{{ .Role }}
|
{{- end }}<|im_start|>{{ .Role }}
|
||||||
{{ .Content }}<|im_end|>{{ "\n" }}
|
{{ .Content }}<|im_end|>{{ "\n" }}
|
||||||
|
@ -236,12 +269,12 @@ What is your name?[/INST] `,
|
||||||
{Role: "user", Content: "What is your name?"},
|
{Role: "user", Content: "What is your name?"},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
`<|im_start|>user
|
`<|im_start|>system
|
||||||
|
You are a helpful assistant!<|im_end|>
|
||||||
|
<|im_start|>user
|
||||||
Hello friend!<|im_end|>
|
Hello friend!<|im_end|>
|
||||||
<|im_start|>assistant
|
<|im_start|>assistant
|
||||||
Hello human!<|im_end|>
|
Hello human!<|im_end|>
|
||||||
<|im_start|>system
|
|
||||||
You are a helpful assistant!<|im_end|>
|
|
||||||
<|im_start|>user
|
<|im_start|>user
|
||||||
What is your name?<|im_end|>
|
What is your name?<|im_end|>
|
||||||
<|im_start|>assistant
|
<|im_start|>assistant
|
||||||
|
@ -300,8 +333,8 @@ Answer: `,
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if b.String() != tt.expected {
|
if diff := cmp.Diff(b.String(), tt.expected); diff != "" {
|
||||||
t.Errorf("expected\n%s,\ngot\n%s", tt.expected, b.String())
|
t.Errorf("mismatch (-got +want):\n%s", diff)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,6 @@
|
||||||
You are a helpful assistant.### Instruction:
|
You are a helpful assistant.
|
||||||
|
|
||||||
|
### Instruction:
|
||||||
Hello, how are you?
|
Hello, how are you?
|
||||||
|
|
||||||
### Response:
|
### Response:
|
||||||
|
|
|
@ -9,3 +9,4 @@ Source: system
|
||||||
I'd like to show off how chat templating works! <step> Source: assistant
|
I'd like to show off how chat templating works! <step> Source: assistant
|
||||||
Destination: user
|
Destination: user
|
||||||
|
|
||||||
|
|
|
@ -3,3 +3,4 @@ Source: user
|
||||||
Hello, how are you? <step> Source: assistant
|
Hello, how are you? <step> Source: assistant
|
||||||
Destination: user
|
Destination: user
|
||||||
|
|
||||||
|
|
|
@ -7,3 +7,4 @@ Source: user
|
||||||
I'd like to show off how chat templating works! <step> Source: assistant
|
I'd like to show off how chat templating works! <step> Source: assistant
|
||||||
Destination: user
|
Destination: user
|
||||||
|
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
GPT Correct System: You are a helpful assistant.<|end_of_turn|>GPT Correct User: Hello, how are you?<|end_of_turn|>GPT Correct Assistant: I'm doing great. How can I help you today?<|end_of_turn|>GPT Correct User: I'd like to show off how chat templating works!<|end_of_turn|>GPT Correct Assistant:
|
GPT4 Correct System: You are a helpful assistant.<|end_of_turn|>GPT4 Correct User: Hello, how are you?<|end_of_turn|>GPT4 Correct Assistant: I'm doing great. How can I help you today?<|end_of_turn|>GPT4 Correct User: I'd like to show off how chat templating works!<|end_of_turn|>GPT4 Correct Assistant:
|
2
template/testdata/openchat.gotmpl/user
vendored
2
template/testdata/openchat.gotmpl/user
vendored
|
@ -1 +1 @@
|
||||||
GPT Correct User: Hello, how are you?<|end_of_turn|>GPT Correct Assistant:
|
GPT4 Correct User: Hello, how are you?<|end_of_turn|>GPT4 Correct Assistant:
|
|
@ -1 +1 @@
|
||||||
GPT Correct User: Hello, how are you?<|end_of_turn|>GPT Correct Assistant: I'm doing great. How can I help you today?<|end_of_turn|>GPT Correct User: I'd like to show off how chat templating works!<|end_of_turn|>GPT Correct Assistant:
|
GPT4 Correct User: Hello, how are you?<|end_of_turn|>GPT4 Correct Assistant: I'm doing great. How can I help you today?<|end_of_turn|>GPT4 Correct User: I'd like to show off how chat templating works!<|end_of_turn|>GPT4 Correct Assistant:
|
|
@ -7,8 +7,9 @@
|
||||||
{{ else if eq .Role "assistant" }}ASSISTANT: {{ .Content }}</s>
|
{{ else if eq .Role "assistant" }}ASSISTANT: {{ .Content }}</s>
|
||||||
{{ end }}
|
{{ end }}
|
||||||
{{- end }}ASSISTANT:
|
{{- end }}ASSISTANT:
|
||||||
{{- else }}
|
{{- else -}}
|
||||||
{{ if .System }}{{ .System }}
|
{{ if .System }}{{ .System }}
|
||||||
|
|
||||||
{{ end }}{{ if .Prompt }}USER: {{ .Prompt }}
|
{{ end }}{{ if .Prompt }}USER: {{ .Prompt }}
|
||||||
{{ end }}ASSISTANT: {{ .Response }}
|
{{ end }}ASSISTANT: {{ .Response }}</s>
|
||||||
{{- end }}
|
{{ end -}}
|
|
@ -5,11 +5,11 @@
|
||||||
{{- range .Messages }}<|{{ .Role }}|>
|
{{- range .Messages }}<|{{ .Role }}|>
|
||||||
{{ .Content }}</s>
|
{{ .Content }}</s>
|
||||||
{{ end }}<|assistant|>
|
{{ end }}<|assistant|>
|
||||||
{{ else }}
|
{{ else -}}
|
||||||
{{ if .System }}<|system|>
|
{{ if .System }}<|system|>
|
||||||
{{ .System }}</s>
|
{{ .System }}</s>
|
||||||
{{ end }}{{ if .Prompt }}<|user|>
|
{{ end }}{{ if .Prompt }}<|user|>
|
||||||
{{ .Prompt }}</s>
|
{{ .Prompt }}</s>
|
||||||
{{ end }}<|assistant|>
|
{{ end }}<|assistant|>
|
||||||
{{ .Response }}</s>
|
{{ .Response }}</s>
|
||||||
{{- end }}
|
{{ end -}}
|
Loading…
Reference in a new issue