-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtemplate.go
145 lines (126 loc) · 2.34 KB
/
template.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
package utc
import "strings"
// DefaultMaxOptions is the default value for some template attributes.
const (
DefaultMaxOptions = 10
)
type Example struct {
TextA string
TextB string
Question string
Choices []string
}
type Prompt interface {
BuildText(Example) string
Positions() int
TokenTypes() int
DoTruncate() bool
}
type BasePrompt struct {
Position int
TokenType int
Truncate bool
}
func (p BasePrompt) Positions() int { return p.Position }
func (p BasePrompt) TokenTypes() int { return p.TokenType }
func (p BasePrompt) DoTruncate() bool { return p.Truncate }
type ChoicesPrompt struct {
BasePrompt
AddOMask bool
AddPrompt bool
Length int
}
func (p ChoicesPrompt) BuildText(e Example) string {
var labels []string
for _, c := range e.Choices {
if p.AddOMask {
c = OMaskToken + c
}
labels = append(labels, c)
}
return strings.Join(labels, "")
}
type SepPrompt struct {
BasePrompt
Sep string
}
func (p SepPrompt) BuildText(e Example) string {
return SepToken
}
type TextPrompt struct {
BasePrompt
Text string
}
func (p TextPrompt) BuildText(e Example) string {
switch p.Text {
case "text_a":
return e.TextA
case "text_b":
return e.TextB
}
return ""
}
var (
defaultPrompts = []Prompt{
ChoicesPrompt{
BasePrompt: BasePrompt{
Position: 0,
TokenType: 1,
Truncate: false,
},
AddOMask: true,
Length: DefaultMaxOptions,
},
SepPrompt{
BasePrompt: BasePrompt{
Position: 0,
TokenType: 0,
Truncate: false,
},
},
TextPrompt{
BasePrompt: BasePrompt{
Position: -1,
TokenType: 0, // Same as the previous one.
Truncate: true,
},
Text: "text_a",
},
SepPrompt{
BasePrompt: BasePrompt{
Position: -1,
TokenType: 1,
Truncate: false,
},
},
TextPrompt{
BasePrompt: BasePrompt{
Position: -1,
TokenType: 1, // Same as the previous one.
Truncate: true,
},
Text: "text_b",
},
}
)
type Input struct {
Text string
Positions int
TokenTypes int
DoTruncate bool
}
func BuildInputsWithPrompt(e Example, ps ...Prompt) []Input {
if len(ps) == 0 {
ps = defaultPrompts
}
var inputs []Input
for _, p := range ps {
inputs = append(inputs, Input{
Text: p.BuildText(e),
Positions: p.Positions(),
TokenTypes: p.TokenTypes(),
DoTruncate: p.DoTruncate(),
})
}
return inputs
}