mcpField
A
agentic-eval

agentic-eval

github.com/githubエージェントワークフロー40.5k10.2k 回インストール今日更新
リポジトリ

agentic-eval について

エージェントが生成結果を評価し、反復的に改善するためのパターン集です。自己評価、評価器と生成器の分離、コードとテストのループ、ルーブリック評価を扱います。

主な機能

  1. 01自己批評と改善のループ
  2. 02評価器と生成器の役割分離
  3. 03テスト駆動のコード改善
  4. 04結果・比較・ルーブリック評価
  5. 05反復上限と収束チェック

活用シーン

  1. 01正確性が重要なレポートの改善
  2. 02スタイル基準に沿った出力確認
  3. 03テストを用いた生成コードの反復改善

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/github/awesome-copilot --skill agentic-eval

インストール後、Claude Code で/agentic-evalを入力して読み込まれたか確認します。

詳細

エージェント的評価パターン

反復的な評価と洗練による自己改善のためのパターンです。

概要

評価パターンは、エージェントが自身の出力を評価し改善することを可能にし、単発の生成から反復的な洗練ループへと移行します。

Generate → Evaluate → Critique → Refine → Output
    ↑                              │
    └──────────────────────────────┘

使用すべき場面

  • 品質が重要な生成: 高い精度が求められるコード、レポート、分析
  • 明確な評価基準があるタスク: 定義された成功指標が存在する
  • 特定の基準が求められるコンテンツ: スタイルガイド、コンプライアンス、フォーマット

パターン 1: 基本的なリフレクション

エージェントが自己批判を通じて自身の出力を評価し改善します。

def reflect_and_refine(task: str, criteria: list[str], max_iterations: int = 3) -> str:
    """Generate with reflection loop."""
    output = llm(f"Complete this task:\n{task}")
    
    for i in range(max_iterations):
        # Self-critique
        critique = llm(f"""
        Evaluate this output against criteria: {criteria}
        Output: {output}
        Rate each: PASS/FAIL with feedback as JSON.
        """)
        
        critique_data = json.loads(critique)
        all_pass = all(c["status"] == "PASS" for c in critique_data.values())
        if all_pass:
            return output
        
        # Refine based on critique
        failed = {k: v["feedback"] for k, v in critique_data.items() if v["status"] == "FAIL"}
        output = llm(f"Improve to address: {failed}\nOriginal: {output}")
    
    return output

重要なポイント: 批判結果を確実に解析するために、構造化された JSON 出力を使用します。


パターン 2: 評価者と最適化者

生成と評価を明確に分離されたコンポーネントに分割し、責務をより明確にします。

class EvaluatorOptimizer:
    def __init__(self, score_threshold: float = 0.8):
        self.score_threshold = score_threshold
    
    def generate(self, task: str) -> str:
        return llm(f"Complete: {task}")
    
    def evaluate(self, output: str, task: str) -> dict:
        return json.loads(llm(f"""
        Evaluate output for task: {task}
        Output: {output}
        Return JSON: {{"overall_score": 0-1, "dimensions": {{"accuracy": ..., "clarity": ...}}}}
        """))
    
    def optimize(self, output: str, feedback: dict) -> str:
        return llm(f"Improve based on feedback: {feedback}\nOutput: {output}")
    
    def run(self, task: str, max_iterations: int = 3) -> str:
        output = self.generate(task)
        for _ in range(max_iterations):
            evaluation = self.evaluate(output, task)
            if evaluation["overall_score"] >= self.score_threshold:
                break
            output = self.optimize(output, evaluation)
        return output

パターン 3: コード固有のリフレクション

コード生成のためのテスト駆動型の洗練ループです。

class CodeReflector:
    def reflect_and_fix(self, spec: str, max_iterations: int = 3) -> str:
        code = llm(f"Write Python code for: {spec}")
        tests = llm(f"Generate pytest tests for: {spec}\nCode: {code}")
        
        for _ in range(max_iterations):
            result = run_tests(code, tests)
            if result["success"]:
                return code
            code = llm(f"Fix error: {result['error']}\nCode: {code}")
        return code

評価戦略

結果ベース

出力が期待される結果を達成しているかどうかを評価します。

def evaluate_outcome(task: str, output: str, expected: str) -> str:
    return llm(f"Does output achieve expected outcome? Task: {task}, Expected: {expected}, Output: {output}")
LLM-as-Judge

LLM を使用して出力を比較し、ランク付けします。

def llm_judge(output_a: str, output_b: str, criteria: str) -> str:
    return llm(f"Compare outputs A and B for {criteria}. Which is better and why?")
ルーブリックベース

重み付けされた評価軸に照らして出力を採点します。

RUBRIC = {
    "accuracy": {"weight": 0.4},
    "clarity": {"weight": 0.3},
    "completeness": {"weight": 0.3}
}

def evaluate_with_rubric(output: str, rubric: dict) -> float:
    scores = json.loads(llm(f"Rate 1-5 for each dimension: {list(rubric.keys())}\nOutput: {output}"))
    return sum(scores[d] * rubric[d]["weight"] for d in rubric) / 5

ベストプラクティス

プラクティス根拠
明確な基準具体的で測定可能な評価基準を事前に定義する
反復回数の上限無限ループを防ぐため最大反復回数(3〜5)を設定する
収束チェック反復間で出力スコアが改善しない場合は停止する
履歴の記録デバッグと分析のために完全な軌跡を保持する
構造化出力評価結果を確実に解析するために JSON を使用する

クイックスタートチェックリスト

## Evaluation Implementation Checklist

### Setup
- [ ] Define evaluation criteria/rubric
- [ ] Set score threshold for "good enough"
- [ ] Configure max iterations (default: 3)

### Implementation
- [ ] Implement generate() function
- [ ] Implement evaluate() function with structured output
- [ ] Implement optimize() function
- [ ] Wire up the refinement loop

### Safety
- [ ] Add convergence detection
- [ ] Log all iterations for debugging
- [ ] Handle evaluation parse failures gracefully

コメント