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

51 lines
2.3 KiB
Go

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)]
}