LangGraph 에이전트를 배포하기 전에 어떻게 테스트하시나요? 지난주에 올렸던 문제 해결 중입니다
How are you testing LangGraph agents before shipping? Still trying to fix the thing I posted about last week
핵심 요약
LangGraph 에이전트의 비결정적 특성으로 인한 테스트의 어려움과 실무적인 검증 전략을 공유하고 조언을 구하는 글입니다.
- 테스트의 어려움 — 에이전트의 비결정적 출력과 모호한 정답 기준으로 인해 기존 단위 테스트 적용이 힘듦
- 현재 검증 방식 — 도구 및 라우팅 단위 테스트와 30개의 핵심 프로덕션 입력 세트를 활용한 회귀 테스트 수행
- 평가 전략 — LLM-as-a-judge를 사용하지만 신뢰도가 낮아 보조적인 수단으로 활용 중
- 디버깅 방식 — Langfuse 추적을 통해 점수가 낮은 노드를 식별하고 원인을 분석함
내 스택 질문에 대한 후속 글이야. 평가(eval) 쪽을 어떻게 처리했냐고 물어보는 사람들이 좀 있어서 솔직히 말하자면, 아직도 삽질 중임.
현재 상황 요약하자면: 트레이싱은 self-hosted Langfuse 쓰고, 프롬프트는 여전히 git으로 관리 중. 평가는 ragas에다가 간단한 커스텀 저지(gpt-4o-mini) 붙여서 돌리는 중인데, 모든 프로덕션 트레이스에 제대로 된 저지를 돌리려니까 비용이 감당이 안 되더라고. 저번에 내가 원했던 건 프롬프트 수정했을 때 일일이 수동으로 태깅 안 해도 평가 점수 꼬라박는 걸 바로 알아채는 방법이었음. 일주일 동안 이것저것 건드려봤는데, 의견만 생겼지 제대로 된 해결책은 못 찾아서 다시 질문 올린다.
계속 골치 아픈 건 일반적인 테스트는 '같은 입력에 같은 출력'을 전제로 한다는 거야. 근데 에이전트는 안 그렇잖아. 같은 입력 넣어도 유효한 답변이 세 개씩 튀어나오고, 애초에 뭐가 '정답'인지도 반은 애매함. 그래서 평소 하던 단위 테스트 방식이 아예 안 먹히고, 결국 몇 번 돌려보고 눈대중으로 확인하는 짓만 반복 중인데 이건 전략이라고 부를 수도 없음.
지금 실제로 돌아가는 건 이거임: 툴이랑 라우팅 쪽은 단위 테스트 돌리는데, 이건 일반 코드랑 똑같이 작동해서 문제없음. 그리고 프롬프트 바꾸거나 모델 갈아끼울 때 돌려보는 실제 프로덕션 입력 데이터 30개 정도를 따로 저장해뒀는데, 여기서 점수 변동 있는지 확인하는 게 제일 효과 좋음. 저렴한 저지가 "이 답변 괜찮음?" 같은 애매한 판단을 해주긴 하는데, 100% 믿을 건 못 됨. 자신감 있게 말하는데 내용은 은근히 틀린 답변에 자꾸 점수를 잘 주거든.
트레이스 레이어가 드디어 빛을 발한 지점은 이거임: 평가 점수를 특정 실행이랑 연결해놔서, 점수 낮게 나오면 바로 트레이스 열어서 어느 노드에서 맛이 갔는지 확인할 수 있음. 그냥 숫자 떨어지는 거 보는 것보단 훨씬 낫지. 내가 원했던 '프롬프트 수정 후 점수 하락 감지'에 가장 근접하긴 했는데, 여전히 수동 작업이 너무 많음.
아직도 해결 못 한 건 이거임: 내 30개 입력 데이터에 없는 실패 케이스들. 이 데이터셋은 이미 한 번 터졌던 것들만 모아놓은 거라, 새로 터지는 이상한 문제들은 프로덕션에서 먼저 맞고 나서야 테스트 케이스로 추가됨.
그래서 저번이랑 똑같은 질문인데 좀 더 좁혀서 물어볼게. 다들 배포하기 전에 테스트 어떻게 함? 엔드 투 엔드로 함, 아니면 노드별로 함? 그리고 LLM-as-judge를 배포 게이트로 쓸 만큼 진짜로 믿는 사람 있음? 난 아직 못 믿겠거든.

