음성 에이전트 평가와 LLM 판사: 작동 방식
Source: Dev.to
위에 제공된 텍스트 외에 번역할 내용이 없습니다. 번역을 원하는 전체 본문을 알려주시면 한국어로 번역해 드리겠습니다.
핵심 과제
- 비결정적 행동 – 동일한 에이전트가 동일한 프롬프트를 받아도 실행마다 다른 대화를 생성할 수 있습니다.
- 전통적인 단언 기반 테스트는 실패 – 일치시킬 단일 “정답” 출력이 존재하지 않습니다.
- 필요한 것 – 정확한 문자열 매칭이 아니라 의도를 이해하는 평가자.
Voicetest는 LLM‑as‑judge 평가를 통해 이를 해결합니다: 에이전트와 다중 턴 대화를 시뮬레이션한 뒤, 전체 대화 기록을 판정 모델에 전달하여 성공 기준에 따라 점수를 매깁니다.
Voicetest 작동 방식
Voicetest는 테스트 실행 중에 세 가지 별도 LLM 역할을 사용합니다:
| 역할 | 책임 |
|---|---|
| 시뮬레이터 | 사용자를 연기합니다. 페르소나 프롬프트를 기반으로 현실적인 사용자 메시지를 차례로 생성합니다. 대화 목표가 달성되었고 종료되어야 할 시점을 스스로 판단합니다 – 스크립트된 대화 트리가 없습니다. |
| 에이전트 | 여러분의 음성 에이전트를 연기합니다. Voicetest는 여러분의 에이전트 구성(Retell, VAPI, LiveKit 또는 자체 포맷)을 중간 그래프 표현(상태 프롬프트가 있는 노드, 조건이 있는 전이, 도구 정의)으로 가져옵니다. 에이전트 모델은 이 그래프를 따라 현재 노드의 지시에 따라 응답하고 상태 간 전이를 수행합니다. |
| 판정자 | 완료된 전사본을 평가합니다. 전체 대화를 읽고 정의한 각 메트릭에 따라 점수를 매깁니다(LLM‑as‑judge). |
각 역할에 다른 모델을 지정할 수 있습니다. 예:
[models]
simulator = "groq/llama-3.1-8b-instant"
agent = "groq/llama-3.3-70b-versatile"
judge = "openai/gpt-4o"
시뮬레이션에는 빠르고 저렴한 모델을 사용하세요(페르소나를 따르는 것만 필요합니다). 판정에는 정확성이 중요한 더 강력한 모델을 사용하세요.
테스트 케이스 정의
각 테스트 케이스는 사용자 페르소나와 에이전트가 충족해야 할 메트릭을 정의합니다:
{
"name": "Appointment reschedule",
"user_prompt": "You are Maria Lopez, DOB 03/15/1990. You need to reschedule your Thursday appointment to next week. You prefer mornings.",
"metrics": [
"Agent verified the patient's identity before making changes.",
"Agent confirmed the new appointment date and time."
],
"type": "llm"
}
대화 루프
- Voicetest는 에이전트의 입구 노드에서 시작합니다.
- 시뮬레이터는 페르소나를 기반으로 사용자 메시지를 생성합니다.
- 에이전트는 현재 노드의 상태 프롬프트에 따라 응답합니다.
- Voicetest는 전환 조건을 평가하여 다음 노드를 결정합니다.
루프는 max_turns(기본값 20)까지 또는 시뮬레이터가 목표가 완료되었다고 판단할 때까지 계속됩니다.
전사 메타데이터
시뮬레이션이 끝난 후, Voicetest는 다음을 기록합니다:
- 전체 전사
- 방문한 노드
- 호출된 도구(있는 경우)
- 턴 수
- 종료 이유
Source: …
Judge Evaluation
판사는 각 메트릭을 독립적으로 평가합니다. 다음과 같은 메트릭에 대해:
“에이전트가 변경을 수행하기 전에 환자의 신원을 확인했습니다.”
판사는 네 개의 필드를 포함하는 구조화된 출력을 반환합니다:
| 필드 | 설명 |
|---|---|
| Analysis | 메트릭을 개별 요구사항으로 나누고, 각 요구사항에 대한 전사 증거를 인용합니다 (예: “신원 확인 요청”이 3번째 턴에, “변경 전 확인”이 5번째 턴에). |
| Score | 요구사항이 충족된 비율에 따라 0.0 – 1.0을 매깁니다. 신원 확인이 변경 후에 이루어졌다면 점수는 0.5가 될 수 있습니다. |
| Reasoning | 통과된 항목과 실패한 항목에 대한 요약입니다. |
| Confidence | 평가에 대한 확신 정도를 나타냅니다. |
모든 메트릭 점수가 임계값(기본값 0.7, 에이전트 또는 메트릭별로 구성 가능)을 충족하면 테스트가 통과합니다.
왜 먼저 분석을 요구하나요?
이는 판사가 이유를 적어두고도 높은 점수를 부여하는 일반적인 오류를 방지합니다. 모델이 먼저 요구사항과 증거를 열거하도록 강제함으로써, 점수가 분석과 일치하도록 합니다.
규칙 기반 (결정론적) 테스트
모든 검사가 판사가 필요하지는 않습니다. Voicetest는 패턴 매칭을 위한 규칙 테스트도 지원합니다:
{
"name": "No SSN in transcript",
"user_prompt": "You are Jane, SSN 123-45-6789. Ask the agent to verify your identity.",
"excludes": ["123-45-6789", "123456789"],
"type": "rule"
}
규칙 테스트는 다음을 지정할 수 있습니다:
includes– 필수 문자열excludes– 금지 문자열patterns– 정규식
즉시 실행되고 비용이 들지 않으며 100 % 신뢰도의 이진 통과/실패 결과를 반환합니다—규정 준수 검사, 개인식별정보(PII) 탐지, 필수 구문 검증에 이상적입니다.
글로벌 메트릭
개별 테스트 메트릭은 특정 시나리오를 평가합니다.
글로벌 메트릭은 모든 테스트 전사를 조직 전체 기준에 따라 평가합니다:
{
"global_metrics": [
{
"name": "HIPAA Compliance",
"criteria": "Agent verifies patient identity before disclosing any protected health information.",
"threshold": 0.9
},
{
"name": "Brand Voice",
"criteria": "Agent maintains a professional, empathetic tone throughout the conversation.",
"threshold": 0.7
}
]
}
- 글로벌 메트릭은 각 테스트마다 자동으로 실행됩니다.
- 테스트는 그 자체 메트릭과 모든 글로벌 메트릭이 임계값을 충족할 때만 통과합니다.
- 이를 통해 HIPAA, PCI‑DSS, 또는 브랜드 가이드라인과 같은 표준을 전체 스위트에 걸쳐 한 곳에서 적용할 수 있습니다.
End‑to‑End 테스트 실행
- Import 에이전트 구성을 Voicetest의 그래프 표현으로 가져옵니다.
- 각 테스트 케이스마다: 시뮬레이터와 에이전트 모델을 사용해 다중 턴 시뮬레이션을 실행합니다.
- Judge 가 전사(transcript)를 기준으로 각 메트릭 및 전역 메트릭을 평가합니다.
- Store results 를 DuckDB에 저장합니다 (전체 전사, 점수, 추론, 방문한 노드, 호출된 도구).
- Pass/fail: 테스트는 모든 메트릭과 모든 전역 메트릭이 임계값을 충족할 때만 통과합니다.
web UI (voicetest serve)는 결과를 시각화합니다: 노드 주석이 포함된 전사, Judge의 추론이 포함된 메트릭 점수, 그리고 통과/실패 상태.
CLI는 CI 통합을 위해 동일한 데이터를 stdout에 출력합니다.
시작하기
uv tool install voicetest
voicetest demo --serve
데모는 테스트 케이스가 포함된 샘플 에이전트를 로드하고 웹 UI를 열어 워크플로를 탐색할 수 있게 합니다.