ブログペルソナ - ライティングボイス管理 は何をしますか?
NNGroupの4次元トーンフレームワークとCMIブランドボイスチャートに基づいて、ライティングペルソナを作成、保存、適用します。ペルソナにより、blog-write および blog-rewrite が生成するすべてのブログコンテンツで一貫したボイスを実現します。
コマンド
| コマンド | 目的 |
|---|---|
/blog persona create | 新しいペルソナを作成するための対話式インタビュー |
/blog persona list | 保存済みの全ペルソナを表示 |
/blog persona use <name> | 現在のセッションでアクティブなペルソナを設定 |
/blog persona show <name> | ペルソナの全プロフィールを表示 |
作成ワークフロー
6ステップの対話式インタビューを実行します。各ステップごとに質問し、ユーザーの応答を待ってから次に進みます。
ステップ1: ブランド基本情報
ユーザーに以下を尋ねます:
- ブランド名 - 企業または個人ブランド
- 業界 - 主なセクター(例: SaaS、ヘルスケア、金融、教育)
- ターゲットオーディエンス - ブログの読者(役割、経験レベル、目標)
- ブランドのミッション(一文) - ブランドがユーザーの何を支援するか
ステップ2: トーン次元(NNGroupフレームワーク)
各次元を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](やや真面目、バランスの取れた形式、敬意、バランスの取れた熱意)
ステップ3: ライティングルール
まずユーザーに 語彙レベル を選んでもらい、それに応じて読みやすさ帯域を自動提案します(ユーザーは上書き可能)。
| 設定 | 質問内容 | デフォルト |
|---|---|---|
| 語彙レベル | 消費者向け、プロフェッショナル向け、技術向け | プロフェッショナル向け |
| 読みやすさ帯域 | レベルから自動入力(以下の表参照) | グレード8-10 |
| 文の平均長 | 1文あたりの平均単語数 | 18 |
| 文の長さの標準偏差 | 文の長さのばらつき | 6 |
| 短縮形の頻度 | 0.0(不使用)~1.0(常に使用) | 0.6 |
| 受動態の最大割合 | 受動態構文の割合上限 | 10% |
ステップ4: Do's and Don'ts(CMIブランドボイスチャート)
各リストに3~5項目を求めます。トーン次元に基づいたスターター例を提供します。
Doの例: 「主張をデータで裏付ける」「読者を「あなた」と呼びかける」「質問や統計で書き出しを始める」
Don'tsの例: 「定義せずに専門用語を使わない」「「There is/There are」で文を始めない」「「ゲームチェンジャー」のような決まり文句を使わない」
ステップ5: サマリーラベルの設定
ブログ記事のまとめ/ポイント枠に使うラベルを指定します。ユーザーに1つ選んでもらいます:
- Key Takeaways(デフォルト)
- The Bottom Line
- What You'll Learn
- TL;DR
- Quick Summary
- In a Nutshell
- カスタムラベル
ステップ6: ボイスサンプル(任意)
ユーザーが希望するボイスを体現する既存コンテンツのURL(1~3件)があるか尋ねます。URLをペルソナに保存して将来参照できるようにします。URLが提供された場合、各URLを読み取り、以下を抽出します:
- 平均文長
- 短縮形の頻度
- トーン次元の推定値
- 語彙レベル
抽出値をペルソナ設定と比較し、不一致があればフラグを立てます。
保存
完成したペルソナをJSONとして以下に書き込みます:
skills/blog/references/personas/<name>.json
ファイル名はケバブケースを使用します(例: acme-saas.json)。
ペルソナプロフィールスキーマ
{
"name": "acme-saas",
"description": "B2Bマーケティングコンテンツ向けプロフェッショナルSaaSボイス",
"brand": "Acme Corp",
"industry": "SaaS",
"audience": "ミッドマーケット企業のマーケティングマネージャー",
"mission": "マーケティングチームのレポート自動化を支援する",
"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": [
"主要な主張をデータで裏付ける",
"読者に「あなた」と直接呼びかける",
"セクションは実用的な洞察で始める"
],
"dont": [
"文脈なしでバズワードを使わない",
"30単語を超える文を書かない",
"「Acmeでは」で書き出さない"
]
}
語彙レベル別の読みやすさ帯域
| レベル | フレッシュグレード | フレッシュリーディングイーズ | 典型的な用途 |
|---|---|---|---|
| Consumer(消費者向け) | 6-8 | 60-80 | 健康、ライフスタイル、個人金融 |
| Professional(プロフェッショナル向け) | 8-10 | 50-60 | B2B、マーケティング、マネジメント |
| Technical(技術向け) | 10-12 | 30-50 | エンジニアリング、医療、法律 |
ユーザーがレベルを選択したら、読みやすさフィールドを自動入力します。ユーザーが説明コンテンツ用に技術向け語彙×消費者向け読みやすさなど、標準以外の組み合わせを希望する場合は、上書きを許可します。
blog-write および blog-rewrite との連携
ペルソナがアクティブな場合(/blog persona use <name> で設定)、ライターエージェントはペルソナJSONを読み込み、生成時に以下の制約を適用します:
- 生成前 - ペルソナを読み込み、トーン次元とスタイルルールをブログライターエージェントのシステムプロンプトに注入します。
- 生成中 - ライターはDo/Don'tルールに従い、目標の文長平均/標準偏差を目指し、指定された頻度で短縮形を使用します。
- 生成後バリデーション - 出力をペルソナ制約に対してチェックします:
- 文長分布が目標平均の1標準偏差以内であること
- 読みやすさスコアが指定されたグレード帯域内であること
- 受動態の割合が上限未満であること
- Don'tルールに違反していないことをパターンマッチングで確認
バリデーションに失敗した場合、該当する違反をフラグし、修正案を提示します。
リストコマンド
skills/blog/references/personas/*.json をグロブし、以下のテーブルを表示します:
| ペルソナ | 業界 | オーディエンス | 語彙レベル |
|---|---|---|---|
| acme-saas | SaaS | マーケティングマネージャー | プロフェッショナル |
ペルソナが存在しない場合、作成を促します。
表示コマンド
指定されたペルソナJSONを読み取り、すべてのトーン次元、スタイルルール、Do/Don'tリストを含む整形されたサマリーとして表示します。
使用コマンド
ペルソナJSONを読み取り、アクティブ化を確認します。適用される主要な制約のサマリーを表示します。ペルソナは現在の会話セッション中アクティブ状態を維持します。blog-write と blog-rewrite はコンテンツ生成前にアクティブなペルソナを確認します。
エラーハンドリング
- 無効なトーン値: ユーザーが0.0~1.0の範囲外の値を入力した場合、最も近い有効な境界にクランプし、警告します。
- 取得不能なボイスサンプル: voice_samplesのURLがエラーを返した場合、スキップし、プロフィールにサンプルが利用不可であったことを記録します。
- 空のペルソナディレクトリ: 保存済みペルソナがない状態でlistまたはshowを実行した場合、最初に作成するよう促します。
- 名前の競合: 作成時に既存のペルソナ名と重複した場合、上書きするか別の名前を選択するか尋ねます。
- 不正なJSON: ペルソナファイルが破損している場合、エラーを報告し、インタビューから再作成するオプションを提供します。