| name | santa-method |
| description | Multi-agent adversarial verification with convergence loop. Two independent review agents must both pass before output ships. |
| origin | Ronald Skelton - Founder, RapportScore.ai |
Santa Method
ãã«ããšãŒãžã§ã³ãæµå¯Ÿçæ€èšŒãã¬ãŒã ã¯ãŒã¯ããªã¹ããäœãã2åãã§ãã¯ãããåé¡ãããã°ãè¯ããªããŸã§ä¿®æ£ããã
æ žå¿çãªæŽå¯: åäžã®ãšãŒãžã§ã³ããèªèº«ã®åºåãã¬ãã¥ãŒãããšããã®åºåãçæããã®ãšåããã€ã¢ã¹ãç¥èã®ã®ã£ãããäœç³»çãªãšã©ãŒãå
±æããŸããå
±æã³ã³ããã¹ããæããªã2人ã®ç¬ç«ããã¬ãã¥ã¢ãŒãããã®é害ã¢ãŒããæç ŽããŸãã
èµ·åæ¡ä»¶
以äžã®å Žåã«ãã®ã¹ãã«ãåŒã³åºããŸã:
- åºåãå
¬éããããã€ããŸãã¯ãšã³ããŠãŒã¶ãŒã«å©çšãããå Žå
- ã³ã³ãã©ã€ã¢ã³ã¹ãèŠå¶ããŸãã¯ãã©ã³ãã®å¶çŽãé©çšããå¿
èŠãããå Žå
- 人éã®ã¬ãã¥ãŒãªãã«ã³ãŒããæ¬çªç°å¢ã«ãããã€ãããå Žå
- ã³ã³ãã³ãã®æ£ç¢ºæ§ãéèŠãªå ŽåïŒæè¡ããã¥ã¡ã³ããæè²è³æã顧客åãã³ããŒïŒ
- ã¹ããããã§ãã¯ã§ã¯äœç³»çãªãã¿ãŒã³ãèŠéããããªå€§èŠæš¡ãããçæã®å Žå
- ãã«ã·ããŒã·ã§ã³ã®ãªã¹ã¯ãé«ãå ŽåïŒäž»åŒµãçµ±èšãAPI ãªãã¡ã¬ã³ã¹ãæ³çæèšïŒ
å
éšãã©ãããæ¢çŽ¢çãªãµãŒãããŸãã¯æ±ºå®çãªæ€èšŒãå¯èœãªã¿ã¹ã¯ïŒãããã«ã¯ãã«ã/ãã¹ã/lint ãã€ãã©ã€ã³ã䜿çšïŒã«ã¯äœ¿çšããªãã§ãã ããã
ã¢ãŒããã¯ãã£
âââââââââââââââ
â GENERATOR â Phase 1: Make a List
â (Agent A) â ææç©ãçæ
ââââââââ¬ââââââââ
â output
âŒ
ââââââââââââââââââââââââââââââââ
â DUAL INDEPENDENT REVIEW â Phase 2: Check It Twice
â â
â âââââââââââââ âââââââââââââ â 2ã€ã®ãšãŒãžã§ã³ããåäžã«ãŒããªãã¯ã
â â Reviewer B â â Reviewer C â â å
±æã³ã³ããã¹ããªã
â âââââââ¬ââââââ âââââââ¬ââââââ â
â â â â
ââââââââââŒâââââââââââââââŒâââââââââ
â â
⌠âŒ
ââââââââââââââââââââââââââââââââ
â VERDICT GATE â Phase 3: Naughty or Nice
â â
â B passes AND C passes â NICE â äž¡æ¹ããã¹ããå¿
èŠããã
â Otherwise â NAUGHTY â äŸå€ãªãã
ââââââââ¬âââââââââââââââ¬ââââââââââ
â â
NICE NAUGHTY
â â
⌠âŒ
[ SHIP ] âââââââââââââââ
â FIX CYCLE â Phase 4: Fix Until Nice
â â
â iteration++ â å
šãã©ã°ãåéã
â if i > MAX: â å
šåé¡ãä¿®æ£ã
â escalate â äž¡ã¬ãã¥ã¢ãŒãåå®è¡ã
â else: â åæãããŸã§ã«ãŒãã
â goto Ph.2 â
ââââââââââââââââ
ãã§ãŒãºè©³çް
ãã§ãŒãº 1: Make a ListïŒçæïŒ
äž»èŠã¿ã¹ã¯ãå®è¡ããŸããéåžžã®çæã¯ãŒã¯ãããŒã«å€æŽã¯ãããŸãããSanta Method ã¯çææŠç¥ã§ã¯ãªããçæåŸã®æ€èšŒã¬ã€ã€ãŒã§ãã
output = generate(task_spec)
ãã§ãŒãº 2: Check It TwiceïŒç¬ç«ãã¥ã¢ã«ã¬ãã¥ãŒïŒ
2ã€ã®ã¬ãã¥ãŒãšãŒãžã§ã³ãã䞊åã«ã¹ããŒã³ããŸããéèŠãªäžå€æ¡ä»¶:
- ã³ã³ããã¹ãåé¢ â ã©ã¡ãã®ã¬ãã¥ã¢ãŒãçžæã®è©äŸ¡ãèŠãªã
- åäžã«ãŒããªã㯠â äž¡æ¹ãåãè©äŸ¡åºæºãåãåã
- åäžå
¥å â äž¡æ¹ãå
ã®ä»æ§æžãšçæãããåºåãåãåã
- æ§é ååºå â åã¬ãã¥ã¢ãŒã¯æ£æã§ã¯ãªãåä»ãã®å€å®ãè¿ã
REVIEWER_PROMPT = """
You are an independent quality reviewer. You have NOT seen any other review of this output.
## Task Specification
{task_spec}
## Output Under Review
{output}
## Evaluation Rubric
{rubric}
## Instructions
Evaluate the output against EACH rubric criterion. For each:
- PASS: criterion fully met, no issues
- FAIL: specific issue found (cite the exact problem)
Return your assessment as structured JSON:
{
"verdict": "PASS" | "FAIL",
"checks": [
{"criterion": "...", "result": "PASS|FAIL", "detail": "..."}
],
"critical_issues": ["..."], // blockers that must be fixed
"suggestions": ["..."] // non-blocking improvements
}
Be rigorous. Your job is to find problems, not to approve.
"""
review_b = Agent(prompt=REVIEWER_PROMPT.format(...), description="Santa Reviewer B")
review_c = Agent(prompt=REVIEWER_PROMPT.format(...), description="Santa Reviewer C")
ã«ãŒããªãã¯èšèš
ã«ãŒããªãã¯ã¯æãéèŠãªå
¥åã§ããææ§ãªã«ãŒããªãã¯ã¯ææ§ãªã¬ãã¥ãŒãçã¿ãŸãããã¹ãŠã®åºæºã«ã¯å®¢èгçãªåæ Œ/äžåæ Œæ¡ä»¶ãå¿
èŠã§ãã
| åºæº | åæ Œæ¡ä»¶ | äžåæ Œã·ã°ãã« |
|---|
| äºå®ã®æ£ç¢ºæ§ | ãã¹ãŠã®äž»åŒµããœãŒã¹è³æãŸãã¯åžžèã§æ€èšŒå¯èœ | æé ãããçµ±èšãééã£ãããŒãžã§ã³çªå·ãååšããªã API |
| ãã«ã·ããŒã·ã§ã³ãªã | æé ããããšã³ãã£ãã£ãåŒçšãURLãåç
§ããªã | ååšããªãããŒãžãžã®ãªã³ã¯ãåºå
žã®ãªãåŒçš |
| å®å
šæ§ | 仿§ã®ãã¹ãŠã®èŠä»¶ã察å¿ãããŠãã | æ¬ èœã»ã¯ã·ã§ã³ãã¹ãããããããšããžã±ãŒã¹ãäžå®å
šãªã«ãã¬ããž |
| ã³ã³ãã©ã€ã¢ã³ã¹ | ãã¹ãŠã®ãããžã§ã¯ãåºæã®å¶çŽããã¹ | çŠæ¢çšèªã®äœ¿çšãããŒã³éåãèŠå¶éæºæ |
| å
éšäžè²«æ§ | åºåå
ã«ççŸããªã | ã»ã¯ã·ã§ã³ A ã X ãšèšããã»ã¯ã·ã§ã³ B ã X ã§ãªããšèšã |
| æè¡çæ£ç¢ºæ§ | ã³ãŒããã³ã³ãã€ã«/å®è¡ããããã¢ã«ãŽãªãºã ãå¥å
š | æ§æãšã©ãŒãããžãã¯ãã°ãééã£ãèšç®éã®äž»åŒµ |
ãã¡ã€ã³åºæã®ã«ãŒããªãã¯æ¡åŒµ
ã³ã³ãã³ã/ããŒã±ãã£ã³ã°:
- ãã©ã³ããã€ã¹ãžã®æºæ
- SEO èŠä»¶ã®å
è¶³ïŒããŒã¯ãŒãå¯åºŠãã¡ã¿ã¿ã°ãæ§é ïŒ
- ç«¶åä»ç€Ÿã®åæšã®èª€çšãªã
- CTA ãååšãæ£ãããªã³ã¯ãããŠãã
ã³ãŒã:
- åå®å
šæ§ïŒ
any ã®ãªãŒã¯ãªããé©å㪠null ãã³ããªã³ã°ïŒ
- ãšã©ãŒãã³ããªã³ã°ã®ã«ãã¬ããž
- ã»ãã¥ãªãã£ïŒã³ãŒãå
ã«ã·ãŒã¯ã¬ãããªããå
¥åããªããŒã·ã§ã³ãã€ã³ãžã§ã¯ã·ã§ã³é²æ¢ïŒ
- æ°ãããã¹ã®ãã¹ãã«ãã¬ããž
ã³ã³ãã©ã€ã¢ã³ã¹ãæ±ããããå ŽåïŒèŠå¶ãæ³åãéèïŒ:
- çµæã®ä¿èšŒãæ ¹æ ã®ãªã䞻匵ããªã
- å¿
èŠãªå
責äºé
ãååšãã
- æ¿èªãããçšèªã®ã¿äœ¿çš
- 管èœåºåã«é©ããèšèª
ãã§ãŒãº 3: Naughty or NiceïŒå€å®ã²ãŒãïŒ
def santa_verdict(review_b, review_c):
"""äž¡æ¹ã®ã¬ãã¥ã¢ãŒããã¹ããå¿
èŠãããéšåçãªåæ Œãªãã"""
if review_b.verdict == "PASS" and review_c.verdict == "PASS":
return "NICE"
all_issues = dedupe(review_b.critical_issues + review_c.critical_issues)
all_suggestions = dedupe(review_b.suggestions + review_c.suggestions)
return "NAUGHTY", all_issues, all_suggestions
ãªãäž¡æ¹ããã¹ããå¿
èŠãããã®ã: 1人ã®ã¬ãã¥ã¢ãŒã ããåé¡ãçºèŠããå Žåããã®åé¡ã¯å®åšããŸãããã1人ã®ã¬ãã¥ã¢ãŒã®æ»è§ããããSanta Method ãæé€ããããã«ååšããé害ã¢ãŒããã®ãã®ã§ãã
ãã§ãŒãº 4: Fix Until NiceïŒåæã«ãŒãïŒ
MAX_ITERATIONS = 3
for iteration in range(MAX_ITERATIONS):
verdict, issues, suggestions = santa_verdict(review_b, review_c)
if verdict == "NICE":
log_santa_result(output, iteration, "passed")
return ship(output)
output = fix_agent.execute(
output=output,
issues=issues,
instruction="Fix ONLY the flagged issues. Do not refactor or add unrequested changes."
)
review_b = Agent(prompt=REVIEWER_PROMPT.format(output=output, ...))
review_c = Agent(prompt=REVIEWER_PROMPT.format(output=output, ...))
log_santa_result(output, MAX_ITERATIONS, "escalated")
escalate_to_human(output, issues)
éèŠ: åã¬ãã¥ãŒã©ãŠã³ãã¯æ°ãããšãŒãžã§ã³ãã䜿çšããŸããã¬ãã¥ã¢ãŒã¯åã®ã©ãŠã³ãã®èšæ¶ãæã£ãŠã¯ãããŸããã以åã®ã³ã³ããã¹ããã¢ã³ã«ãªã³ã°ãã€ã¢ã¹ãçã¿åºãããã§ãã
å®è£
ãã¿ãŒã³
ãã¿ãŒã³ A: Claude Code ãµããšãŒãžã§ã³ãïŒæšå¥šïŒ
ãµããšãŒãžã§ã³ãã¯çã®ã³ã³ããã¹ãåé¢ãæäŸããŸããåã¬ãã¥ã¢ãŒã¯å
±æç¶æ
ãæããªãå¥ããã»ã¹ã§ãã
reviewer_b = Agent(
description="Santa Review B",
prompt=f"Review this output for quality...\n\nRUBRIC:\n{rubric}\n\nOUTPUT:\n{output}"
)
reviewer_c = Agent(
description="Santa Review C",
prompt=f"Review this output for quality...\n\nRUBRIC:\n{rubric}\n\nOUTPUT:\n{output}"
)
ãã¿ãŒã³ B: ã·ãŒã±ã³ã·ã£ã«ã€ã³ã©ã€ã³ïŒãã©ãŒã«ããã¯ïŒ
ãµããšãŒãžã§ã³ããå©çšã§ããªãå Žåãæç€ºçãªã³ã³ããã¹ããªã»ããã§åé¢ãã·ãã¥ã¬ãŒãããŸã:
- åºåãçæ
- æ°ããã³ã³ããã¹ã: ãããªã㯠Reviewer 1 ã§ãããã®ã«ãŒããªãã¯ã«å¯ŸããŠã®ã¿è©äŸ¡ããŠãã ãããåé¡ãèŠã€ããŠãã ãããã
- çµæããã®ãŸãŸèšé²
- ã³ã³ããã¹ããå®å
šã«ã¯ãªã¢
- æ°ããã³ã³ããã¹ã: ãããªã㯠Reviewer 2 ã§ãããã®ã«ãŒããªãã¯ã«å¯ŸããŠã®ã¿è©äŸ¡ããŠãã ãããåé¡ãèŠã€ããŠãã ãããã
- äž¡æ¹ã®ã¬ãã¥ãŒãæ¯èŒããä¿®æ£ããç¹°ãè¿ã
ãµããšãŒãžã§ã³ããã¿ãŒã³ã®æ¹ãå³å¯ã«åªããŠããŸã â ã€ã³ã©ã€ã³ã·ãã¥ã¬ãŒã·ã§ã³ã¯ã¬ãã¥ã¢ãŒéã®ã³ã³ããã¹ãæ±æã®ãªã¹ã¯ããããŸãã
ãã¿ãŒã³ C: ããããµã³ããªã³ã°
å€§èŠæš¡ãããïŒ100+ ã¢ã€ãã ïŒã®å Žåããã¹ãŠã®ã¢ã€ãã ã«å®å
šãª Santa ãå®è¡ããã®ã¯ã³ã¹ãçã«éçŸå®çã§ããå±€å¥ãµã³ããªã³ã°ã䜿çšããŸã:
- ã©ã³ãã ãµã³ãã«ïŒãããã®10-15%ãæå°5ã¢ã€ãã ïŒã«å¯Ÿã㊠Santa ãå®è¡
- é害ãã¿ã€ãå¥ã«åé¡ïŒãã«ã·ããŒã·ã§ã³ãã³ã³ãã©ã€ã¢ã³ã¹ãå®å
šæ§ãªã©ïŒ
- äœç³»çãªãã¿ãŒã³ãèŠã€ãã£ãå Žåããããå
šäœã«ã¿ãŒã²ãããçµã£ãä¿®æ£ãé©çš
- ä¿®æ£ãããããããåãµã³ããªã³ã°ããŠåæ€èšŒ
- ã¯ãªãŒã³ãªãµã³ãã«ããã¹ãããŸã§ç¶ç¶
import random
def santa_batch(items, rubric, sample_rate=0.15):
sample = random.sample(items, max(5, int(len(items) * sample_rate)))
for item in sample:
result = santa_full(item, rubric)
if result.verdict == "NAUGHTY":
pattern = classify_failure(result.issues)
items = batch_fix(items, pattern)
return santa_batch(items, rubric)
return items
é害ã¢ãŒããšç·©åç
| é害ã¢ãŒã | çç¶ | ç·©åç |
|---|
| ç¡éã«ãŒã | ã¬ãã¥ã¢ãŒãä¿®æ£åŸãæ°ããåé¡ãèŠã€ãç¶ãã | æå€§ã€ãã¬ãŒã·ã§ã³äžéïŒ3ïŒããšã¹ã«ã¬ãŒã·ã§ã³ã |
| ã©ããŒã¹ã¿ã³ã | äž¡æ¹ã®ã¬ãã¥ã¢ãŒããã¹ãŠãåæ Œããã | æµå¯Ÿçããã³ãã: ãããªãã®ä»äºã¯åé¡ãèŠã€ããããšã§ãããæ¿èªããããšã§ã¯ãªããã |
| 䞻芳çããªãã | ã¬ãã¥ã¢ãŒããšã©ãŒã§ã¯ãªãã¹ã¿ã€ã«ã®å¥œã¿ã«ãã©ã°ãç«ãŠã | 客芳çãªåæ Œ/äžåæ Œåºæºã®ã¿ã®å³å¯ãªã«ãŒããªã㯠|
| ä¿®æ£ã«ããéè¡ | åé¡ A ã®ä¿®æ£ãåé¡ B ãåŒãèµ·ãã | åã©ãŠã³ãã®æ°ããã¬ãã¥ã¢ãŒãéè¡ãæ€åº |
| ã¬ãã¥ã¢ãŒã®äžèŽãã€ã¢ã¹ | äž¡æ¹ã®ã¬ãã¥ã¢ãŒãåããã®ãèŠéã | ç¬ç«æ§ã«ããç·©åãããããæé€ãããªããéèŠãªåºåã®å Žåã3人ç®ã®ã¬ãã¥ã¢ãŒãŸãã¯äººéã®ã¹ããããã§ãã¯ã远å ã |
| ã³ã¹ãççº | 倧ããªåºåã«å¯Ÿããéå€ãªã€ãã¬ãŒã·ã§ã³ | ããããµã³ããªã³ã°ãã¿ãŒã³ãæ€èšŒãµã€ã¯ã«ããšã®äºç®äžéã |
ä»ã®ã¹ãã«ãšã®çµ±å
| ã¹ãã« | é¢ä¿ |
|---|
| Verification Loop | 決å®çãã§ãã¯ïŒãã«ããlintããã¹ãïŒã«äœ¿çšãSanta ã¯ã»ãã³ãã£ãã¯ãã§ãã¯ïŒæ£ç¢ºæ§ããã«ã·ããŒã·ã§ã³ïŒã«äœ¿çšãverification-loop ãæåã«å®è¡ããSanta ã2çªç®ã«å®è¡ã |
| Eval Harness | Santa Method ã®çµæã eval ã¡ããªã¯ã¹ã«ãã£ãŒãããããSanta å®è¡å
šäœã® pass@k ã远跡ãããžã§ãã¬ãŒã¿ãŒå質ãçµæçã«æž¬å®ã |
| Continuous Learning v2 | Santa ã®çºèŠãã€ã³ã¹ãã£ã³ã¯ãã«ãªããåãåºæºã§ã®ç¹°ãè¿ãã®å€±æ â ãã®ãã¿ãŒã³ãåé¿ããåŠç¿ãããæ¯ãèãã |
| Strategic Compact | ã³ã³ãã¯ãåã®åã« Santa ãå®è¡ãæ€èšŒäžã«ã¬ãã¥ãŒã³ã³ããã¹ãã倱ããªãã |
ã¡ããªã¯ã¹
Santa Method ã®å¹æã枬å®ããããã«ä»¥äžã远跡ããŸã:
- ååãã¹ç: ã©ãŠã³ã1ã§ Santa ããã¹ããåºåã®å²åïŒç®æš: >70%ïŒ
- å¹³ååæã€ãã¬ãŒã·ã§ã³æ°: NICE ãŸã§ã®å¹³åã©ãŠã³ãæ°ïŒç®æš: <1.5ïŒ
- åé¡åé¡: é害ã¿ã€ãã®ååžïŒãã«ã·ããŒã·ã§ã³ vs å®å
šæ§ vs ã³ã³ãã©ã€ã¢ã³ã¹ïŒ
- ã¬ãã¥ã¢ãŒäžèŽç: äž¡æ¹ã®ã¬ãã¥ã¢ãŒããã©ã°ãç«ãŠãåé¡ vs 1人ã ãããã©ã°ãç«ãŠãåé¡ã®å²åïŒäœãäžèŽç = ã«ãŒããªãã¯ã®å³æ Œåãå¿
èŠïŒ
- æŒæŽ©ç: åºè·åŸã«èŠã€ãã£ããSanta ãæ€åºãã¹ãã ã£ãåé¡ïŒç®æš: 0ïŒ
ã³ã¹ãåæ
Santa Method ã¯æ€èšŒãµã€ã¯ã«ããšã«çæã®ã¿ã®ããŒã¯ã³ã³ã¹ãã®çŽ2-3åããããŸããã»ãšãã©ã®é«ãªã¹ã¯åºåã«ãšã£ãŠãããã¯å®ãæè³ã§ã:
Santa ã®ã³ã¹ã = (çæããŒã¯ã³) + 2Ã(ã©ãŠã³ãããšã®ã¬ãã¥ãŒããŒã¯ã³) à (å¹³åã©ãŠã³ãæ°)
Santa ãªãã®ã³ã¹ã = (è©å€ã®ãã¡ãŒãž) + (ä¿®æ£å·¥æ°) + (ä¿¡é Œã®æ¯æ)
ãããæäœã®å Žåããµã³ããªã³ã°ãã¿ãŒã³ã«ããäœç³»çãªåé¡ã®90%以äžãæ€åºããªããã³ã¹ããå®å
šæ€èšŒã®çŽ15-20%ã«åæžããŸãã