W&B Weave와 Google ADK 에이전트를 활용한 신뢰성 있는 보험 워크플로 평가
이 글은 Agent Development Kit(ADK)와 W&B Weave를 활용해 AI 보험 에이전트를 구축, 테스트, 평가하는 전 과정을 실무적으로 안내합니다. 이 글은 AI 번역본입니다. 오역이 의심되면 댓글로 알려주세요.
Created on September 12|Last edited on September 12
Comment
보험 업계에서는 고객 문의 응대부터 청구 처리 자동화에 이르기까지 복잡한 워크플로를 인공지능 에이전트가 점점 더 많이 담당하고 있습니다. 그러나 이러한 에이전트를 평가하기 위해서는 전통적인 통과/실패 방식의 단위 테스트만으로는 충분하지 않습니다. 보험 에이전트는 확률적 모델과 도구 오케스트레이션에 의존하므로, 정합성, 신뢰성, 규제 준수를 보장하기 위해 보다 정교하고 다단계의 평가가 필요합니다.
Google의 Agent Development Kit(ADK) 프레임워크 이 요구를 충족하기 위해 모듈형이며 확장 가능한 접근 방식을 제공합니다. AI 에이전트의 동작 평가 최종 출력까지. 함께 사용하면 W&B Weave의 강력한 추적 및 분석또한 ADK는 조직이 에이전트 성능을 모니터링하고, 테스트를 간소화하며, 대규모로 시스템을 지속적으로 개선할 수 있도록 지원합니다.
이 글에서는 바로 그런 에이전트를 직접 만들어 보겠습니다. 시작해 보죠.

목차
목차ADK와 에이전트 평가에서의 역할 이해전통적인 소프트웨어와 AI 에이전트 평가의 핵심 차이점명확한 목표와 성공 기준을 정의하는 중요성ADK가 에이전트 평가를 지원하는 방법테스트 파일과 evalset 파일을 사용할 때의 이점과 과제ADK 내장 평가 기능평가 고도화를 위한 W&B Weave 통합W&B Weave와 함께 ADK를 사용하는 단계별 튜토리얼테스트 세트 만들기 결론
ADK와 에이전트 평가에서의 역할 이해
Agent Development Kit은 AI 팀이 고급 AI 에이전트를 구축, 관리, 평가할 수 있도록 설계된 모듈형 프레임워크입니다. ADK를 사용하면 개발자는 다양한 유형의 에이전트를 정의하고, 복잡한 워크플로를 오케스트레이션하다그리고 메모리, 도구, 로직을 통합해 풍부하고 지능적인 행동을 가능하게 합니다. ADK의 구조는 에이전트가 여러 단계의 작업을 수행하고, 외부 시스템과 상호작용하며, 설명 가능하고 감사를 받을 수 있는 결과를 만들어야 하는 애플리케이션에 특히 유용합니다.
ADK의 핵심 강점 중 하나는 내장된 평가 시스템입니다. 이 시스템은 에이전트가 무엇을 출력하는지뿐 아니라, 작업 전반에서 어떻게 추론하고 행동하는지까지 검증할 수 있는 구조화된 시나리오를 만들도록 해줍니다. ADK는 에이전트 평가를 위해 두 가지 주요 방식을 지원합니다. 단일 상호작용이나 특정 동작을 점검할 수 있는 test files(유닛 테스트와 유사)와, 더 복잡한 다단계 워크플로를 포착해 폭넓은 평가를 수행하는 evalset files입니다. 이러한 도구들은 AI 에이전트가 실제 환경에서 기대대로 동작하도록 보장하며, 문제를 조기에 식별하고 해결하기 쉽게 만들어 줍니다.
ADK는 이러한 테스트 케이스를 대화형으로 만들고, 편집하고, 실행할 수 있는 웹 인터페이스를 제공합니다. 또한 코드 기반 및 자동화된 워크플로도 지원하여 팀이 통합할 수 있도록 합니다. 에이전트 평가 자신들의 개발 파이프라인에. 사용하여 W&B Weave 시간이 지나면서 평가 결과를 쉽게 저장하고, 추적하며, 시각화할 수 있어 시스템 변경이 성능과 신뢰성에 어떤 영향을 미치는지 파악할 수 있습니다. ADK와 Weave를 함께 사용하면 엄격한 테스트 골격과 더불어 에이전트가 실제 시나리오에서 어떻게 성과를 내는지에 대한 지속적인 가시성을 모두 확보할 수 있습니다.
전통적인 소프트웨어와 AI 에이전트 평가의 핵심 차이점
전통적인 소프트웨어 평가는 보통 결정적이고 규칙 기반의 로직에 의존합니다. 동일한 입력이 주어지면 프로그램은 항상 동일한 출력을 생성합니다. 그 결과, 테스트는 명확한 합격/불합격 기준이 있는 단위 테스트와 통합 테스트에 초점을 맞추며, 잘 정의된 조건에서 코드의 정확성, 커버리지, 성능을 강조합니다.
반대로, AI 에이전트를 평가하는 일에는 고유한 어려움이 따릅니다. 이러한 에이전트는 본질적으로 확률적입니다. 동일한 입력에 대해서도, 문맥과 이전 대화, 그리고 샘플링 온도로 인한 무작위성에 영향을 받아 여러 개의 유효한(혹은 유효하지 않은) 출력을 생성할 수 있습니다. 이들의 응답은 단순히 코드의 직접적인 함수가 아니라, 학습된 행동과 추론 패턴이 반영된 결과입니다.
이러한 근본적인 차이로 인해 LLM 기반 에이전트 평가 전통적인 단언문이나 이진 합격/불합격 검사에만 의존할 수 없습니다. 대신, 효과적인 평가는 정성적 방법과 정량적 방법을 혼합해 수행해야 합니다:
- 정성적 평가: 에이전트가 무엇에 답했는지뿐 아니라, 그 답에 어떻게 도달했는지도 분석하는 것이 매우 중요합니다. 이를 위해서는 행동의 순서(“트라젝터리”), 도구 사용에 대한 의사결정, 그리고 거쳐간 논리적 경로를 검토해야 합니다. 보험과 같은 산업에서는 이러한 의사결정 과정을 이해하는 일이 정확성, 신뢰성, 규정 준수를 위해 결정적입니다.
- 유연한 출력 기준: 허용 가능한 응답이 여러 개 존재할 수 있으므로, 평가는 부분 점수, 퍼지 매칭, 정답의 변형을 허용해야 합니다.
- 추론 과정과 엣지 케이스에 대한 주의사항: LLM 일반화하거나 예상치 못한 추론을 할 수 있습니다. 평가는 에이전트의 추론 품질, 모호성을 처리하는 능력, 그리고 정해진 가이드라인이나 제약을 준수하는지를 검증해야 합니다.
전반적으로 AI 에이전트 평가의 초점은 최종 출력만을 확인하는 데서, 과정과 결과를 함께 면밀히 검토하는 것으로 이동합니다. 에이전트 평가는 더 미묘하고 맥락 의존적으로 변하며, 이러한 복잡성을 포착하고 지속적인 개선을 지원할 수 있는 ADK와 같은 전문 도구가 필요합니다.
명확한 목표와 성공 기준을 정의하는 중요성
AI 에이전트 평가를 자동화하기 전에 명확한 목표와 성공 기준을 정의하는 것은 매우 중요합니다. 성공의 모습을 사전에 정해 두면, 비즈니스 요구에 부합하는 체계적인 에이���트 성과 평가 프로세스를 마련할 수 있습니다. 이러한 기반은 핵심 업무를 식별하고, 가장 중요한 에이전트 행동을 결정하며, 수용 가능한 성능에 대한 명확한 벤치마크를 설정하는 데 도움을 줍니다.
새로운 모델 버전이나 프롬프트 수정과 같은 변경이 실제로 더 나은 결과로 이어지는지 판단하기는 어렵습니다. 구체적인 목표와 측정 가능한 성공 기준이 없으면 평가는 주관적이거나 일관성을 잃기 쉽습니다. 출력이 달라진 것은 관찰할 수 있지만, 시스템이 실제로 개선되었는지, 성능이 저하되었는지, 아니면 단지 변했을 뿐인지 판단하기 어려울 수 있습니다.
이 때문에 평가 지표를 시간에 따라 추적하는 것도 매우 중요합니다. 지속적인 추적을 통해 추세를 시각화하고, 에이전트가 개선되고 있는지 아니면 성능이 저하되고 있는지를 평가하며, 실제 환경에서 업데이트가 어떤 영향을 미치는지 파악할 수 있습니다. 또한 일관된 기록 관리는 성능 변화가 언제 발생했는지, 무엇이 원인이었는지를 정확히 짚어내는 데 도움이 되어, 디버깅과 향후 개선 반복에 모두 유용한 인사이트를 제공합니다.
Weights & Biases Weave와 같은 도구는 이 과정을 간소화하고 신뢰성을 높여 줍니다. Weave는 강력한 평가 워크플로를 제공하여 예측을 로그로 남기고, 점수, 그리고 요약을 코드에서 직접 기록할 수 있습니다. 실험, 모델 버전, 프롬프트 변경에 걸쳐 평가 결과를 저장하고, 조회하고, 비교할 수 있습니다. 이 플랫폼은 대시보드를 제공합니다. 트레이스 뷰, 그리고 리더보드를 제공하여 성능 세부 정보를 깊이 파고들고, 추세를 파악하며, 팀과 결과를 공유할 수 있습니다. 명확한 목표 설정과 지속적인 추적, 그리고 Weave와 같은 도구를 함께 사용하면, 에이전트 평가는 엄격하고 의미 있을 뿐 아니라 시스템이 발전함에 따라 실행 가능하고 반복 가능한 형태로 유지됩니다.
ADK가 에이전트 평가를 지원하는 방법
Agent Development Kit은 특히 보험처럼 복잡한 환경에서 AI 에이전트의 엔드 투 엔드 동작을 평가하도록 설계된 툴킷입니다. 일반적인 애플리케이션 테스트와 달리, ADK를 통한 에이전트 평가는 에이전트가 무엇을 출력하는지뿐만 아니라 답에 도달하는 과정도 함께 고려합니다. 즉, 에이전트가 거친 단계, 사용한 도구, 그리고 중요한 비즈니스 규칙을 준수했는지까지 추적합니다. ADK는 테스트 케이스와 평가 시나리오를 정의하기 위한 유연하고 스키마 기반의 시스템을 제공하며, 대화형 웹 인터페이스를 통해 이를 손쉽게 구성하고 관리할 수 있도록 해 줍니다.
ADK는 에이전트 평가를 위해 두 가지 핵심 방식을 지원합니다: 테스트 파일과 evalset 파일. 테스트 파일을 사용하면 개별 에이전트 동작에 대해 빠른 피드백을 제공하는 단위 테스트용 집중 세션을 정의할 수 있습니다. 반면 evalset 파일을 사용하면 실제 업무 흐름을 반영한 더 크고 다회차의 세션을 캡처하여, 더 복잡한 시나리오와 워크플로를 테스트할 수 있습니다. 두 방식 모두 ADK 웹 뷰어에서 지원되며, 직관적이고 대화형 방식으로 평가를 생성, 편집, 실행할 수 있습니다. 또는 자동화와 CI 파이프라인 통합을 위해, ADK는 프로그래밍 방식과 커맨드라인 중심의 워크플로도 지원합니다.
세부 수준을 달리한 평가를 지원함으로써, ADK는 팀이 문제를 조기에 발견하고 에이전트 버전 전반의 변화를 추적하며, 단순한 경우뿐 아니라 복잡하고 다단계인 시나리오에서도 에이전트가 기대한 대로 동작하도록 보장할 수 있게 합니다.
테스트 파일과 evalset 파일을 사용할 때의 이점과 과제
테스트 파일 ADK의 테스트 파일은 단위 테스트에 이상적입니다. 각 파일은 단일 에이전트 세션을 캡처하므로, 에이전트의 로직을 반복적으로 개선하는 과정에서 개별 동작이나 단순한 상호작용을 쉽게 점검할 수 있습니다. 가장 큰 장점은 속도입니다. 이 테스트들은 빠르게 실행되며 개발 워크플로에 손쉽게 통합될 수 있어, 회귀나 오류를 즉시 찾아낼 수 있습니다. 다만 주요한 한계는 테스트 파일이 주로 단순한 사례에 적합하다는 점입니다. 실제 프로덕션 워크플로의 복잡성을 충분히 담아내지는 못합니다.
evalset 파일반면 evalset 파일은 더 넓은 범위의 통합 수준 테스트에 적합합니다. 여러 개의, 경우에 따라 긴 세션을 수집함으로써, 다단계 대화나 복잡한 의사결정 순서를 포함해 에이전트가 처리해야 하는 현실 세계의 복잡성을 시뮬레이션할 수 있습니다. 덕분에 evalset 파일은 회귀 테스트에 이상적이며, 업데이트가 기존 워크플로를 깨뜨리지 않도록 보장합니다. 다만, 사용 사례와 데이터셋이 커질수록 evalset 파일을 생성하고 유지 관리하는 작업은 더 복잡해지고 시간이 많이 들 수 있습니다.
evalset 파일에서 일반적으로 확인할 수 있는 핵심 필드:
- 여러 사례를 담은 최상위 객체 또는 배열
- 각 사례마다 다음이 있습니다:
- 사용자와 에이전트 메시지로 이루어진 일련의 대화 시퀀스와(선택적으로) 예상 중간 데이터
- 예상 응답에 대한 도구 사용
다음은 최소한의 예시를 보여주는 evalset 파일입니다:
[{"eval_id": "case001","conversation": [{"role": "user","user_content": {"parts": [{"text": "I'd like to file a claim for my lost luggage."}]}},{"role": "agent","final_response": {"parts": [{"text": "Sure, I can help you file a claim for your lost luggage. Can you provide more details about your trip?"}]},"intermediate_data": {"tool_uses": [{"name": "claim_intake","args": {"type": "lost_luggage"}}]}}],"session_input": {"user_id": "U123","app_name": "insurance_demo"}},{"eval_id": "case002","conversation": [{"role": "user","user_content": {"parts": [{"text": "When is my next premium payment due?"}]}},{"role": "agent","final_response": {"parts": [{"text": "Your next payment is $85.35, due July 15th."}]},"intermediate_data": {"tool_uses": [{"name": "fetch_payment_due","args": {"policy_id": "P10005"}}]}}]}]
두 접근법 모두 최신 평가 기준을 유지하고, 현재의 에이전트 로직에 맞춰 예상되는 도구 사용과 응답을 정렬하며, 에이전트가 발전함에 따라 테스트의 적절성이 계속 유지되는지 주기적으로 점검해야 합니다.
ADK 내장 평가 기능
ADK의 내장 평가 기능은 에이전트 성능을 평가하기 위한 강력한 도구와 명확한 워크플로를 제공합니다. ADK 웹 UI를 통해 개발자는 테스트 케이스나 evalset을 생성, 편집, 구성하고 평가를 실행하며, 에이전트의 행동이나 답변이 기대치에서 어디에서 벗어났는지 즉시 시각화할 수 있습니다. 또한 플랫폼은 도구 사용 정확도와 응답 유사도와 같은 평가 지표를 사용자 정의할 수 있도록 지원하여, 팀이 필요에 정확히 맞춘 평가를 수행할 수 있게 합니다.
자동화나 프로그래밍 방식의 제어를 선호하는 사용자라면, ADK는 명령줄과 코드 기반 평가도 지원합니다. 이를 통해 에이전트 테스트를 일상적인 개발 과정의 일부로 쉽게 포함할 수 있으며 CI/CD 배포. 유연한 구성 파일과 상세한 출력 보고는 실패 사례를 심층적으로 분석할 수 있게 해 주며, 실행 가능한 피드백을 제공합니다.
대화형 도구와 자동화 옵션을 결합함으로써 ADK의 평가 기능은 AI 에이전트를 엄격하게 테스트하고, 결과를 이해 가능하며 감사 가능한 형태로 제공하며, 팀이 에이전트 신뢰성을 추적하고 개선할 수 있는 탄탄한 기반을 마련합니다. Weave와 같은 추적 플랫폼과 함께 사용하면 ADK의 결과를 저장하고, 시각화하고, 시간에 따라 비교할 수 있어 즉각적인 디버깅과 장기적인 품질 보증을 모두 지원합니다.
ADK에서 평가를 실행하면 에이전트 성능을 종합적으로 파악할 수 있도록 여러 핵심 지표가 계산됩니다. 먼저, 도구 사용 정확도는 에이전트가 올바른 도구를 예상된 순서로, 올바른 인자로 호출했는지를 측정합니다. 이 지표는 시스템의 내부 동작이 의도한 워크플로와 얼마나 밀접하게 일치하는지를 반영합니다.
다음으로, 응답 유사도(Response Similarity) 지표는 표준 언어 유사도 지표를 활용하여 에이전트의 최종 응답이 사람이 제공한 기준 답변과 얼마나 가까운지를 평가합니다. 예: ROUGE-1이는 에이전트가 비즈니스 또는 사용자 기대에 부합하는 응답을 생성하고 있는지를 직접적으로 보여줍니다.
일부 구성에서는 ADK가 또한 an을 지원합니다 LLM 기반 일관성 점수다른 대규모 언어 모델이 에이전트의 응답을 전반적인 명확성, 정답성, 논리적 타당성 측면에서 평가하는 방식입니다.
각 지표는 다양한 기준값으로 사용자 지정하거나 필수 조건으로 설정할 수 있어, 내부 작업 실행과 사용자 대상 출력 모두에 대해 명확한 품질 기준을 마련할 수 있습니다. 이러한 정량적 측정치와 ADK의 유연한 설정 및 리포팅 도구를 결합하면, 신속한 에이전트 개발과 지속적인 운영 환경 보증을 위한 핵심 기반이 구축됩니다.
평가 고도화를 위한 W&B Weave 통합
W&B Weave를 ADK와 통합하면 에이전트 평가를 추적, 분석, 시각화하는 강력한 기능을 활용할 수 있습니다. ADK의 기본 평가 프레임워크는 유연한 테스트와 명확하게 정의된 지표를 지원하지만, 결과 시각화를 위한 Weave와의 기본 제공 통합은 포함하지 않습니다. 이를 보완하기 위해, 표준 ADK 워크플로우를 그대로 따르면서도 평가 결과를 자동으로 Weave에 풍부하게 기록하는 맞춤 Evaluator 클래스를 구현했습니다. 소스 코드는 GitHub 리포지토리에서 확인해 보세요. 여기.
이 통합을 사용하면 각 테스트 실행에서 에이전트가 올바른 도구를 사용했는지, 도구 재현율(즉, 필요한 도구 중 실제로 사용된 비율), 그리고 응답의 품질과 정확성에 대한 맞춤형 LLM 기반 판단 등 상세한 지표를 캡처하고 저장합니다. 각 테스트 케이스마다 Weave는 정답 기준 도구와 정답, 에이전트의 출력, LLM 기반 유사도 평가, 그리고 전체 도구 커버리지와 같은 요약 통계를 기록합니다.
Weave에 결과를 저장해 두면 시간 경과에 따른 에이전트 성능을 시각화하고, 실패 사례를 깊이 분석하며, 실험 실행을 비교하고, 에이전트 버전이나 프롬프트 전략별 리더보드를 만들 수 있습니다. 이렇게 촘촘해진 피드백 루프는 로그 검토만으로는 놓치기 쉬운 추세와 미묘한 성능 회귀를 드러내고, 에이전트를 반복 개선하는 과정에서 향상을 추적할 수 있는 단일 신뢰 원천을 제공합니다.
ADK의 엄격한 평가 구조와 Weave의 분석·시각화 도구를 결합하면, 팀은 에이전트 동작에 대한 더 깊은 인사이트를 확보하고 프로토타입에서 프로덕션으로 자신 있게 전환할 수 있습니다.
W&B Weave와 함께 ADK를 사용하는 단계별 튜토리얼
견고한 에이전트 평가 시나리오를 구축하려면 먼저 Google의 Agent Development Kit을 사용해 포괄적이고 실감 나는 보험 에이전트를 구성해야 합니다. 목표는 보험 증권 조회, 청구 진행 상황 추적, 신규 보장 옵션 견적, 자주 묻는 질문 응답 등 다양한 보험 업무와 질의를 처리할 수 있는 최신 고객 지원 시스템을 만드는 것입니다.
실제 백엔드 시스템에 연결하는 대신, 자동차, 건강, 주택, 생명보험 등 여러 도메인의 보험 데이터를 대표하는 정교한 모의 데이터베이스를 만들었습니다. 이 데이터베이스에는 샘플 증권, 청구 건, 보험료 납부 내역, 고객 상담 예약, FAQ 항목, 정비소 위치, 보험 견적이 포함되어 있습니다. 정적 데이터세트를 사용하면 에이전트가 통제되고 반복 가능한 환경에서 핵심 워크플로를 시뮬레이션할 수 있어, 평가와 테스트에 이상적입니다.
제가 에이전트에 사용한 데이터베이스는 다음과 같습니다:
{"policy_lookup": [{"policy_id":"P100001","customer_id":"C20001","type":"Auto","start":"2022-05-01","end":"2023-05-01","coverage":{"liability":50000,"collision":1000,"deductible":500},"exclusions":["rental cars"],"status":"active"},...],"claims_status_checker": [{"claim_id":"CL5001","policy_id":"P100001","date_filed":"2023-04-15","status":"pending","type":"collision","adjuster":"Alex Wu","next_step":"awaiting police report"},...],"coverage_calculator": [{"policy_id":"P100001","option":"raise liability","change":25000,"new_premium":103.50,"new_deductible":500},...],"premium_payment_system": [{"invoice_id":"INV3001","policy_id":"P100001","due_date":"2023-05-05","amount_due":120.00,"status":"unpaid"},...],"appointment_schedule_checker": [{"appointment_id":"A4101","customer_id":"C20001","type":"callback","date":"2023-05-06T10:00:00","status":"scheduled"},...],"faq_search": [{"faq_id":"F001","question":"How can I file a claim?","answer":"You can file a claim online, by phone, or with your agent. Have your policy and event details ready."},...],"find_nearby_repair_shop": [{"shop_id":"R01","name":"AutoFix Pros","zip":"60636","approved":true,"phone":"773-555-1010"},...],"insurance_quote_data": [{"quote_id":"Q3001","customer_id":"C20001","coverage":"auto-basic","premium":109.50,"deductible":500,"valid_until":"2023-06-01"},...],"customer_profile_lookup": [{"customer_id":"C20001","name":"Jane Smith","email":"jsmith@email.com","phone":"555-4410","dob":"1982-03-01"},...]}
에이전트 코드는 다음과 같습니다:
import jsonfrom typing import Any, Dict, List, Optional# ---- Load data ----with open("insurancedata.json", "r", encoding="utf-8") as f:INSURANCE_DATA = json.load(f)def policy_lookup(policy_id: str) -> Optional[Dict[str, Any]]:return next((p for p in INSURANCE_DATA['policy_lookup'] if p['policy_id'] == policy_id), None)def customer_policies(customer_id: str, status: Optional[str] = None) -> List[Dict[str, Any]]:return [p for p in INSURANCE_DATA['policy_lookup']if p['customer_id'] == customer_id and (status is None or p['status'] == status)]def claims_status_checker(policy_id: str, status: Optional[str] = None) -> List[Dict[str, Any]]:return [c for c in INSURANCE_DATA['claims_status_checker']if c['policy_id'] == policy_id and (status is None or c['status'] == status)]def coverage_calculator(policy_id: str, option: Optional[str] = None) -> List[Dict[str, Any]]:return [cc for cc in INSURANCE_DATA['coverage_calculator']if cc['policy_id'] == policy_id and (option is None or cc['option'] == option)]def premium_payment_system(policy_id: str) -> List[Dict[str, Any]]:return [i for i in INSURANCE_DATA['premium_payment_system']if i['policy_id'] == policy_id]def appointment_schedule_checker(customer_id: str) -> List[Dict[str, Any]]:return [a for a in INSURANCE_DATA['appointment_schedule_checker']if a['customer_id'] == customer_id]def faq_search(query: str, topk: int = 1) -> List[Dict[str, Any]]:matches = [f for f in INSURANCE_DATA['faq_search'] if query.lower() in f['question'].lower()]return matches[:topk]def find_nearby_repair_shop(zip_code: str, approved_only: bool = True, topk: int = 3) -> List[Dict[str, Any]]:shops = [s for s in INSURANCE_DATA['find_nearby_repair_shop'] if s['zip'] == zip_code]if approved_only:shops = [s for s in shops if s['approved']]return shops[:topk]def insurance_quote_data(customer_id: str) -> List[Dict[str, Any]]:return [q for q in INSURANCE_DATA['insurance_quote_data']if q['customer_id'] == customer_id]agent_prompt = """policy_lookup(policy_id)# Use when you need all details for a specific policy using its policy_id (such as viewing coverages, start/end, type, etc).print(policy_lookup("P100001"))# Returns:# {'policy_id': 'P100001', 'customer_id': 'C20001', ..., 'status': 'active'}customer_policies(customer_id, status=None)# Use when you want all policies (optionally filtered by status, e.g. 'active') for a given customer_id.print(customer_policies("C20001", status="active"))# Returns:# [{'policy_id': 'P100001', ...}]claims_status_checker(policy_id, status=None)# Use when you need all claims for a given policy. Optionally filter by claim status ('pending', 'approved', etc).print(claims_status_checker("P100001", status="pending"))# Returns:# [{'claim_id': 'CL5001', 'policy_id': 'P100001', 'status': 'pending', ...}]coverage_calculator(policy_id, option=None)# Use when you want to see alternate coverage/premium options for a policy, like how much premium changes if you change something.print(coverage_calculator("P100001"))# Returns:# [{'policy_id': 'P100001', 'option': 'raise liability', 'change': 25000, 'new_premium': 103.50, 'new_deductible': 500}]premium_payment_system(policy_id)# Use when you need to see billing or payment info for a policy (invoices, due dates, amounts).print(premium_payment_system("P100001"))# Returns:# [{'invoice_id': 'INV3001', 'policy_id': 'P100001', 'due_date': '2023-05-05', 'amount_due': 120.00, 'status': 'unpaid'}]appointment_schedule_checker(customer_id)# Use to list all scheduled or completed appointments (like adjuster visits or callbacks) for a customer.print(appointment_schedule_checker("C20001"))# Returns:# [{'appointment_id': 'A4101', 'customer_id': 'C20001', 'type': 'callback', 'date': '2023-05-06T10:00:00', 'status': 'scheduled'}]faq_search(query, topk=1)# Use to look up answers to common insurance questions by keyword.print(faq_search("deductible", topk=2))# Returns:# [{'faq_id': 'F002', 'question': 'What is a deductible?', 'answer': ...},# {'faq_id': 'F007', ...}]find_nearby_repair_shop(zip_code, approved_only=True, topk=3)# Use when you want to find repair shops near a ZIP code, optionally only approved ones. Useful for auto claims.print(find_nearby_repair_shop("60636"))# Returns:# [{'shop_id': 'R01', 'name': 'AutoFix Pros', ...},# {'shop_id': 'R02', ...}]insurance_quote_data(customer_id)# Use when you wish to view all (recent/past) insurance quotes for a customer.print(insurance_quote_data("C20001"))# Returns:# [{'quote_id': 'Q3001', 'customer_id': 'C20001', 'coverage': 'auto-basic', ...}]"""from google.adk.agents import Agentimport os# Configure environment if neededos.environ["GOOGLE_CLOUD_PROJECT"] = "dsports-6ab79"os.environ["GOOGLE_CLOUD_LOCATION"] = "us-central1"os.environ["GOOGLE_GENAI_USE_VERTEXAI"] = "True" # or set as neededroot_agent = Agent(model="gemini-2.5-pro",name="insurance_agent",instruction="""You are an expert insurance assistant. You can answer customer questions and perform insurance-related tasksusing the available tools. For every question, carefully select and use the most relevant tool(s) from your toolkit.Never guess—return only what is found in the database or tools. Here are your tool instructions and usage examples:""" + agent_prompt,description="An insurance assistant that can answer any insurance query using the provided tools.",tools=[policy_lookup,customer_policies,claims_status_checker,coverage_calculator,premium_payment_system,appointment_schedule_checker,faq_search,find_nearby_repair_shop,insurance_quote_data])
에이전트 자체는 프로덕션 환경에서 보험 상담원이 의존하게 될 서로 다른 백엔드 기능·서비스에 대응하는 전문 도구 모음을 사용하도록 구성되어 있습니다. 이 도구에는 증권 ID로 조회, 특정 증권의 모든 청구 이력 조회, 납부 내역 확인, 상담 예약, FAQ 검색 등이 포함됩니다. 각 도구는 모의 데이터베이스에서 직접 동작하므로, 에이전트의 응답이 환각이나 추측이 아니라 기본이 되는 구조화된 데이터에서 항상 도출되도록 보장합니다.
이러한 구성 요소를 갖추면 보험 에이전트는 현실적이면서도 안전하고 관리 가능한 데이터세트를 바탕으로 복잡한 다단계 사용자 요청을 완전히 자율적으로 처리할 수 있습니다. 이 설정은 일관되고 고품질의 에이전트 평가를 위한 토대를 마련하며, 실제 요구사항을 반영하는 방식으로 에이전트 출력의 정답성은 물론 도구 사용의 적절성이나 의사결정 경로의 타당성까지 함께 평가할 수 있게 합니다.
테스트 세트 만들기
보험 에이전트와 모의 환경을 구성한 뒤, ADK 웹 UI를 사용해 초기 테스트 시나리오 10개를 만들었습니다. 이 테스트 예제들은 현실적인 보험 문의와 워크플로의 폭넓은 범위를 포괄하도록 설계되어, 일반적인 경우와 엣지 케이스가 모두 반영되도록 했습니다. 웹 인터페이스를 사용하면 각 세션을 손쉽게 생성하고 관리할 수 있으며, 사용자 입력, 기대되는 에이전트 동작, 그리고 올바른 응답을 생성하기 위해 호출되어야 하는 도구의 순서를 구체적으로 지정할 수 있습니다.
이 테스트들을 만들면서, 에이전트가 필요한 모든 도구를 항상 사용하지 않거나 때때로 의사결정에서 지름길을 택하는 경우가 있음을 종종 발견했습니다.

이러한 상황에서는 보다 명시적인 지시를 단계적으로 추가하고, 프롬프트를 조정하거나, 테스트 케이스 자체를 다듬어 에이전트가 이상적인 해결 경로로 나아가도록 유도했습니다. 이런 실습형 상호작용 평가 과정은 도구 사용상의 미묘한 문제를 발견하고, 각 테스트 케이스가 실제 환경에서의 최적의 작업 완료 방식을 반영하도록 보장하는 데 특히 유용했습니다. 각 질의와 최종 답변 이후에는 ADK UI를 사용해 내 샘플을 eval set 파일에 추가했습니다.
이 빠른 프로토타이핑과 개선의 반복 주기를 통해, 저는 에이전트가 정답을 제시했는지 여부를 확인하는 것은 물론, 그 과정에서 적절한 도구와 추론 단계를 올바르게 사용했는지까지 검증할 수 있는 탄탄한 테스트 케이스 세트를 구축했습니다. 이를 바탕으로 보다 체계적인 평가와 이후의 추가 개선 작업을 진행할 수 있는 기반이 마련되었습니다.
ADK 웹 UI에서 테스트 예제를 반복적으로 다듬는 과정에서, 테스트 케이스 안에 중간 단계의 에이전트 응답과 보조 프롬프트가 여러 개 생기는 경우가 종종 있었습니다. 이러한 메시지들은 테스트를 만드는 동안에는 유용했는데, 에이전트가 도구를 올바르게 사용하고 적절한 추론을 하도록 단계별로 유도할 수 있었기 때문입니다. 그러나 에이전트의 최종 답변과 도구 사용이 정확함을 확인한 이후에는, 이러한 중간 보조 메시지들은 더 이상 필요하지 않을 뿐 아니라 평가 데이터를 오히려 복잡하게 만들 수 있습니다.
평가 데이터세트를 간소화하고 정리하기 위해, 각 테스트 케이스에서 비필수 응답을 체계적으로 제거하는 스크립트를 작성했습니다. 이 스크립트는 각 테스트 예제를 처리하면서 틀린 응답이나 중간 보조 응답을 모두 삭제하고, 원래 사용자 질의, 세션 동안 이루어진 도구 호출의 전체 목록, 그리고 에이전트의 최종 정답만 남깁니다. 각 대화를 이러한 핵심 요소로만 압축함으로써, 가지치기된 평가 세트는 해석이 쉬워지고 신뢰도 높은 자동화 테스트에 더욱 적합해집니다.
import osimport json# HARDCODE your input file here:infile = "/path_to/original_insurance_eval_set.evalset.json"# Create output filename ending with _cleaned.evalset.jsondirname, basename = os.path.split(infile)if basename.endswith('evalset.json'):core = basename[:-len('evalset.json')].rstrip('.-_')outbase = f"{core}_cleaned.evalset.json"else:core = os.path.splitext(basename)[0]outbase = f"{core}_cleaned.evalset.json"outfile = os.path.join(dirname, outbase)with open(infile, "r", encoding="utf-8") as f:data = json.load(f)for case in data.get("eval_cases", []):conv = case.get("conversation", [])if not conv:continue# Collect all tool_uses for this casemerged_tool_uses = []for turn in conv:merged_tool_uses.extend(turn.get("intermediate_data", {}).get("tool_uses", []))# Extract first user message and last model responsefirst = conv[0]last = conv[-1]# Build new single-turn conversation:# user_content from first, final_response from last, new intermediate_datanew_turn = {"invocation_id": last.get("invocation_id", first.get("invocation_id")),"user_content": first.get("user_content", {}),"final_response": last.get("final_response", {}),"intermediate_data": {"tool_uses": merged_tool_uses,"intermediate_responses": []},"creation_timestamp": last.get("creation_timestamp", first.get("creation_timestamp"))}case["conversation"] = [new_turn]with open(outfile, "w", encoding="utf-8") as f:json.dump(data, f, indent=2, ensure_ascii=False)print(f'Pruned/cleaned eval set written as: {outfile}')
이후 처리 단계는 평가 데이터가 테스트 작성과 문제 해결 과정에서 유입된 모든 산물을 제거하고, 핵심에 집중하면서 정확성을 유지하도록 보장합니다. 그 결과 정리된 eval 세트는 에이전트의 지속적 평가, 지속적 통합 워크플로, 일관된 벤치마킹을 위한 탄탄한 기반을 제공합니다.
후처리 스크립트를 실행한 뒤의 이전 예시는 다음과 같습니다:

이 테스트 세트를 만든 뒤에는 ADK 웹 UI의 평가 탭으로 이동해 실행해 보고 싶은 테스트 케이스를 선택하고, 별도의 코드를 작성하지 않고도 웹 UI에서 바로 실행할 수 있습니다.

ADK 웹 UI는 테스트 결과를 실행하고 시각적으로 확인할 수 있는 편리한 ‘노코드’ 환경을 제공하지만, 저는 에이전트 응답의 채점 방식을 더 세밀하게 제어하고 싶었습니다. 특히 보험 도메인의 미묘한 특성을 보다 정확하게 평가할 수 있는 맞춤 채점 로직을 구현하고자 했으며, 평가 추적과 시각화를 위해 Weave도 활용하려 했습니다. 이렇게 하면 누락된 도구 호출이 무엇인지 같은 지표를 쉽게 확인하고, 모델 출력과 정답을 직접 비교하며, 다수의 실행 전반에서 패턴이나 실패 양상을 시각적으로 탐색할 수 있습니다.
이를 위해 제 사용 사례에 맞춰 설계된 새로운 Evaluator 클래스를 구축하기로 결정했습니다. 이 Evaluator는 LLM 기반의 의미적 검사와 도구 사용 분석을 함께 활용해 각 테스트 케이스를 채점할 뿐 아니라, 각 예측과 그에 연관된 지표를 Weave에 로깅합니다. 맞춤 평가 파이프라인을 Weave와 통합함으로써, 저는 성능 추세를 쉽게 모니터링하고, 특정 오류 사례를 탐색하며, 서로 다른 빌드나 프롬프트 구성 전반에서 에이전트의 동작을 비교할 수 있는 대화형 대시보드를 생성합니다.이 접근 방식은 평가 과정에서 완전한 유연성과 투명성을 보장하여, 전통적인 테스트의 합격/불합격 요약으로는 제공하기 어려운 수준의 엄격한 모델 개선을 지원합니다. 이 Evaluator를 사용하고 싶다면, 제가 만든 리포지토리를 자유롭게 클론해 사용하셔도 됩니다. 여기.
제가 개발한 맞춤 로직으로 보험 에이전트를 평가하기 위해, 새로운 Evaluator 클래스를 임포트해 정제된 테스트 세트에서 에이전트를 채점하는 간단한 평가 스크립트를 만들었습니다. 이 스크립트는 유연성을 염두에 두고 설계되어, 단독 실행은 물론 pytest 같은 자동화된 테스트 워크플로와의 손쉬운 통합도 지원합니다.
평가 스크립트는 환경 변수를 로드하고 제 LiteAgentEvaluator를 불러온 뒤, 평가 세트의 각 테스트 케이스에 대해 에이전트를 실행합니다. 설정을 통해 use_weave=True, 평가 결과와 핵심 지표는 이후 분석과 시각화를 위해 자동으로 Weave에 로깅됩니다. 이 방식은 각 에이전트 응답의 최종 정확도뿐 아니라, 도구 사용의 정확성과 외부 LLM이 판단한 의미적 유사도 같은 더 깊은 세부 사항까지 추적할 수 있게 해줍니다.
이 평가 루프를 실행하면 선별된 보험 워크플로 세트에서 에이전트의 역량을 상세하고 일관되게 채점할 수 있습니다. 모듈형 스크립트 구조 덕분에 스위트를 확장하거나, 정기 점검을 자동화하거나, 개발이 진행되는 동안 다양한 에이전트 구성 간의 비교를 수행하기도 쉽습니다. 그 결과, 에이전트의 품질을 측정하고 개선 과정 전반에서 실행 가능한 인사이트를 도출할 수 있는 신뢰할 수 있고 감사 가능한 워크플로가 마련됩니다.
평가에 사용할 코드는 다음과 같습니다:
import dotenvimport pytestfrom google.adk.evaluation.agent_evaluator import AgentEvaluatorfrom lite_custom_evaluator import LiteAgentEvaluator # see the github repo for this scriptpytest_plugins = ("pytest_asyncio",)use_weave = True # Set to True to use LiteAgentEvaluator (with weave), or False to use AgentEvaluator@pytest.fixture(scope="session", autouse=True)def load_env():dotenv.load_dotenv()@pytest.mark.asyncioasync def test_all():"""Test the agent's basic ability on a few examples."""agent_name = "seq_agent"eval_path = "/Users/brettyoung/Desktop/dev25/tutorials/adk/adk-samples/python/agents/seq_agent/seq_agent/insurance_eval_set_cleaned.evalset.json"if use_weave:await LiteAgentEvaluator.evaluate(agent_name,eval_path,num_runs=2,use_weave=True)else:await AgentEvaluator.evaluate(agent_name,eval_path,num_runs=2)
다음 명령어로 평가를 실행할 수 있습니다:
python -m pytest -s eval
평가 스크립트 실행이 완료되면 Weave 대시보드를 열어 평가 결과를 자세히 탐색할 수 있습니다. Weave는 에이전트의 총점만 제공하는 것을 넘어 더 많은 기능을 제공합니다. 최종 평가 지표는 물론 각 테스트 케이스별 세부 사항까지 심층적으로 확인할 수 있는 포괄적이고 인터랙티브한 인터페이스를 제공합니다.
Weave 내부에서는 테스트 중 에이전트가 생성한 모든 모델 응답을 항목별로 확인할 수 있습니다. 각 예제마다 에이전트의 실제 출력, 수행된 모든 도구 호출, 그리고 이것들이 기대하는 정답(ground truth)과 어떻게 비교되는지가 표시됩니다. 개별 응답 점수는 명확하게 제시되며, 필수 도구가 모두 사용되었는지, LLM 채점 기준에 따라 출력이 정답과 얼마나 가깝게 일치하는지, 그리고 추적된 기타 사용자 정의 지표 등이 포함됩니다.
이 수준의 인사이트를 통해 반복적으로 발생하는 문제를 빠르게 파악하고, 에이전트의 강점과 약점을 이해하며, 추가 개선이 필요한 지점을 정확히 특정할 수 있습니다. 오류를 특정 범주로 손쉽게 필터링해 집중하고, 문제 사례를 조사하며, 여러 차례의 평가 실행에 걸쳐 진행 상황을 추적할 수 있습니다. Weave의 강력한 시각화 도구를 사용하면, 원시 평가 데이터를 에이전트의 지속적 개발과 정교화를 뒷받침하는 의미 있는 피드백으로 전환할 수 있습니다.
다음은 Weave 내부에서 평가 결과를 보여주는 몇 가지 스크린샷입니다:


Weave 내부에서는 평가 인터페이스가 테스트 케이스별로 결과를 분해해 보여 주며, 각 쿼리를 에이전트의 도구 사용 내역, 출력, 연관된 지표와 함께 상세히 확인할 수 있습니다.
각 행은 입력, 예상되는 도구(gt_tools), 그리고 에이전트가 실제로 사용한 도구(agent_tools). 특정 예제를 선택하면 오른쪽 패널이 확장되어 원본 입력, 에이전트가 수행한 모든 도구 호출, 그리고 예상되는 도구 사용과의 비교가 전체 상세로 표시됩니다.
다음과 같은 지표 llm_correctness, tool_correctness, 그리고 tool_recall 각 케이스별로 명확히 표시되어 무엇이 잘되었고 무엇이 잘못되었는지 즉시 파악할 수 있습니다. 선택된 예제에서는 모든 도구가 올바르게 사용되었고 출력도 정확하여 전 항목에서 만점을 받았습니다. 이러한 예제별 평가는 주의가 필요한 엣지 케이스나 반복되는 실패 패턴을 쉽게 식별할 수 있게 해줍니다.
이처럼 세밀한 수준의 가시성을 통해 Weave는 평가를 에이전트의 행동을 탐색할 수 있는 로그로 전환하여, 시간에 걸쳐 필터링하고 검색하며 비교할 수 있게 합니다. 이를 통해 총점뿐 아니라 그 점수의 구체적 이유까지 파악할 수 있어, 반복적인 디버깅과 최적화에 대한 명확한 방향을 제공합니다.
결론
보험과 같은 복잡한 도메인에서 AI 에이전트를 평가하려면 표준 소프트웨어 테스트보다 훨씬 더 정교한 접근이 필요합니다. Agent Development Kit을 사용하면 팀은 현실적인 환경을 만들고, 세밀한 테스트 세트를 정의하며, 에이전트가 각 단계에서 어떻게 추론하고 도구를 사용하며 출력을 내는지 정밀하게 추적할 수 있습니다. ADK의 구조화된 평가 기능에 Weave의 강력한 분석과 시각화를 결합하면, 조직은 단순한 정답 여부 확인을 넘어 지속적이고 데이터 기반의 개선 문화를 구축할 수 있습니다.
ADK와 Weave의 조합을 사용하면 에이전트가 정답을 산출하는지뿐만 아니라 올바르게 추론하는지, 적절한 워크플로를 활용하는지, 그리고 규제 및 비즈니스 표준을 준수하는지도 모니터링할 수 있습니다. 에이전트가 수행하는 각 단계에 대한 세밀한 가시성을 확보하고, 전체적인 추세와 개선이 필요한 구체적 영역을 드러내는 명확한 지표도 함께 얻을 수 있습니다. 이를 통해 개발 팀은 문제를 조기에 포착하고, 각 업데이트마다 실제 성과를 측정하며, AI 기반 워크플로를 배포하는 데 대한 신뢰를 유지할 수 있습니다.
궁극적으로 엄격하고 투명한 평가 프로세스를 마련하면 AI 에이전트의 신뢰성, 안정성, 그리고 프로덕션 준비 상태를 보장할 수 있습니다. ADK와 Weave 같은 도구를 함께 사용하면 개발을 가속화하고, 새로운 과제에 신속히 대응하며, 오늘날의 복잡하고 규제가 많은 산업이 요구하는 높은 수준의 품질을 제공할 수 있습니다.
Add a comment