多轮工具使用代理基准测试

TAU2-Bench是一个基于多轮对话和工具使用的代理基准测试工具,用于评估LLM模型在客户服务任务中的表现。

  • by mink555
  • Python
  • 本地部署
  • 更新于
在 GitHub 查看 mink555/mcp-llm-bm-v3

使用说明

🚀 TAU2-Bench (OpenRouter)

τ²-bench 기반 Multi-Turn Tool-Use 에이전트 벤치마크 - 5개 LLM 모델 평가 파이프라인


📋 TL;DR (3분 요약)

1. API 키 설정     →  cp .env.example .env && 키 입력
2. 450회 평가 실행  →  cd tau2-bench && ./run_quick_450.sh
3. 결과 확인       →  results/latest/전체_요약/TAU2_전체요약_latest.xlsx

🎯 τ²-bench란?

벤치마크 유형

특성 해당 설명
Multi-Turn Conversation ✅ 평균 19턴/대화
Tool-Use / Function Calling ✅ 평균 6회/대화 tool 호출
Task-Oriented Dialogue ✅ 고객센터 과업 수행
3-Party Conversation ✅ Agent ↔ User ↔ Tool
Simulated User ✅ LLM이 User 역할 수행
Single-Turn QA ❌ 단일 턴 아님
Text Generation Only ❌ 도구 사용이 핵심

핵심 철학

┌─────────────────────────────────────────────────────────────────────┐
│                                                                     │
│   ❌ "정답 텍스트를 맞히는가?"                                       │
│                                                                     │
│   ✅ "에이전트가 도구를 사용해 DB를 변경하고 과업을 완수하는가?"      │
│                                                                     │
└─────────────────────────────────────────────────────────────────────┘

3자 대화 구조

┌─────────────┐       ┌─────────────┐       ┌─────────────┐
│   Agent     │◀─────▶│    User     │       │    Tool     │
│   (LLM)     │       │ (Simulator) │       │    (API)    │
└──────┬──────┘       └─────────────┘       └──────▲──────┘
       │                                           │
       │            tool_call 요청                 │
       └───────────────────────────────────────────┘
참여자 역할 구현
Agent 고객센터 상담원 평가 대상 LLM
User 고객 (시뮬레이션) User Simulator LLM
Tool API/DB Environment (Python)

대화 흐름 예시

Turn 1  🤖 Agent  : "안녕하세요, 무엇을 도와드릴까요?"
        ↓
Turn 2  👤 User   : "주문 W2378156 반품하고 싶어요"
        ↓
Turn 3  🤖 Agent  : [TOOL_CALL: get_order_details]
        ↓
Turn 4  🔧 Tool   : {order_id: "#W2378156", status: "delivered"}
        ↓
Turn 5  🤖 Agent  : [TOOL_CALL: process_return]
        ↓
Turn 6  🔧 Tool   : {success: true, refund: 150.00}
        ↓
Turn 7  🤖 Agent  : "반품 완료! $150 환불됩니다."
        ↓
Turn 8  👤 User   : "감사합니다!" → [STOP]

대화 통계 (실제 데이터)

항목 평균값
총 턴 수 19.4 턴/대화
User 발화 4.6 회/대화
Assistant 발화 8.3 회/대화
Tool Call 6.2 회/대화

다른 벤치마크와 비교

벤치마크 턴 Tool User Sim 평가 대상
τ²-bench Multi ✅ ✅ Agent 행동
MMLU Single ❌ ❌ 지식
HumanEval Single ❌ ❌ 코드 생성
MT-Bench Multi ❌ ❌ 대화 품질
ToolBench Multi ✅ ❌ 도구 사용

📁 프로젝트 구조

TAU2-Bench/
├── README.md                    ← 이 파일
├── .env                         ← API 키 (gitignore)
│
└── tau2-bench/                  ← 업스트림 벤치마크
    ├── README.md                ← 공식 문서 (영어)
    ├── EXCEL_GUIDE.md           ← 엑셀 보고서 가이드
    │
    ├── run_quick_450.sh         ← ⭐ 450회 평가 스크립트
    ├── generate_excel_report.py ← 엑셀 생성기
    │
    └── results/latest/          ← 결과 (gitignore)
        ├── 전체_요약/
        └── 모델별/

⚡ 빠른 시작

Step 1: API 키 설정

cp .env.example .env
# .env 파일 열고 OPENROUTER_API_KEY 입력

Step 2: 450회 Quick 평가

cd tau2-bench
./run_quick_450.sh
항목 값
실행 횟수 450회 (3 도메인 × 30 태스크 × 5 모델)
예상 시간 ~30분

Step 3: 결과 확인

파일 경로
전체 요약 results/latest/전체_요약/TAU2_전체요약_latest.xlsx
모델별 results/latest/모델별/<모델>/TAU2_<모델>_latest.xlsx

📊 평가 도메인

도메인 설명 주요 태스크
Retail 전자상거래 고객센터 주문 조회, 반품, 교환
Airline 항공 고객센터 예약, 변경, 좌석
Telecom 통신 고객센터 요금제, 장애, 청구

📦 데이터셋 구조

디렉토리 레이아웃

data/tau2/
├── domains/
│   ├── retail/
│   │   ├── tasks.json          ← 평가 태스크 (115개+)
│   │   ├── db.json             ← 상품/주문/유저 DB (83K+ lines)
│   │   ├── policy.md           ← 에이전트 정책 문서
│   │   └── split_tasks.json    ← base/test 분할
│   │
│   ├── airline/
│   │   ├── tasks.json          ← 평가 태스크
│   │   ├── db.json             ← 예약/비행편 DB
│   │   ├── policy.md           ← 항공 정책 문서
│   │   └── split_tasks.json
│   │
│   └── telecom/
│       ├── tasks.json          ← 기본 태스크
│       ├── tasks_full.json     ← 전체 태스크
│       ├── main_policy.md      ← 메인 정책
│       ├── tech_support_*.md   ← 기술 지원 워크플로우
│       ├── db.toml             ← 계정 DB
│       └── workflows/          ← 문제해결 플로우차트
│
├── user_simulator/
│   └── simulation_guidelines.md    ← 시뮬레이션 가이드라인
│
└── results/final/                  ← 공식 결과 JSON

도메인별 데이터 비교

항목 Retail Airline Telecom
DB 형식 JSON JSON TOML
주요 엔티티 products, orders, users flights, reservations, users accounts, lines, plans
정책 문서 1개 (policy.md) 1개 (policy.md) 3개+ (main + workflow)
워크플로우 없음 없음 DOT 플로우차트
난이도 중 중 상 (상태 관리 복잡)

Task JSON 구조

{
  "id": "0",
  "description": {
    "purpose": "테스트 목적",
    "relevant_policies": "관련 정책",
    "notes": "추가 노트"
  },
  "user_scenario": {
    "persona": null,
    "instructions": {
      "task_instructions": "세부 행동 지침",
      "domain": "retail | airline | telecom",
      "reason_for_call": "고객이 전화한 이유",
      "known_info": "고객이 알고 있는 정보",
      "unknown_info": "고객이 모르는 정보"
    }
  },
  "initial_state": null,
  "evaluation_criteria": {
    "actions": [...],           // 예상 Tool 호출 목록
    "communicate_info": [...],  // 전달해야 할 정보
    "env_assertions": [...],    // 환경 상태 검증
    "nl_assertions": [...]      // 자연어 검증
  }
}

User Instructions 필드 설명

필드 용도 예시
task_instructions User Simulator 행동 지침 "Agent가 취소 불가하면 보험 얘기 언급"
domain 도메인 지정 "retail"
reason_for_call 고객 요청 내용 "주문 #W2378156 교환하고 싶어요"
known_info 제공 가능 정보 "Yusuf Rossi, zip 19122"
unknown_info 모르는 정보 "이메일 기억 안 남"

Evaluation Criteria 필드 설명

평가 항목 JSON 필드 Pass 기준
DB (자동 비교) Gold DB Hash == Predicted DB Hash
ACTION actions 모든 GT Action이 예측에 존재
COMMUNICATE communicate_info GT 문자열이 응답에 포함
ENV_ASSERTION env_assertions 환경 조건 충족
NL_ASSERTION nl_assertions 자연어 조건 충족 (LLM 판정)

Trajectory (실행 결과) JSON 구조

{
  "timestamp": "2025-06-05T15:33:58.840015",
  "info": {
    "num_trials": 4,
    "max_steps": 200,
    "user_info": { "llm": "gpt-4.1-2025-04-14", ... },
    "agent_info": { "llm": "gpt-4.1-2025-04-14", ... },
    "environment_info": { "domain_name": "retail", "policy": "...", ... }
  },
  "tasks": [
    {
      "id": "0",
      "user_scenario": { ... },
      "evaluation_criteria": { ... },
      "trials": [
        {
          "messages": [...],     // 전체 대화 기록
          "reward": 1.0,         // 최종 점수
          "reward_breakdown": {  // 항목별 점수
            "DB": 1.0,
            "COMMUNICATE": 1.0,
            "ACTION": 1.0
          }
        }
      ]
    }
  ]
}

🔄 평가 프로세스

시스템 아키텍처 흐름도

[ 입력 데이터 ] ─────────┐
(Task + Tools + User)    │
                         ▼
[ 평가 대상 모델 ] ─────── (OpenRouter API 호출)
(Agent Response 생성)    │
                         ▼
[ User Simulator ] ────── (LLM이 고객 역할 수행)
(Multi-Turn 대화 진행)   │
                         ▼
[ Tool Execution ] ────── (API 호출 → DB 상태 변경)
(실제 환경에서 실행)     │
                         ▼
[ 결과 검증 ] ─────────── (GT와 비교)
(DB Hash + Actions)      │
                         ▼
[ 점수 산출 ] ─────────── (JSON 저장 및 Excel 리포트 생성)

📈 채점 기준 (Reward Breakdown)

Pass/Fail 판정 기준

평가 항목 Pass 기준 Fail 주요 원인
DB Gold DB Hash == Predicted DB Hash Tool 파라미터 오류, 호출 순서 오류, 누락
COMMUNICATE GT 문자열이 응답에 모두 포함 필수 정보 미전달, 다른 표현 사용
ACTION 모든 GT Action이 예측에 존재 함수 오선택, 인자 누락, 불필요한 호출
ENV_ASSERTION 환경 조건 모두 충족 상태 불일치, 제약조건 위반

점수 계산 공식

Reward = RB_DB × RB_COMMUNICATE × RB_ACTION × RB_ENV_ASSERTION

┌─────────────────────────────────────────────────────┐
│  PASS: Reward == 1.0  (모든 항목 통과)              │
│  FAIL: Reward < 1.0   (하나라도 실패)               │
└─────────────────────────────────────────────────────┘

🔧 평가 대상 모델 (5개)

# 모델 Provider 파라미터
1 qwen3-32b Qwen 32B
2 qwen3-next-80b-a3b-instruct Qwen 80B (MoE 3B active)
3 qwen3-14b Qwen 14B
4 llama-3.3-70b-instruct Meta 70B
5 mistral-small-3.2-24b-instruct Mistral 24B

📊 결과 분석

최종 벤치마크 결과 (450건 전체 채점 완료)

순위 모델명 Retail (30) Airline (30) Telecom (30) Pass Rate
🥇 Qwen3-32B 40.0% 33.3% 46.7% 40.0%
🥈 Qwen3-Next-80B 50.0% 26.7% 10.0% 28.9%
🥉 Qwen3-14B 26.7% 20.0% 30.0% 25.6%
4 Llama-3.3-70B 13.3% 13.3% 20.0% 15.6%
5 Mistral-Small-24B 10.0% 30.0% 6.7% 15.6%

RB 항목별 Pass Rate

모델 DB COMMUNICATE ENV_ASSERTION
Qwen3-32B 39.7% 81.0% 50.0%
Qwen3-Next-80B 48.3% 86.7% 10.7%
Qwen3-14B 46.9% 87.5% 81.8%
Llama-3.3-70B 16.7% 75.0% 21.4%
Mistral-Small-24B 24.6% 77.2% 10.0%

🔍 모델별 상세 분석

모델명 강점 약점 종합 평가
Qwen3-32B 전 도메인 균형, Telecom 최고 (46.7%) - Tool-use 튜닝 우수. 가성비 최고
Qwen3-Next-80B Retail 최강 (50%), DB Pass 최고 (48.3%) Telecom 취약 (10%), ENV 취약 (10.7%) MoE 특성상 도메인별 편차 큼
Qwen3-14B ENV_ASSERTION 최고 (81.8%), 소형 모델 대비 준수 DB Pass 낮음 경량화 환경 추천
Llama-3.3-70B - DB 16.7%로 최하위, Tool-use 튜닝 부재 70B임에도 저조한 성능
Mistral-Small-24B Airline 양호 (30%) Retail/Telecom 매우 취약, ENV 10% 함수 선택 능력 부족

⚠️ 평가 중 발견된 주요 이슈

모델 이슈 유형 상세 내용 영향
Llama-3.3-70B DB 변경 실패 Tool Call 파라미터 오류, 호출 순서 실수 다수 DB Pass 16.7% (최하위)
Mistral-Small-24B 함수 선택 오류 유사 함수 중 정답을 찾지 못하고 다른 함수 호출 Retail 10%, Telecom 6.7%
Qwen3-Next-80B Telecom 도메인 취약 복잡한 상태 관리가 필요한 태스크에서 실패 Telecom 10.0% (전체 최하위)
Qwen 시리즈 모델 크기 역전 80B > 32B 예상과 달리 32B가 더 높은 점수 크기보다 Tool-use 튜닝이 중요

💡 용도별 모델 추천

용도 추천 모델 이유
Agent 역할 (Tool 호출 중심) Qwen3-32B 전체 Pass Rate 40.0%로 최고, 도메인별 균형
Retail 도메인 특화 Qwen3-Next-80B Retail 50.0%로 단일 도메인 최고
경량화 환경 Qwen3-14B 14B 크기에서 25.6% 달성, ENV_ASSERTION 81.8%
균형 잡힌 성능 Qwen3-32B 모든 도메인에서 30% 이상 유지

📌 핵심 인사이트

┌─────────────────────────────────────────────────────────────────────┐
│                         💡 핵심 발견                                │
├─────────────────────────────────────────────────────────────────────┤
│                                                                     │
│  1. DB 불일치가 모든 모델의 #1 실패 원인                            │
│     → Tool Call 파라미터 오류 or 호출 순서 오류                     │
│                                                                     │
│  2. 파라미터 수 ≠ 성능                                              │
│     → 70B, 80B 모델이 32B 모델보다 저조                             │
│     → Tool-use 특화 튜닝 여부가 더 중요                             │
│                                                                     │
│  3. 도메인별 난이도 차이                                            │
│     → Retail: 직관적 (교환/반품) - 상대적 쉬움                      │
│     → Telecom: 복잡한 상태 관리 - 가장 어려움                       │
│                                                                     │
│  4. Qwen 계열이 전반적으로 우수                                     │
│     → Tool-Use에 최적화된 학습 데이터 추정                          │
│     → 32B가 가성비 최고, 14B도 경량 대비 준수                       │
│                                                                     │
│  5. COMMUNICATE는 대부분 통과 (75~87%)                              │
│     → 정보 전달 자체는 잘 하지만 DB 변경에서 실패                   │
│                                                                     │
└─────────────────────────────────────────────────────────────────────┘

🔧 핵심 스크립트 실행 가이드

📋 스크립트 목록

파일 용도 위치
run_quick_450.sh ⭐ 450회 평가 (Quick) tau2-bench/
run_evaluation.sh Full 평가 (P@k) tau2-bench/
generate_reports.py 리포트 생성 엔트리 tau2-bench/
generate_excel_report.py 엑셀 보고서 생성 tau2-bench/

1️⃣ 평가 실행: run_quick_450.sh

cd tau2-bench
./run_quick_450.sh
옵션 기본값 설명
NUM_TASKS 30 도메인당 태스크 수
NUM_TRIALS 1 태스크당 반복 수
MAX_CONCURRENCY 3 동시 실행 수
FORCE 0 1이면 기존 결과 삭제
DELAY_SEC 1 호출 간 딜레이(초)
# 예시: 기존 결과 삭제 후 재실행
FORCE=1 ./run_quick_450.sh

# 예시: 동시 실행 수 줄이기 (503 에러 대응)
MAX_CONCURRENCY=1 DELAY_SEC=2 ./run_quick_450.sh

2️⃣ 리포트 생성: generate_reports.py

cd tau2-bench
python3 generate_reports.py \
  --results-root results/latest \
  --input-dir results/latest/simulations \
  --prune
옵션 설명
--results-root 결과 저장 루트 디렉토리
--input-dir 시뮬레이션 JSON 디렉토리
--prune 기존 파일 정리 후 생성

출력:

  • results/latest/전체_요약/TAU2_전체요약_latest.xlsx
  • results/latest/모델별/<모델>/TAU2_<모델>_latest.xlsx

3️⃣ 엑셀 직접 생성: generate_excel_report.py

cd tau2-bench
python3 generate_excel_report.py \
  --input-dir results/latest/simulations \
  --output results/latest/전체_요약/TAU2_전체요약_latest.xlsx
옵션 설명
--input-dir 시뮬레이션 JSON 디렉토리
--output 출력 엑셀 파일 경로

4️⃣ tau2 CLI 명령어

# 설치 확인
tau2 check-data

# 1개 태스크 테스트 (연결 확인)
tau2 run \
  --domain retail \
  --agent-llm openrouter/qwen/qwen3-32b \
  --user-llm openrouter/qwen/qwen3-32b \
  --num-tasks 1 \
  --num-trials 1

# 특정 모델 Full 평가
tau2 run \
  --domain retail \
  --agent-llm openrouter/qwen/qwen3-32b \
  --user-llm openrouter/qwen/qwen3-32b \
  --num-trials 4 \
  --task-split base \
  --save-to qwen3-32b_retail

# 결과 뷰어
tau2 view

# 도메인 문서 확인
tau2 domain retail
명령어 용도
tau2 check-data 데이터 경로 확인
tau2 run 평가 실행
tau2 view 결과 뷰어
tau2 domain <name> 도메인 API 문서
tau2 play 인터랙티브 모드

5️⃣ 실행 흐름 요약

┌─────────────────────────────────────────────────────────────────────┐
│                        실행 흐름                                    │
├─────────────────────────────────────────────────────────────────────┤
│                                                                     │
│  1. 평가 실행                                                       │
│     ./run_quick_450.sh                                             │
│         ↓                                                          │
│     tau2 run (5개 모델 × 3개 도메인)                                │
│         ↓                                                          │
│     data/simulations/*.json 생성                                   │
│                                                                     │
│  2. 리포트 생성                                                     │
│     python3 generate_reports.py                                    │
│         ↓                                                          │
│     generate_excel_report.py 호출                                  │
│         ↓                                                          │
│     results/latest/전체_요약/TAU2_전체요약_latest.xlsx              │
│                                                                     │
│  3. 결과 확인                                                       │
│     엑셀 파일 열기 → 요약/런/턴 시트 확인                           │
│                                                                     │
└─────────────────────────────────────────────────────────────────────┘

🛠️ 트러블슈팅

증상 원인 해결
HTTP 503 Provider 가용성 재시도, 시간대 변경
HTTP 422 Tool schema 오류 LiteLLM 업데이트
RB_ACTION=0 툴 호출 실패 툴 args 확인

📝 코드 실행 경로

tau2 run (CLI)
    ↓
src/tau2/run.py → Orchestrator.run()
    ↓
┌─────────────────────────────────────────┐
│           Orchestrator                  │
│  ┌─────────┐  ┌─────────┐  ┌─────────┐ │
│  │  Agent  │←→│  User   │←→│   Env   │ │
│  │  (LLM)  │  │  (LLM)  │  │ (Tools) │ │
│  └─────────┘  └─────────┘  └─────────┘ │
└─────────────────────────────────────────┘
    ↓
src/tau2/utils/llm_utils.py → litellm.completion()
    ↓
OpenRouter API

✅ 빠른 점검

  • [ ] echo $OPENROUTER_API_KEY → 키 출력 확인
  • [ ] tau2 check-data → 데이터 경로 확인
  • [ ] tau2 run --num-tasks 1 → 1개 태스크 성공

📚 참고 문서

문서 위치 내용
공식 README tau2-bench/README.md 설치/CLI
엑셀 가이드 tau2-bench/EXCEL_GUIDE.md 보고서 해석

📖 공식 문서 · 📊 엑셀 가이드 · 🏆 Leaderboard