51 lines
2.3 KiB
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)]
|
|||
|
|
}
|