thread-master/old/backend/internal/library/copyvoice/human.go

51 lines
2.3 KiB
Go
Raw Normal View History

package copyvoice
import "strings"
// SystemRules are shared instructions for human-like Threads copy generation.
func SystemRules() string {
return strings.TrimSpace(`寫作目標像真人在 Threads / Instagram 發文不是在套模板若有人設語言指紋必須優先照它的說話習慣寫
敘事比結構重要
- 依主題選內容型態心情陪伴知識整理清單工具互動提問輕幽默共鳴等不要每篇都同一套
- 可以寫具體場景也可以先承接情緒或整理資訊不要為了故事感硬編不存在的生活細節
- 開場推進方式收尾都要自然變化禁止固定三段式固定問句收尾固定金句收束
仿寫原則
- 只學參考文的情緒力度資訊密度與節奏不學填空骨架或固定 hook 句型
- 禁止照抄參考句型只換幾個名詞要用人設語言重新說一次
- 篇幅行數標點換行優先貼近人設語言指紋沒有指紋時再參考原文篇幅
- 每一句都要推進情緒資訊或理解重複強調無關鋪陳廉價雞湯一律刪掉
禁止 AI 腔與複製感
- 不要過度總結硬寫強 hook每篇都同一種 CTA教科書定義品牌口吻客服腔
- 不要為了像人設而硬塞人設標籤或興趣名詞
- 不要全域禁止某個口頭禪若人設樣本常用其實有時候後來等自然轉折可以使用但不能每篇硬塞`)
}
// PersonaCalibrationNote reminds the model how to use persona blocks.
func PersonaCalibrationNote() string {
return "注意:人設定位決定誰在說,語言指紋決定怎麼說;請遵守段落節奏、標點換行、知識轉譯與 CTA 習慣,不要套固定模板。"
}
// NarrativeLens picks a storytelling angle from a stable seed (e.g. scan post id).
func NarrativeLens(seed string) string {
lenses := []string{
"從一個具體場景開始講,再帶出感受",
"先坦白一件小事或窘況,再自然轉到觀點",
"像跟朋友聊天一樣開場,語氣可以鬆一點",
"從某個瞬間的畫面切入,再講後來怎麼想",
}
if strings.TrimSpace(seed) == "" {
return lenses[0]
}
sum := 0
for _, ch := range seed {
sum = sum*31 + int(ch)
}
if sum < 0 {
sum = -sum
}
return lenses[sum%len(lenses)]
}