| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980 |
- package service
- import (
- "fmt"
- "math/rand/v2"
- "regexp"
- "strconv"
- )
- // monitorChallengePromptTemplate 1:1 复刻 BingZi-233/check-cx 的 few-shot 模板。
- const monitorChallengePromptTemplate = `Calculate and respond with ONLY the number, nothing else.
- Q: 3 + 5 = ?
- A: 8
- Q: 12 - 7 = ?
- A: 5
- Q: %d %s %d = ?
- A:`
- // monitorChallengeNumberRegex 提取响应中的所有整数(含负号)。
- var monitorChallengeNumberRegex = regexp.MustCompile(`-?\d+`)
- // monitorChallenge 一次 challenge 的 prompt + 期望答案。
- type monitorChallenge struct {
- Prompt string
- Expected string
- }
- // generateChallenge 生成一次随机算术 challenge:
- // - 随机两个 [monitorChallengeMin, monitorChallengeMax] 整数
- // - 50% 加 / 50% 减;减法用 max - min 保证非负
- // - 渲染 few-shot 模板
- //
- // 不强求加密随机:math/rand/v2 足够分散,避免 crypto/rand 的开销。
- func generateChallenge() monitorChallenge {
- a := randIntInRange(monitorChallengeMin, monitorChallengeMax)
- b := randIntInRange(monitorChallengeMin, monitorChallengeMax)
- if rand.IntN(2) == 0 { //nolint:gosec // 仅用于生成测试问题,无安全影响
- // 加法
- return monitorChallenge{
- Prompt: fmt.Sprintf(monitorChallengePromptTemplate, a, "+", b),
- Expected: strconv.Itoa(a + b),
- }
- }
- // 减法,保证非负
- hi, lo := a, b
- if lo > hi {
- hi, lo = lo, hi
- }
- return monitorChallenge{
- Prompt: fmt.Sprintf(monitorChallengePromptTemplate, hi, "-", lo),
- Expected: strconv.Itoa(hi - lo),
- }
- }
- // randIntInRange 返回 [min, max] 闭区间的随机整数。
- func randIntInRange(minVal, maxVal int) int {
- if maxVal <= minVal {
- return minVal
- }
- return minVal + rand.IntN(maxVal-minVal+1) //nolint:gosec
- }
- // validateChallenge 在响应文本中查找 expected 整数答案,返回是否通过校验。
- func validateChallenge(responseText, expected string) bool {
- if responseText == "" || expected == "" {
- return false
- }
- matches := monitorChallengeNumberRegex.FindAllString(responseText, -1)
- for _, m := range matches {
- if m == expected {
- return true
- }
- }
- return false
- }
|