blog-persona
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseBlog Persona - Writing Voice Management
博客写作角色 - 语气管理
Create, store, and enforce writing personas based on the NNGroup 4-dimension tone
framework and CMI Brand Voice Chart. Personas ensure consistent voice across all
blog content produced by blog-write and blog-rewrite.
基于NNGroup四维语气框架和CMI品牌语气图表创建、存储并执行写作角色。写作角色可确保blog-write和blog-rewrite生成的所有博客内容语气一致。
Commands
命令
| Command | Purpose |
|---|---|
| Interactive interview to build a new persona |
| Show all saved personas |
| Set active persona for current session |
| Display full persona profile |
| 命令 | 用途 |
|---|---|
| 交互式访谈以创建新角色 |
| 显示所有已保存的角色 |
| 设置当前会话的活跃角色 |
| 显示完整的角色档案 |
Create Workflow
创建流程
Run the 6-step interactive interview. Ask each step, wait for response, then proceed.
运行6步交互式访谈。依次询问每一步,等待用户回复后再继续。
Step 1: Brand Basics
步骤1:品牌基础
Ask the user for:
- Brand name - company or personal brand
- Industry - primary sector (e.g., SaaS, health, finance, education)
- Target audience - who reads the blog (role, experience level, goals)
- One-sentence brand mission - what the brand helps people do
询问用户以下信息:
- 品牌名称 - 企业或个人品牌
- 行业 - 核心领域(如SaaS、健康、金融、教育)
- 目标受众 - 博客的读者群体(角色、经验水平、目标)
- 一句话品牌使命 - 品牌能为用户提供什么帮助
Step 2: Tone Dimensions (NNGroup Framework)
步骤2:语气维度(NNGroup框架)
Present each dimension as a 0.0 to 1.0 slider. Explain both ends with examples.
| Dimension | 0.0 End | 1.0 End | Example at 0.0 | Example at 1.0 |
|---|---|---|---|---|
| funny_serious | Funny | Serious | "Let's be real, nobody reads Terms of Service" | "Understanding legal agreements protects your business" |
| formal_casual | Formal | Casual | "We are pleased to announce" | "Guess what - we shipped it!" |
| respectful_irreverent | Respectful | Irreverent | "We appreciate your patience" | "Yeah, that old way was broken" |
| enthusiastic_matter_of_fact | Enthusiastic | Matter-of-fact | "This changes everything!" | "Here are the results." |
Defaults if user is unsure: (slightly serious, balanced formality,
respectful, balanced enthusiasm).
[0.6, 0.5, 0.3, 0.5]将每个维度展示为0.0到1.0的滑块,并用示例解释两端的含义。
| 维度 | 0.0端 | 1.0端 | 0.0端示例 | 1.0端示例 |
|---|---|---|---|---|
| funny_serious | 诙谐 | 严肃 | "说实话,没人会读服务条款" | "理解法律协议能保护您的业务" |
| formal_casual | 正式 | 随意 | "我们很高兴宣布" | "猜猜看——我们上线了!" |
| respectful_irreverent | 恭敬 | 不敬 | "感谢您的耐心等待" | "没错,旧方法已经行不通了" |
| enthusiastic_matter_of_fact | 热情 | 实事求是 | "这彻底改变了一切!" | "以下是结果。" |
若用户不确定,默认值为:(略带严肃、正式与随意平衡、恭敬、热情与实事求是平衡)。
[0.6, 0.5, 0.3, 0.5]Step 3: Writing Rules
步骤3:写作规则
Ask the user to pick a vocabulary tier first, then auto-suggest the matching
readability band (user can override).
| Setting | What to Ask | Default |
|---|---|---|
| Vocabulary tier | Consumer, Professional, or Technical | Professional |
| Readability band | Auto-filled from tier (see table below) | Grade 8-10 |
| Sentence length mean | Average words per sentence | 18 |
| Sentence length std | Variation in sentence length | 6 |
| Contraction frequency | 0.0 (never) to 1.0 (always) | 0.6 |
| Max passive voice | Percentage cap on passive constructions | 10% |
先询问用户选择词汇层级,然后自动推荐匹配的可读性区间(用户可覆盖)。
| 设置 | 询问内容 | 默认值 |
|---|---|---|
| 词汇层级 | 大众级、专业级或技术级 | 专业级 |
| 可读性区间 | 根据层级自动填充(见下表) | 8-10年级水平 |
| 平均句子长度 | 平均每句单词数 | 18 |
| 句子长度标准差 | 句子长度的变化幅度 | 6 |
| 缩写使用频率 | 0.0(从不)至1.0(总是) | 0.6 |
| 被动语态上限 | 被动句式的占比上限 | 10% |
Step 4: Do's and Don'ts (CMI Brand Voice Chart)
步骤4:注意事项(CMI品牌语气图表)
Ask for 3-5 items in each list. Provide starter examples based on the tone dimensions.
Example Do's: "Use data to back claims", "Address the reader as you",
"Open with a question or stat"
Example Don'ts: "Don't use jargon without defining it", "Don't start sentences
with There is/There are", "Don't use cliches like game-changer"
询问用户在每个列表中提供3-5项内容。根据语气维度提供示例参考。
示例注意事项(Do): "用数据支撑观点"、"用‘你’称呼读者"、"以问题或数据开篇"
示例注意事项(Don't): "不要使用未定义的行话"、"不要以‘There is/There are’开头"、"不要使用‘game-changer’这类陈词滥调"
Step 5: Summary Label Preference
步骤5:摘要标签偏好
The label used for summary/takeaway boxes in blog posts. Ask user to pick one:
- Key Takeaways (default)
- The Bottom Line
- What You'll Learn
- TL;DR
- Quick Summary
- In a Nutshell
- Custom label
博客文章中摘要/要点框使用的标签。让用户选择以下选项之一:
- Key Takeaways(默认)
- The Bottom Line
- What You'll Learn
- TL;DR
- Quick Summary
- In a Nutshell
- 自定义标签
Step 6: Voice Samples (Optional)
步骤6:语气示例(可选)
Ask if the user has 1-3 URLs of existing content that exemplifies the desired voice.
Store URLs in the persona for future reference. If provided, read each URL and extract:
- Average sentence length
- Contraction frequency
- Tone dimension estimates
- Vocabulary level
Compare extracted values with the persona settings and flag any mismatches.
询问用户是否有1-3个体现理想语气的现有内容URL。将URL存储在角色档案中供后续参考。若提供URL,读取每个URL并提取:
- 平均句子长度
- 缩写使用频率
- 语气维度估算值
- 词汇水平
将提取的值与角色设置进行比较,标记任何不匹配之处。
Save
保存
Write the completed persona as JSON to:
skills/blog/references/personas/<name>.jsonUse kebab-case for the filename (e.g., ).
acme-saas.json将完成的角色以JSON格式写入:
skills/blog/references/personas/<name>.json文件名使用短横线分隔的小写格式(如)。
acme-saas.jsonPersona Profile Schema
角色档案架构
json
{
"name": "acme-saas",
"description": "Professional SaaS voice for B2B marketing content",
"brand": "Acme Corp",
"industry": "SaaS",
"audience": "Marketing managers at mid-market companies",
"mission": "Help marketing teams automate reporting",
"tone_dimensions": {
"funny_serious": 0.7,
"formal_casual": 0.4,
"respectful_irreverent": 0.2,
"enthusiastic_matter_of_fact": 0.5
},
"readability": {
"flesch_grade_min": 8,
"flesch_grade_max": 10,
"flesch_ease_min": 50,
"flesch_ease_max": 60
},
"style": {
"sentence_length_mean": 18,
"sentence_length_std": 6,
"contraction_frequency": 0.6,
"passive_voice_max_pct": 10,
"vocabulary_tier": "professional",
"summary_label": "Key Takeaways"
},
"voice_samples": [],
"do": [
"Use data to back every major claim",
"Address the reader directly as you",
"Lead sections with actionable insight"
],
"dont": [
"Don't use buzzwords without context",
"Don't write sentences longer than 30 words",
"Don't open with We at Acme"
]
}json
{
"name": "acme-saas",
"description": "Professional SaaS voice for B2B marketing content",
"brand": "Acme Corp",
"industry": "SaaS",
"audience": "Marketing managers at mid-market companies",
"mission": "Help marketing teams automate reporting",
"tone_dimensions": {
"funny_serious": 0.7,
"formal_casual": 0.4,
"respectful_irreverent": 0.2,
"enthusiastic_matter_of_fact": 0.5
},
"readability": {
"flesch_grade_min": 8,
"flesch_grade_max": 10,
"flesch_ease_min": 50,
"flesch_ease_max": 60
},
"style": {
"sentence_length_mean": 18,
"sentence_length_std": 6,
"contraction_frequency": 0.6,
"passive_voice_max_pct": 10,
"vocabulary_tier": "professional",
"summary_label": "Key Takeaways"
},
"voice_samples": [],
"do": [
"Use data to back every major claim",
"Address the reader directly as you",
"Lead sections with actionable insight"
],
"dont": [
"Don't use buzzwords without context",
"Don't write sentences longer than 30 words",
"Don't open with We at Acme"
]
}Readability Bands by Vocabulary Tier
各词汇层级对应的可读性区间
| Tier | Flesch Grade | Flesch Ease | Typical Use |
|---|---|---|---|
| Consumer | 6-8 | 60-80 | Health, lifestyle, personal finance |
| Professional | 8-10 | 50-60 | B2B, marketing, management |
| Technical | 10-12 | 30-50 | Engineering, medical, legal |
When the user picks a tier, auto-fill the readability fields. Let them override
if they want a non-standard combination (e.g., technical vocabulary at consumer
readability for explainer content).
| 层级 | Flesch年级水平 | Flesch易读度 | 典型用途 |
|---|---|---|---|
| 大众级 | 6-8 | 60-80 | 健康、生活方式、个人理财 |
| 专业级 | 8-10 | 50-60 | B2B、营销、管理 |
| 技术级 | 10-12 | 30-50 | 工程、医疗、法律 |
当用户选择层级后,自动填充可读性字段。若用户需要非标准组合(如面向大众可读性的技术词汇解释内容),允许其覆盖默认值。
Integration with blog-write and blog-rewrite
与blog-write和blog-rewrite的集成
When a persona is active (via ), the writer agent loads
the persona JSON and enforces these constraints during generation:
/blog persona use <name>- Pre-generation - Load persona, inject tone dimensions and style rules into the system prompt for the blog-writer agent.
- During generation - Writer follows do/dont rules, targets sentence length mean/std, uses contractions at specified frequency.
- Post-generation validation - Check the output against persona constraints:
- Sentence length distribution within 1 std of target mean
- Readability score within the specified grade band
- Passive voice percentage under the max
- No violations of "dont" rules found via pattern matching
If validation fails, flag the specific violations and suggest edits.
当角色处于活跃状态(通过命令)时,写作Agent会加载角色JSON,并在生成内容时执行以下约束:
/blog persona use <name>- 生成前 - 加载角色,将语气维度和风格规则注入blog-writer Agent的系统提示词中。
- 生成过程中 - 写作遵循Do/Don't规则,以目标平均句子长度/标准差为基准,按指定频率使用缩写。
- 生成后验证 - 检查输出是否符合角色约束:
- 句子长度分布在目标平均值的1个标准差范围内
- 可读性分数在指定年级区间内
- 被动语态占比低于上限
- 通过模式匹配未发现违反Don't规则的内容
若验证失败,标记具体违规内容并建议修改。
List Command
列表命令
Glob and display a table:
skills/blog/references/personas/*.json| Persona | Industry | Audience | Vocabulary |
|---|---|---|---|
| acme-saas | SaaS | Marketing managers | Professional |
If no personas exist, prompt the user to create one.
遍历文件并显示表格:
skills/blog/references/personas/*.json| 角色 | 行业 | 受众 | 词汇层级 |
|---|---|---|---|
| acme-saas | SaaS | 营销经理(中型企业) | 专业级 |
若不存在任何角色,提示用户创建一个。
Show Command
展示命令
Read the specified persona JSON and display it as a formatted summary with all
tone dimensions, style rules, and do/dont lists.
读取指定的角色JSON文件,以格式化摘要的形式显示所有语气维度、风格规则和Do/Don't列表。
Use Command
使用命令
Read the persona JSON and confirm activation. Print a summary of the key constraints
that will be enforced. The persona stays active for the current conversation session.
Blog-write and blog-rewrite check for the active persona before generating content.
读取角色JSON并确认激活。打印将执行的关键约束摘要。该角色在当前对话会话中保持活跃状态。blog-write和blog-rewrite在生成内容前会检查是否有活跃角色。
Error Handling
错误处理
- Invalid tone values: If a user provides values outside 0.0-1.0, clamp to the nearest valid bound and warn
- Unreachable voice samples: If a URL in voice_samples returns an error, skip it and note in the profile that the sample was unavailable
- Empty personas directory: When running list or show with no personas saved, prompt the user to create one first
- Name conflicts: If a persona name already exists during create, ask whether to overwrite or choose a different name
- Malformed JSON: If a persona file is corrupted, report the error and offer to recreate it from the interview
- 无效语气值:若用户提供的值超出0.0-1.0范围,将其限制为最近的有效值并发出警告
- 无法访问的语气示例:若voice_samples中的URL返回错误,跳过该URL并在档案中注明示例不可用
- 角色目录为空:当运行列表或展示命令但未保存任何角色时,提示用户先创建一个
- 名称冲突:创建角色时若名称已存在,询问用户是否覆盖或选择其他名称
- JSON格式错误:若角色文件损坏,报告错误并提供通过访谈重新创建的选项