llm-debugger について
llm-debuggerは、LLM出力の問題を診断・修正するスキルです。LLMアプリの開発者向けに、原因分析や修正案、回帰テストの作成を支援します。
主な機能
- 01出力障害の分類
- 02障害原因の分析
- 03プロンプト修正案の提示
- 04ツールスキーマ変更の提案
- 05回帰テストケースの生成
- 06対話式デバッグフロー
活用シーン
- 01無効なJSONや形式エラーの調査
- 02ハルシネーションや推論ミスの追跡
- 03明確なスキーマによるツール誤用の抑制
- 04失敗した出力からのテスト作成
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ patricio0312rev/ skills --skill llm-debuggerインストール後、Claude Code で/llm-debuggerを入力して読み込まれたか確認します。
詳細
LLM デバッガー
LLM の出力に関する問題を体系的に診断して修正します。
失敗の分類
class FailureType(Enum):
HALLUCINATION = "hallucination"
FORMAT_VIOLATION = "format_violation"
CONSTRAINT_BREAK = "constraint_break"
REASONING_ERROR = "reasoning_error"
TOOL_MISUSE = "tool_misuse"
REFUSAL = "unexpected_refusal"
INCOMPLETE = "incomplete_output"
根本原因の分析
def diagnose_failure(input: str, output: str, expected: dict) -> dict:
"""Identify why LLM output failed"""
issues = []
# Check format
if expected.get("format") == "json":
try:
json.loads(output)
except:
issues.append({
"type": FailureType.FORMAT_VIOLATION,
"details": "Invalid JSON output"
})
# Check required fields
if expected.get("required_fields"):
for field in expected["required_fields"]:
if field not in output:
issues.append({
"type": FailureType.INCOMPLETE,
"details": f"Missing required field: {field}"
})
# Check constraints
if expected.get("max_length"):
if len(output) > expected["max_length"]:
issues.append({
"type": FailureType.CONSTRAINT_BREAK,
"details": f"Output too long: {len(output)} > {expected['max_length']}"
})
# Check for hallucination indicators
if contains_hallucination_markers(output):
issues.append({
"type": FailureType.HALLUCINATION,
"details": "Contains fabricated information"
})
return {
"has_issues": len(issues) > 0,
"issues": issues,
"primary_issue": issues[0] if issues else None
}
def contains_hallucination_markers(output: str) -> bool:
"""Detect common hallucination patterns"""
markers = [
r'According to.*that doesn\'t exist',
r'In \d{4}.*before that year',
r'contradicts itself',
]
return any(re.search(marker, output, re.IGNORECASE) for marker in markers)
プロンプトの修正
PROMPT_FIXES = {
FailureType.FORMAT_VIOLATION: """
Add strict format instructions:
"Output MUST be valid JSON with this exact structure:
```json
{{"field1": "value", "field2": 123}}
JSON の前後にテキストを追加しないでください。」 """,
FailureType.HALLUCINATION: """
根拠を示す指示を追加します: 「回答は、提供されたコンテキストのみに基づいてください。 コンテキストに情報がない場合は、『その情報はありません』と答えてください。 事実や詳細を決して捏造しないでください。」 """,
FailureType.CONSTRAINT_BREAK: """
明示的な制約を追加します: 「回答は次の条件を満たす必要があります:
- 200 語以内
- コード例を含めない
- プロフェッショナルな口調のみ」 """, FailureType.REASONING_ERROR: """ 段階的な推論を追加します: 「次の手順で順を追って考えてください:
- まず、特定します……
- 次に、検討します……
- 最後に、結論を出します……」 """, }
def suggest_prompt_fix(diagnosis: dict, current_prompt: str) -> str: """診断に基づいて改善されたプロンプトを生成します""" primary_issue = diagnosis["primary_issue"] if not primary_issue: return current_prompt
fix = PROMPT_FIXES[primary_issue["type"]]
return f"""{current_prompt}
重要な指示: {fix} """
## Tool Improvements
```python
def suggest_tool_fixes(diagnosis: dict, tool_schema: dict) -> dict:
"""Improve tool schema to prevent misuse"""
fixes = {}
for issue in diagnosis["issues"]:
if issue["type"] == FailureType.TOOL_MISUSE:
# Make required parameters more explicit
fixes["parameters"] = {
**tool_schema["parameters"],
"description": "REQUIRED: " + tool_schema["parameters"].get("description", "")
}
# Add examples
fixes["examples"] = [
{
"params": {"query": "example search"},
"description": "Use for finding information"
}
]
return {**tool_schema, **fixes}
テストケースの生成
def generate_test_cases(diagnosis: dict, failed_input: str, failed_output: str) -> List[dict]:
"""Create regression test cases from failures"""
test_cases = []
# Test case for the specific failure
test_cases.append({
"input": failed_input,
"expected_behavior": "Should not " + diagnosis["primary_issue"]["details"],
"validation": lambda output: not has_same_issue(output, diagnosis),
})
# Edge cases based on failure type
if diagnosis["primary_issue"]["type"] == FailureType.FORMAT_VIOLATION:
test_cases.append({
"input": failed_input,
"validation": lambda output: is_valid_json(output),
"description": "Output must be valid JSON"
})
# Similar inputs that might trigger same issue
similar_inputs = generate_similar_inputs(failed_input)
for inp in similar_inputs:
test_cases.append({
"input": inp,
"validation": lambda output: not has_same_issue(output, diagnosis),
})
return test_cases
デバッグのワークフロー
def debug_llm_output(
prompt: str,
output: str,
expected: dict,
context: dict = {}
) -> dict:
"""Complete debugging workflow"""
# 1. Diagnose issue
diagnosis = diagnose_failure(prompt, output, expected)
if not diagnosis["has_issues"]:
return {"status": "ok", "diagnosis": diagnosis}
# 2. Generate fixes
fixed_prompt = suggest_prompt_fix(diagnosis, prompt)
# 3. Create test cases
test_cases = generate_test_cases(diagnosis, prompt, output)
# 4. Test fix
test_output = llm(fixed_prompt)
fix_works = diagnose_failure(fixed_prompt, test_output, expected)["has_issues"] == False
return {
"status": "issues_found",
"diagnosis": diagnosis,
"fixes": {
"prompt": fixed_prompt,
"fix_verified": fix_works,
},
"test_cases": test_cases,
"recommendations": generate_recommendations(diagnosis, context)
}
対話型デバッグ
def interactive_debug():
"""Interactive debugging session"""
print("LLM Debugger - Interactive Mode")
prompt = input("Enter prompt: ")
expected_output = input("Expected output format (json/text): ")
output = llm(prompt)
print(f"\nGenerated output:\n{output}\n")
if input("Does this look correct? (y/n): ").lower() == 'n':
diagnosis = diagnose_failure(prompt, output, {"format": expected_output})
print("\nDiagnosis:")
for issue in diagnosis["issues"]:
print(f"- {issue['type'].value}: {issue['details']}")
print("\nSuggested fix:")
print(suggest_prompt_fix(diagnosis, prompt))
ベストプラクティス
- 一貫して再現する:複数回実行します
- 変数を分離する:プロンプトの変更は一度に1つずつテストします
- 例を確認する:少数例の例示は明確ですか?
- 制約を検証する:十分に明示されていますか?
- エッジケースをテストする:境界条件を確認します
- すべてを記録する:入力、出力、問題を記録します
- 体系的に反復する:どの修正が有効かを追跡します
出力チェックリスト
- 失敗の分類を定義
- 根本原因アナライザー
- プロンプト修正の提案
- ツールスキーマの改善
- テストケースジェネレーター
- 修正の検証
- デバッグのワークフロー
- 推奨事項エンジン
- 対話型デバッガー
- ロギングシステム
コメント
Markdown 対応