Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
OpenDAS
ollama
Commits
e64f9ebb
Commit
e64f9ebb
authored
Jul 11, 2024
by
Michael Yang
Browse files
do no automatically aggregate system messages
parent
791650dd
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
27 additions
and
23 deletions
+27
-23
template/template.go
template/template.go
+20
-19
template/template_test.go
template/template_test.go
+7
-4
No files found.
template/template.go
View file @
e64f9ebb
...
@@ -102,8 +102,21 @@ var response = parse.ActionNode{
...
@@ -102,8 +102,21 @@ var response = parse.ActionNode{
},
},
}
}
var
funcs
=
template
.
FuncMap
{
"aggregate"
:
func
(
v
[]
*
api
.
Message
,
role
string
)
string
{
var
aggregated
[]
string
for
_
,
m
:=
range
v
{
if
m
.
Role
==
role
{
aggregated
=
append
(
aggregated
,
m
.
Content
)
}
}
return
strings
.
Join
(
aggregated
,
"
\n\n
"
)
},
}
func
Parse
(
s
string
)
(
*
Template
,
error
)
{
func
Parse
(
s
string
)
(
*
Template
,
error
)
{
tmpl
:=
template
.
New
(
""
)
.
Option
(
"missingkey=zero"
)
tmpl
:=
template
.
New
(
""
)
.
Option
(
"missingkey=zero"
)
.
Funcs
(
funcs
)
tmpl
,
err
:=
tmpl
.
Parse
(
s
)
tmpl
,
err
:=
tmpl
.
Parse
(
s
)
if
err
!=
nil
{
if
err
!=
nil
{
...
@@ -149,23 +162,21 @@ type Values struct {
...
@@ -149,23 +162,21 @@ type Values struct {
}
}
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
)
collated
:=
collate
(
v
.
Messages
)
if
!
v
.
forceLegacy
&&
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
,
"Messages"
:
collated
,
"Messages"
:
collated
,
})
})
}
}
var
b
bytes
.
Buffer
var
b
bytes
.
Buffer
var
prompt
,
response
string
var
system
,
prompt
,
response
string
for
i
,
m
:=
range
collated
{
for
i
,
m
:=
range
collated
{
switch
m
.
Role
{
switch
m
.
Role
{
case
"system"
:
system
=
m
.
Content
case
"user"
:
case
"user"
:
prompt
=
m
.
Content
prompt
=
m
.
Content
if
i
!=
0
{
system
=
""
}
case
"assistant"
:
case
"assistant"
:
response
=
m
.
Content
response
=
m
.
Content
}
}
...
@@ -179,6 +190,7 @@ func (t *Template) Execute(w io.Writer, v Values) error {
...
@@ -179,6 +190,7 @@ func (t *Template) Execute(w io.Writer, v Values) error {
return
err
return
err
}
}
system
=
""
prompt
=
""
prompt
=
""
response
=
""
response
=
""
}
}
...
@@ -209,25 +221,14 @@ func (t *Template) Execute(w io.Writer, v Values) error {
...
@@ -209,25 +221,14 @@ func (t *Template) Execute(w io.Writer, v Values) error {
return
err
return
err
}
}
type
messages
[]
*
api
.
Message
// collate messages based on role. consecutive messages of the same role are merged
// collate messages based on role. consecutive messages of the same role are merged
// into a single message. collate also pulls out and merges messages with Role == "system"
// into a single message. collate also pulls out and merges messages with Role == "system"
// which are templated separately. As a side effect, it mangles message content adding image
// which are templated separately. As a side effect, it mangles message content adding image
// tags ([img-%d]) as needed
// tags ([img-%d]) as needed
func
collate
(
msgs
[]
api
.
Message
)
(
system
string
,
collated
m
essage
s
)
{
func
collate
(
msgs
[]
api
.
Message
)
(
collated
[]
*
api
.
M
essage
)
{
var
n
int
var
n
int
for
i
:=
range
msgs
{
for
i
:=
range
msgs
{
msg
:=
msgs
[
i
]
msg
:=
msgs
[
i
]
if
msg
.
Role
==
"system"
{
if
system
!=
""
{
system
+=
"
\n\n
"
}
system
+=
msg
.
Content
continue
}
for
range
msg
.
Images
{
for
range
msg
.
Images
{
imageTag
:=
fmt
.
Sprintf
(
"[img-%d]"
,
n
)
imageTag
:=
fmt
.
Sprintf
(
"[img-%d]"
,
n
)
if
!
strings
.
Contains
(
msg
.
Content
,
"[img]"
)
{
if
!
strings
.
Contains
(
msg
.
Content
,
"[img]"
)
{
...
...
template/template_test.go
View file @
e64f9ebb
...
@@ -122,6 +122,7 @@ func TestTemplate(t *testing.T) {
...
@@ -122,6 +122,7 @@ func TestTemplate(t *testing.T) {
})
})
t
.
Run
(
"legacy"
,
func
(
t
*
testing
.
T
)
{
t
.
Run
(
"legacy"
,
func
(
t
*
testing
.
T
)
{
t
.
Skip
(
"legacy outputs are currently default outputs"
)
var
legacy
bytes
.
Buffer
var
legacy
bytes
.
Buffer
if
err
:=
tmpl
.
Execute
(
&
legacy
,
Values
{
Messages
:
tt
,
forceLegacy
:
true
});
err
!=
nil
{
if
err
:=
tmpl
.
Execute
(
&
legacy
,
Values
{
Messages
:
tt
,
forceLegacy
:
true
});
err
!=
nil
{
t
.
Fatal
(
err
)
t
.
Fatal
(
err
)
...
@@ -154,11 +155,13 @@ func TestParse(t *testing.T) {
...
@@ -154,11 +155,13 @@ func TestParse(t *testing.T) {
{
"{{ .System }} {{ .Prompt }} {{ .Response }}"
,
[]
string
{
"prompt"
,
"response"
,
"system"
}},
{
"{{ .System }} {{ .Prompt }} {{ .Response }}"
,
[]
string
{
"prompt"
,
"response"
,
"system"
}},
{
"{{ 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:
{{- else if eq .Role "user" }}USER:
{{- else if eq .Role "assistant" }}ASSISTANT:
{{- end }} {{ .Content }}
{{- end }}`
,
[]
string
{
"content"
,
"messages"
,
"role"
}},
{
`{{- if .Messages }}
{
`{{- if .Messages }}
{{- if .System }}<|im_start|>system
{{ .System }}<|im_end|>
{{ end }}
{{- range .Messages }}<|im_start|>{{ .Role }}
{{- range .Messages }}<|im_start|>{{ .Role }}
{{ .Content }}<|im_end|>
{{ .Content }}<|im_end|>
{{ end }}<|im_start|>assistant
{{ end }}<|im_start|>assistant
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment