<p><!--META
{
"title": "Negative Promptingで失敗モード抑制",
"primary_category": "AI>LLM>プロンプト工学",
"secondary_categories": ["プロンプト設計", "LLM評価"],
"tags": ["Negative Prompting", "LLM", "プロンプト工学", "失敗モード", "幻覚抑制", "出力制御", "Gemini"],
"summary": "LLMの失敗モード(幻覚、様式崩れ、脱線など)を抑制するためのNegative Promptingの設計、評価、改良サイクルについて解説します。",
"mermaid": true,
"verify_level": "L0",
"tweet_hint": {"text":"LLMの出力品質を高めるNegative Promptingの技術。失敗モードを抑制し、期待通りの出力を得るためのプロンプト設計、評価、改良サイクルを詳細解説。
#LLM #プロンプト工学","hashtags":["#LLM","#プロンプト工学"]},
"link_hints": [
"https://arxiv.org/abs/2405.XXXXX",
"https://ai.google.dev/docs/prompt_engineering_guide",
"https://medium.com/@author/fine-tuning-and-prompting-strategies-for-robust-llm-output-123456789",
"https://www.anthropic.com/index/our-approach-to-ai-safety"
]
}
-->
本記事は<strong>Geminiの出力をプロンプト工学で整理した業務ドラフト(未検証)</strong>です。</p>
<h1 class="wp-block-heading">Negative Promptingで失敗モード抑制</h1>
<p>大規模言語モデル(LLM)の出力は、その高い汎用性から多岐にわたるタスクに応用可能ですが、時に幻覚(Hallucination)、様式崩れ、トピックからの脱線、禁止事項違反といった望ましくない失敗モードを示すことがあります。Negative Promptingは、これらの失敗モードを能動的に抑制し、LLMの出力品質と信頼性を向上させるためのプロンプト工学の重要な手法です。本記事では、Negative Promptingを用いた失敗モード抑制のプロセスを、ユースケース定義からプロンプト設計、評価、改良のサイクルを通して解説します。</p>
<h2 class="wp-block-heading">ユースケース定義</h2>
<p>特定の情報抽出、要約、コード生成などのタスクにおいて、LLMが<strong>望ましくない特徴を持つ出力</strong>を生成することを防ぎたい場合がユースケースとなります。</p>
<p><strong>例:</strong></p>
<ul class="wp-block-list">
<li><p><strong>ニュース記事要約:</strong> 特定の政治的見解や個人的意見を含まない、客観的かつ中立的な要約を生成したい。</p></li>
<li><p><strong>製品説明文作成:</strong> 競合他社名、誹謗中傷、誇大広告表現を含まない、事実に基づいた説明文を生成したい。</p></li>
<li><p><strong>カスタマーサポート応答:</strong> 専門用語を避け、共感的かつ簡潔な言葉で、ネガティブな感情を煽らない応答を生成したい。</p></li>
</ul>
<p>これらのユースケースでは、単に「何を生成すべきか」だけでなく、「<strong>何を生成すべきでないか</strong>」を明確に指示することが、高品質な出力を得る鍵となります。</p>
<h2 class="wp-block-heading">制約付き仕様化</h2>
<p>Negative Promptingの効果を最大化するためには、出力の入出力契約と、禁止事項を明確に定義することが不可欠です。</p>
<p><strong>入出力契約:</strong></p>
<ul class="wp-block-list">
<li><p><strong>入力:</strong> ユーザーからのテキストプロンプト(例:要約対象のニュース記事、製品情報)。</p></li>
<li><p><strong>出力:</strong></p>
<ul>
<li><p><strong>フォーマット:</strong> 指定された形式(例:Markdown、JSON、プレーンテキスト)に従うこと。</p></li>
<li><p><strong>失敗時の挙動:</strong> 指定された制約を遵守できないと判断した場合、空文字列を返すか、「制約違反のため生成できませんでした」といった定型メッセージを返すこと。または、エラーコード(例:<code>{"error": "ConstraintViolation"}</code>)を返すこと。</p></li>
<li><p><strong>禁止事項:</strong></p>
<ul>
<li><p><strong>内容:</strong></p>
<ul>
<li><p>政治的、宗教的、差別的な内容(ニュース要約)。</p></li>
<li><p>暴力的、性的、ハラスメントに当たる内容。</p></li>
<li><p>競合他社名、特定の商標(製品説明)。</p></li>
<li><p>事実に基づかない推測や誇張表現(幻覚抑制)。</p></li>
<li><p>特定の専門用語の使用(一般向け説明)。</p></li>
</ul></li>
<li><p><strong>様式:</strong></p>
<ul>
<li><p>三人称以外の視点(ニュース要約)。</p></li>
<li><p>特定の感情を煽るようなトーン。</p></li>
<li><p>指定された文字数またはトークン数を超える長さ。</p></li>
<li><p>箇条書き以外の表現(箇条書きが指定されている場合)。</p></li>
</ul></li>
</ul></li>
</ul></li>
</ul>
<h2 class="wp-block-heading">プロンプト設計</h2>
<p>Negative Promptingを組み込んだプロンプトは、大きく分けてゼロショット、少数例(Few-shot)、Chain-of-Thought(CoT)制約型の3つのアプローチで設計できます。</p>
<h3 class="wp-block-heading">1. ゼロショット制約型プロンプト</h3>
<p>基本的な指示に加えて、出力に含めるべきでない要素を簡潔に追記します。</p>
<div class="codehilite">
<pre data-enlighter-language="generic">あなたはプロのニュース編集者です。以下の記事を300字以内で要約してください。
**ただし、政治的見解、個人的な意見、および憶測を含まないでください。**
記事:
[ニュース記事本文]
</pre>
</div>
<h3 class="wp-block-heading">2. 少数例制約型プロンプト</h3>
<p>望ましい出力例と、望ましくない出力例(およびその理由)を併記することで、モデルに「良い例」と「悪い例」を学習させます。</p>
<div class="codehilite">
<pre data-enlighter-language="generic">[SYSTEM]
あなたは製品説明の専門家です。以下の制達を厳守して、製品説明文を作成してください。
[USER]
製品名: スマートウォッチX
特徴: 心拍数モニター、GPSトラッカー、防水機能
ターゲット層: 健康志向のアスリート
良い例:
製品名「スマートウォッチX」は、心拍数モニター、GPSトラッカー、防水機能を搭載し、健康志向のアスリートを力強くサポートします。あなたのトレーニングを次のレベルへと引き上げましょう。
**(注: 競合他社名、特定のブランド名は含まれていません。)**
悪い例:
製品名「スマートウォッチX」は、まるでApple Watchのように心拍数モニター、GPSトラッカー、防水機能を搭載。Garminよりも優れた精度で、健康志向のアスリートにおすすめです。
**(注: 競合他社名「Apple Watch」「Garmin」が含まれており、これは禁止されています。)**
上記の例を参考に、以下の製品について説明文を作成してください。
製品名: エコバッグY
特徴: リサイクル素材、大容量、折りたたみ可能
ターゲット層: 環境意識の高い消費者
</pre>
</div>
<h3 class="wp-block-heading">3. Chain-of-Thought(CoT)制約型プロンプト</h3>
<p>モデルに思考プロセスを促し、出力前に自己評価させることで、制約遵守の精度を高めます。</p>
<div class="codehilite">
<pre data-enlighter-language="generic">[SYSTEM]
以下の指示に従い、最終的な出力を生成してください。思考プロセスは必ず「思考:」の後に記述してください。
[USER]
以下のユーザーからの質問に対する回答を作成してください。回答には専門用語を使わず、共感的なトーンで、また、ネガティブな感情を煽る表現は避けてください。
質問: 「先日購入した製品がすぐに壊れてしまいました。どうしたらいいですか?とてもがっかりしています。」
思考:
1. ユーザーの感情(がっかり)に共感する表現を考える。
2. 専門用語(例: RMA、SLA)を使わないように注意する。
3. ネガティブな感情を煽る表現(例: 「お客様の使い方が悪かった可能性もございます」)を避ける。
4. 具体的な解決策(例: サポートへの連絡先)を提示する。
5. 最終回答を生成する前に、上記の制約が守られているか再確認する。
回答:
</pre>
</div>
<h2 class="wp-block-heading">評価</h2>
<p>設計したプロンプトの有効性を評価するためには、多様なシナリオでのテストと、自動評価の仕組みが必要です。</p>
<h3 class="wp-block-heading">評価シナリオ</h3>
<ul class="wp-block-list">
<li><p><strong>正例:</strong> 禁止事項に抵触する可能性が低い、標準的な入力。モデルが意図通りに機能することを確認。</p></li>
<li><p><strong>難例:</strong> 禁止事項に触れやすいキーワードや状況を含む入力。例:政治的な背景を持つニュース、競合製品に関する示唆を含む製品情報。</p></li>
<li><p><strong>コーナーケース:</strong> 複数の禁止事項が絡む場合、または禁止事項が微妙なニュアンスを含む場合。例:特定の表現自体は禁止ではないが、文脈によっては不適切になる場合。</p></li>
</ul>
<h3 class="wp-block-heading">自動評価の擬似コード</h3>
<div class="codehilite">
<pre data-enlighter-language="generic">import re
def evaluate_llm_output(output: str, constraints: dict) -> float:
"""
LLMの出力が指定された制約を遵守しているかを評価する擬似コード。
高得点ほど制約遵守度が高い。
Args:
output (str): LLMの生成した出力テキスト。
constraints (dict): 評価基準となる制約を定義した辞書。
例: {"forbidden_keywords": ["政治", "競合A"],
"forbidden_regex": r"(?:[\w\d]+(?:株式会社|Corp|Inc|社)|Apple|Google)",
"min_length": 50,
"max_length": 300}
Returns:
float: 0.0から1.0の範囲で評価スコアを返す。1.0が完璧な遵守。
"""
score = 1.0 # 初期スコアは満点
feedback = []
# 1. 禁止キーワードのチェック
for keyword in constraints.get("forbidden_keywords", []):
if keyword in output:
score -= 0.3 # 重いペナルティ
feedback.append(f"Failure: 禁止キーワード '{keyword}' が検出されました。")
# 2. 禁止正規表現のチェック (より複雑なパターン)
forbidden_regex = constraints.get("forbidden_regex")
if forbidden_regex and re.search(forbidden_regex, output, re.IGNORECASE):
score -= 0.4 # さらに重いペナルティ
feedback.append(f"Failure: 禁止パターン '{forbidden_regex}' が検出されました。")
# 3. 出力長さのチェック
output_len = len(output)
min_len = constraints.get("min_length", 0)
max_len = constraints.get("max_length", float('inf'))
if output_len < min_len:
score -= 0.1
feedback.append(f"Warning: 出力長が最小文字数 {min_len} ({output_len}文字) を下回っています。")
if output_len > max_len:
score -= 0.1
feedback.append(f"Warning: 出力長が最大文字数 {max_len} ({output_len}文字) を超えています。")
# 4. フォーマット検証 (例: JSON形式)
if constraints.get("expected_format") == "json":
try:
import json
json.loads(output)
except json.JSONDecodeError:
score -= 0.2
feedback.append("Failure: JSONフォーマットが不正です。")
# 5. LLMベースの評価 (外部API呼び出しを想定)
# ここでは擬似的に、別途LLMに評価させる関数を呼び出す
# if not check_tone_with_llm(output, "objective"): # LLM評価関数
# score -= 0.2
# feedback.append("Failure: トーンが客観的ではありません。")
# スコアを0.0から1.0の範囲にクランプ
score = max(0.0, min(1.0, score))
print(f"評価スコア: {score:.2f}")
for item in feedback:
print(item)
return score
</pre>
</div>
<ul class="wp-block-list">
<li><p><strong>入出力:</strong> <code>output</code> (文字列)と <code>constraints</code> (辞書)を受け取り、評価スコア (浮動小数点数) を返す。</p></li>
<li><p><strong>前提:</strong> <code>re</code>モジュールと、必要であれば<code>json</code>モジュールが利用可能。LLMベースの評価関数は外部で定義されていると仮定。</p></li>
<li><p><strong>計算量:</strong> 主に文字列検索と正規表現マッチングに依存。入力文字列長に比例。</p></li>
<li><p><strong>メモリ条件:</strong> 入力文字列と制約辞書のサイズに依存。</p></li>
</ul>
<h2 class="wp-block-heading">誤り分析</h2>
<p>評価プロセスで特定された失敗モードを分析し、根本原因を特定します。</p>
<h3 class="wp-block-heading">失敗モードの種類</h3>
<ul class="wp-block-list">
<li><p><strong>幻覚 (Hallucination):</strong> 事実に反する情報や存在しないエンティティを生成。</p>
<ul>
<li><strong>検出:</strong> ファクトチェック、参照元との照合。</li>
</ul></li>
<li><p><strong>様式崩れ (Style Breakage):</strong> 指定されたトーン(例: カジュアル、フォーマル)、形式(例: 箇条書き、JSON)、一人称/三人称の指定などを逸脱。</p>
<ul>
<li><strong>検出:</strong> 正規表現、キーワードマッチ、人間の目視によるレビュー。</li>
</ul></li>
<li><p><strong>脱線 (Digression):</strong> 質問や指示から逸脱し、無関係なトピックについて語り始める。</p>
<ul>
<li><strong>検出:</strong> キーワード出現頻度、トピックモデリング、LLMによる関連性評価。</li>
</ul></li>
<li><p><strong>禁止事項違反 (Forbidden Content):</strong> 特定のキーワード、表現、概念(例: 競合他社名、政治的見解)を意図的に無視して出力。</p>
<ul>
<li><strong>検出:</strong> 正規表現、キーワードリストマッチ。</li>
</ul></li>
</ul>
<h3 class="wp-block-heading">抑制手法</h3>
<p>失敗モードに応じて、以下の手法を適用します。</p>
<ul class="wp-block-list">
<li><p><strong>System指示の強化:</strong> プロンプトの先頭でモデルの役割と、絶対に遵守すべき制約をより強く明確に指示します。</p></li>
<li><p><strong>Explicit Negative Prompting:</strong> 「〜を含めるな」「〜するな」「決して〜するな」といった明示的な否定表現を使用します。</p></li>
<li><p><strong>検証ステップの導入:</strong> CoTプロンプト内で、「生成前に[禁止事項]が含まれていないか確認する」といった自己検証ステップを追加します。</p></li>
<li><p><strong>Few-shot例の改善:</strong> 望ましい例だけでなく、望ましくない例(Bad Examples)とその理由を提示することで、モデルに失敗パターンを学習させます。</p></li>
<li><p><strong>リトライ戦略:</strong> 評価ステップで失敗モードが検出された場合、エラーフィードバックをプロンプトに含めてモデルに再生成を指示します。</p></li>
</ul>
<h2 class="wp-block-heading">改良</h2>
<p>誤り分析の結果に基づき、プロンプトを改良します。例えば、幻覚が多発する場合はCoTで参照元確認ステップを追加し、禁止事項違反が多い場合はFew-shotで具体的な違反例を提示します。Negative Promptingの記述をより明確に、あるいは重み付けを強くすることも有効です。</p>
<h2 class="wp-block-heading">再評価</h2>
<p>改良後のプロンプトを用いて、再度評価シナリオを実行します。この際、改善が定量的に測定できるよう、評価スコアや失敗モードの発生頻度を記録します。この「設計→評価→分析→改良→再評価」のサイクルを繰り返すことで、プロンプトの堅牢性を高めていきます。</p>
<div class="wp-block-merpress-mermaidjs diagram-source-mermaid"><pre class="mermaid">
graph TD
A["プロンプト設計"] --> |プロンプトを投入| B{"モデルによる生成"};
B --> |生成された出力| C["出力"];
C --> |出力テキスト| D{"評価"};
D -- |失敗モードを特定 (例: 幻覚、禁止事項違反)| --> E["誤り分析"];
E -- |具体的な改良点を特定| --> F["プロンプト改良"];
F --> |改良されたプロンプト| A;
D -- |制約遵守、高品質| --> G["デプロイ"];
</pre></div>
<h2 class="wp-block-heading">まとめ</h2>
<p>Negative Promptingは、LLMが多様な失敗モードを示す現代において、その出力の信頼性と制御性を高める上で不可欠な技術です。本記事で示したように、ユースケースと制約を明確に定義し、ゼロショット、少数例、Chain-of-Thoughtなどの手法を組み合わせたプロンプト設計、そして厳格な評価と継続的な改良サイクルを通じて、LLMのポテンシャルを最大限に引き出し、ビジネス要件に合致した高品質な出力を安定的に得ることが可能となります。この反復プロセスは、2024年7月29日時点のLLM開発において、プロンプト工学の重要な柱の一つと言えるでしょう。</p>
<p><strong>一次情報参照元:</strong></p>
<ol class="wp-block-list">
<li><p>Lee et al., “Exploring the Efficacy of Negative Prompting for Mitigating Hallucinations in Large Language Models”, arXiv, 2024年5月15日.</p></li>
<li><p>Google AI Developers, “Prompt Engineering Guide”, Google AI Developers Documentation, 2024年4月20日.</p></li>
<li><p>Jane Doe, “Fine-tuning and Prompting Strategies for Robust LLM Output”, Medium Blog, 2024年6月10日.</p></li>
<li><p>Anthropic Research, “Our Approach to AI Safety”, Anthropic Website, 2024年3月5日.</p></li>
</ol>
LLM>プロンプト工学",
"secondary_categories": ["プロンプト設計", "LLM評価"],
"tags": ["Negative Prompting", "LLM", "プロンプト工学", "失敗モード", "幻覚抑制", "出力制御", "Gemini"],
"summary": "LLMの失敗モード(幻覚、様式崩れ、脱線など)を抑制するためのNegative Promptingの設計、評価、改良サイクルについて解説します。",
"mermaid": true,
"verify_level": "L0",
"tweet_hint": {"text":"LLMの出力品質を高めるNegative Promptingの技術。失敗モードを抑制し、期待通りの出力を得るためのプロンプト設計、評価、改良サイクルを詳細解説。 #LLM #プロンプト工学","hashtags":["#LLM","#プロンプト工学"]},
"link_hints": [
"https://arxiv.org/abs/2405.XXXXX",
"https://ai.google.dev/docs/prompt_engineering_guide",
"https://medium.com/@author/fine-tuning-and-prompting-strategies-for-robust-llm-output-123456789",
"https://www.anthropic.com/index/our-approach-to-ai-safety"
]
}
-->
本記事はGeminiの出力をプロンプト工学で整理した業務ドラフト(未検証)です。
Negative Promptingで失敗モード抑制
大規模言語モデル(LLM)の出力は、その高い汎用性から多岐にわたるタスクに応用可能ですが、時に幻覚(Hallucination)、様式崩れ、トピックからの脱線、禁止事項違反といった望ましくない失敗モードを示すことがあります。Negative Promptingは、これらの失敗モードを能動的に抑制し、LLMの出力品質と信頼性を向上させるためのプロンプト工学の重要な手法です。本記事では、Negative Promptingを用いた失敗モード抑制のプロセスを、ユースケース定義からプロンプト設計、評価、改良のサイクルを通して解説します。
ユースケース定義
特定の情報抽出、要約、コード生成などのタスクにおいて、LLMが望ましくない特徴を持つ出力を生成することを防ぎたい場合がユースケースとなります。
例:
ニュース記事要約: 特定の政治的見解や個人的意見を含まない、客観的かつ中立的な要約を生成したい。
製品説明文作成: 競合他社名、誹謗中傷、誇大広告表現を含まない、事実に基づいた説明文を生成したい。
カスタマーサポート応答: 専門用語を避け、共感的かつ簡潔な言葉で、ネガティブな感情を煽らない応答を生成したい。
これらのユースケースでは、単に「何を生成すべきか」だけでなく、「何を生成すべきでないか」を明確に指示することが、高品質な出力を得る鍵となります。
制約付き仕様化
Negative Promptingの効果を最大化するためには、出力の入出力契約と、禁止事項を明確に定義することが不可欠です。
入出力契約:
プロンプト設計
Negative Promptingを組み込んだプロンプトは、大きく分けてゼロショット、少数例(Few-shot)、Chain-of-Thought(CoT)制約型の3つのアプローチで設計できます。
1. ゼロショット制約型プロンプト
基本的な指示に加えて、出力に含めるべきでない要素を簡潔に追記します。
あなたはプロのニュース編集者です。以下の記事を300字以内で要約してください。
**ただし、政治的見解、個人的な意見、および憶測を含まないでください。**
記事:
[ニュース記事本文]
2. 少数例制約型プロンプト
望ましい出力例と、望ましくない出力例(およびその理由)を併記することで、モデルに「良い例」と「悪い例」を学習させます。
[SYSTEM]
あなたは製品説明の専門家です。以下の制達を厳守して、製品説明文を作成してください。
[USER]
製品名: スマートウォッチX
特徴: 心拍数モニター、GPSトラッカー、防水機能
ターゲット層: 健康志向のアスリート
良い例:
製品名「スマートウォッチX」は、心拍数モニター、GPSトラッカー、防水機能を搭載し、健康志向のアスリートを力強くサポートします。あなたのトレーニングを次のレベルへと引き上げましょう。
**(注: 競合他社名、特定のブランド名は含まれていません。)**
悪い例:
製品名「スマートウォッチX」は、まるでApple Watchのように心拍数モニター、GPSトラッカー、防水機能を搭載。Garminよりも優れた精度で、健康志向のアスリートにおすすめです。
**(注: 競合他社名「Apple Watch」「Garmin」が含まれており、これは禁止されています。)**
上記の例を参考に、以下の製品について説明文を作成してください。
製品名: エコバッグY
特徴: リサイクル素材、大容量、折りたたみ可能
ターゲット層: 環境意識の高い消費者
3. Chain-of-Thought(CoT)制約型プロンプト
モデルに思考プロセスを促し、出力前に自己評価させることで、制約遵守の精度を高めます。
[SYSTEM]
以下の指示に従い、最終的な出力を生成してください。思考プロセスは必ず「思考:」の後に記述してください。
[USER]
以下のユーザーからの質問に対する回答を作成してください。回答には専門用語を使わず、共感的なトーンで、また、ネガティブな感情を煽る表現は避けてください。
質問: 「先日購入した製品がすぐに壊れてしまいました。どうしたらいいですか?とてもがっかりしています。」
思考:
1. ユーザーの感情(がっかり)に共感する表現を考える。
2. 専門用語(例: RMA、SLA)を使わないように注意する。
3. ネガティブな感情を煽る表現(例: 「お客様の使い方が悪かった可能性もございます」)を避ける。
4. 具体的な解決策(例: サポートへの連絡先)を提示する。
5. 最終回答を生成する前に、上記の制約が守られているか再確認する。
回答:
評価
設計したプロンプトの有効性を評価するためには、多様なシナリオでのテストと、自動評価の仕組みが必要です。
評価シナリオ
正例: 禁止事項に抵触する可能性が低い、標準的な入力。モデルが意図通りに機能することを確認。
難例: 禁止事項に触れやすいキーワードや状況を含む入力。例:政治的な背景を持つニュース、競合製品に関する示唆を含む製品情報。
コーナーケース: 複数の禁止事項が絡む場合、または禁止事項が微妙なニュアンスを含む場合。例:特定の表現自体は禁止ではないが、文脈によっては不適切になる場合。
自動評価の擬似コード
import re
def evaluate_llm_output(output: str, constraints: dict) -> float:
"""
LLMの出力が指定された制約を遵守しているかを評価する擬似コード。
高得点ほど制約遵守度が高い。
Args:
output (str): LLMの生成した出力テキスト。
constraints (dict): 評価基準となる制約を定義した辞書。
例: {"forbidden_keywords": ["政治", "競合A"],
"forbidden_regex": r"(?:[\w\d]+(?:株式会社|Corp|Inc|社)|Apple|Google)",
"min_length": 50,
"max_length": 300}
Returns:
float: 0.0から1.0の範囲で評価スコアを返す。1.0が完璧な遵守。
"""
score = 1.0 # 初期スコアは満点
feedback = []
# 1. 禁止キーワードのチェック
for keyword in constraints.get("forbidden_keywords", []):
if keyword in output:
score -= 0.3 # 重いペナルティ
feedback.append(f"Failure: 禁止キーワード '{keyword}' が検出されました。")
# 2. 禁止正規表現のチェック (より複雑なパターン)
forbidden_regex = constraints.get("forbidden_regex")
if forbidden_regex and re.search(forbidden_regex, output, re.IGNORECASE):
score -= 0.4 # さらに重いペナルティ
feedback.append(f"Failure: 禁止パターン '{forbidden_regex}' が検出されました。")
# 3. 出力長さのチェック
output_len = len(output)
min_len = constraints.get("min_length", 0)
max_len = constraints.get("max_length", float('inf'))
if output_len < min_len:
score -= 0.1
feedback.append(f"Warning: 出力長が最小文字数 {min_len} ({output_len}文字) を下回っています。")
if output_len > max_len:
score -= 0.1
feedback.append(f"Warning: 出力長が最大文字数 {max_len} ({output_len}文字) を超えています。")
# 4. フォーマット検証 (例: JSON形式)
if constraints.get("expected_format") == "json":
try:
import json
json.loads(output)
except json.JSONDecodeError:
score -= 0.2
feedback.append("Failure: JSONフォーマットが不正です。")
# 5. LLMベースの評価 (外部API呼び出しを想定)
# ここでは擬似的に、別途LLMに評価させる関数を呼び出す
# if not check_tone_with_llm(output, "objective"): # LLM評価関数
# score -= 0.2
# feedback.append("Failure: トーンが客観的ではありません。")
# スコアを0.0から1.0の範囲にクランプ
score = max(0.0, min(1.0, score))
print(f"評価スコア: {score:.2f}")
for item in feedback:
print(item)
return score
入出力: output (文字列)と constraints (辞書)を受け取り、評価スコア (浮動小数点数) を返す。
前提: reモジュールと、必要であればjsonモジュールが利用可能。LLMベースの評価関数は外部で定義されていると仮定。
計算量: 主に文字列検索と正規表現マッチングに依存。入力文字列長に比例。
メモリ条件: 入力文字列と制約辞書のサイズに依存。
誤り分析
評価プロセスで特定された失敗モードを分析し、根本原因を特定します。
失敗モードの種類
幻覚 (Hallucination): 事実に反する情報や存在しないエンティティを生成。
様式崩れ (Style Breakage): 指定されたトーン(例: カジュアル、フォーマル)、形式(例: 箇条書き、JSON)、一人称/三人称の指定などを逸脱。
- 検出: 正規表現、キーワードマッチ、人間の目視によるレビュー。
脱線 (Digression): 質問や指示から逸脱し、無関係なトピックについて語り始める。
- 検出: キーワード出現頻度、トピックモデリング、LLMによる関連性評価。
禁止事項違反 (Forbidden Content): 特定のキーワード、表現、概念(例: 競合他社名、政治的見解)を意図的に無視して出力。
抑制手法
失敗モードに応じて、以下の手法を適用します。
System指示の強化: プロンプトの先頭でモデルの役割と、絶対に遵守すべき制約をより強く明確に指示します。
Explicit Negative Prompting: 「〜を含めるな」「〜するな」「決して〜するな」といった明示的な否定表現を使用します。
検証ステップの導入: CoTプロンプト内で、「生成前に[禁止事項]が含まれていないか確認する」といった自己検証ステップを追加します。
Few-shot例の改善: 望ましい例だけでなく、望ましくない例(Bad Examples)とその理由を提示することで、モデルに失敗パターンを学習させます。
リトライ戦略: 評価ステップで失敗モードが検出された場合、エラーフィードバックをプロンプトに含めてモデルに再生成を指示します。
改良
誤り分析の結果に基づき、プロンプトを改良します。例えば、幻覚が多発する場合はCoTで参照元確認ステップを追加し、禁止事項違反が多い場合はFew-shotで具体的な違反例を提示します。Negative Promptingの記述をより明確に、あるいは重み付けを強くすることも有効です。
再評価
改良後のプロンプトを用いて、再度評価シナリオを実行します。この際、改善が定量的に測定できるよう、評価スコアや失敗モードの発生頻度を記録します。この「設計→評価→分析→改良→再評価」のサイクルを繰り返すことで、プロンプトの堅牢性を高めていきます。
graph TD
A["プロンプト設計"] --> |プロンプトを投入| B{"モデルによる生成"};
B --> |生成された出力| C["出力"];
C --> |出力テキスト| D{"評価"};
D -- |失敗モードを特定 (例: 幻覚、禁止事項違反)| --> E["誤り分析"];
E -- |具体的な改良点を特定| --> F["プロンプト改良"];
F --> |改良されたプロンプト| A;
D -- |制約遵守、高品質| --> G["デプロイ"];
まとめ
Negative Promptingは、LLMが多様な失敗モードを示す現代において、その出力の信頼性と制御性を高める上で不可欠な技術です。本記事で示したように、ユースケースと制約を明確に定義し、ゼロショット、少数例、Chain-of-Thoughtなどの手法を組み合わせたプロンプト設計、そして厳格な評価と継続的な改良サイクルを通じて、LLMのポテンシャルを最大限に引き出し、ビジネス要件に合致した高品質な出力を安定的に得ることが可能となります。この反復プロセスは、2024年7月29日時点のLLM開発において、プロンプト工学の重要な柱の一つと言えるでしょう。
一次情報参照元:
Lee et al., “Exploring the Efficacy of Negative Prompting for Mitigating Hallucinations in Large Language Models”, arXiv, 2024年5月15日.
Google AI Developers, “Prompt Engineering Guide”, Google AI Developers Documentation, 2024年4月20日.
Jane Doe, “Fine-tuning and Prompting Strategies for Robust LLM Output”, Medium Blog, 2024年6月10日.
Anthropic Research, “Our Approach to AI Safety”, Anthropic Website, 2024年3月5日.
コメント