우리 에이전트가 영업팀에 회사가 '공격적으로 채용 중'이라고 보고했는데, 알고 보니 7월에 직원의 절반을 해고한 상태였음
my agent told our sales team a company was "hiring aggressively". they had laid off half their staff in july
핵심 요약
AI 에이전트의 환각 현상을 프롬프트 엔지니어링이 아닌, 도구 단계의 데이터 검증(sanity check)으로 해결한 경험담.
- 환각 현상 원인 — 모델이 쿠키 배너나 빈 페이지를 실제 콘텐츠로 오인함
- 데이터 검증 도입 — 모델에 데이터를 넘기기 전 도구 수준에서 필터링 수행
- 프롬프트 개선의 한계 — 프롬프트 수정보다 데이터 품질 관리가 훨씬 효과적임
- 향후 과제 — 필터링 로직의 세분화 및 모순되는 정보 발견 시 인간 검토 전환
우리 영업팀을 위해 리서치 에이전트를 하나 만들었어. 간단한 거야. 회사 리스트를 주면 사이트를 긁어서 관련 정보를 찾고, 뉴스를 읽은 다음 연락할 가치가 있는지 판단하는 거지. 근데 한 달 정도는 이 에이전트가 계속 환각 증상을 일으키더라고. 가격 정보를 틀리게 적거나, 1년 전에 단종된 제품을 팔고 있다고 하질 않나. 특히 가관이었던 건, 7월에 직원 50%를 해고한 회사를 보고 공격적으로 채용 중이라고 추천하더라니까.
당연히 모델 문제라고 생각했지. 모델을 두 번이나 교체하고, 시스템 프롬프트도 수십 번 수정했어(나중엔 몇 번 바꿨는지 세는 것도 포기함). 검증 단계도 넣어보고, 리플렉션 루프도 돌려보고, 심지어 리플렉션 루프를 하나 더 추가하기도 했어(첫 번째 건 아무짝에도 쓸모없었는데 그때는 몰랐지). 모델이 내놓는 메모는 점점 길어지고 상세해지고 자신감도 넘치는데, 내용은 여전히 개판이었어. 나중에는 에이전트가 자기 작업 검사하게 시키는 비용이 그냥 사람이 직접 리서치하는 비용보다 더 많이 나오더라.
결국 해결책은 의외로 간단했어. 툴이 뱉어내는 원본 데이터를 로그로 남기기 시작했거든. 모델이 다음에 그 데이터를 쓸 때 대체 뭘 보고 판단하는지 확인하려고 말이야. 보니까 모델은 그냥 정상적으로 작동하고 있었던 거야. 쿠키 배너, 옛날 캐시 페이지, 텅 빈 리액트 라우트 같은 걸 진짜 콘텐츠인 줄 알고 열심히 추론하고 있었던 거지. 빈 문자열을 던져줘도 그게 빈 건지 모르고, 그럴싸한 답변을 지어내서 넘어가 버린 거야.
웹 검색 부분은 contextdev가 이미 어느 정도 처리를 해줘서 제일 쉽게 해결했어. 그 툴로 갈아타는 건 일도 아니었지. API도 훨씬 깔끔하고, 페이지가 안 바뀌었을 때만 캐시를 하니까 옛날 채용 페이지를 긁어오는 문제도 해결됐고. 문서 쪽은 좀 까다로웠지만 결국 같은 방식으로 해결했어. 뉴스 검색이나 CRM API는 결정론적 테스트를 짜기가 훨씬 어렵긴 한데, 어쨌든 에이전트한테 잘못된 데이터를 먹이던 놈들이라 다 손을 봤지.
결과적으로 지금은 모델한테 정보를 넘기기 전에 모든 툴에 대해 '상식적인 수준의 검사(sanity check)'를 수행해. 툴이 빈 응답을 보내거나, 일주일 넘은 페이지를 가져오거나, 로그인 화면 같은 게 뜨면 에이전트한테 바로 알려줘서 알아서 처리하게 만들었어. 이거 구현하는 데 딱 3시간 걸리더라. 한 달 동안 프롬프트 붙잡고 씨름했던 것보다 이 작은 수정 하나가 훨씬 효과적이었어.
이제 이게 어디에 들어가야 할지 고민이야. 친구 놈은 모델이 쓰레기 데이터도 다 보고 알아서 걸러내는 법을 배워야 한다고 주장하는데, 난 우리가 프롬프트 엔지니어링에 시간과 돈을 낭비하게 된 주범이 바로 그거라고 보거든. 너는 이런 상식적인 검사 로직을 어디에 넣어야 한다고 봐? 필터링하는 쪽이야, 아니면 프롬프트를 계속 수정하는 쪽이야? 만약 필터링이라면, 어떤 것들을 체크할 거야? 내가 놓치고 있는 예외 상황들이 분명히 있을 것 같거든.


