1. 스프레드시트 관리의 한계와 새로운 필요성
Rails 애플리케이션에 AI 기능을 통합할 때 개발자는 모델 선택, 프롬프트 구조, 비용 효율성 등 수많은 선택지에 직면합니다. 초기에는 스프레드시트를 이용해 이를 관리하지만, 협업 과정에서 복사본이 생성되며 진실의 원천이 파편화되는 문제가 발생합니다. 또한, 프롬프트가 실제 소스 코드와 분리되어 있어 코드 수정 시 프롬프트가 동기화되지 않는 ‘프롬프트 드리프트’ 현상이 빈번해집니다. 이를 극복하기 위해 프롬프트 설정과 평가 데이터셋을 Rails 앱 내부에서 직접 결합하여 관리할 수 있는 도구가 필요해졌습니다.
2. RubyLLM::Evals의 핵심 구조: Prompts와 Samples
RubyLLM::Evals는 Rails 엔진으로서 두 가지 핵심 개념을 중심으로 작동합니다. - Prompts: 제공자(Provider), 모델, 시스템 지침, Liquid 템플릿 기반의 메시지, 도구(Tools), 그리고 출력 스키마를 포함하는 전체 구성을 캡처합니다. - Samples: 개별 테스트 케이스를 정의하며, 정확도 검증을 위한 다양한 평가 유형을 제공합니다. 이러한 구조를 통해 개발자는 애플리케이션 내에 존재하는 기존 도구나 스키마를 프롬프트 구성에 재사용할 수 있는 이점을 누릴 수 있습니다.
3. 유연한 평가 방식과 LLM-as-judge
평가 유형으로는 정확한 일치(Exact Match), 포함 여부(Contains), 정규표현식(Regex) 외에도 LLM-as-judge와 인간 평가(Human Judge)를 지원합니다. 특히 요약이나 복잡한 분류 작업처럼 정답이 정해져 있지 않은 경우, 다른 모델을 판독관으로 사용하는 LLM-as-judge 방식이 매우 유용하며, 이는 인간의 검토를 보완하는 실용적인 대안이 됩니다.
4. 실제 운영 데이터와의 통합 및 워크플로우
가장 큰 차별점은 Rails의 ActiveStorage 등을 통해 실제 운영 데이터를 샘플로 즉시 활용할 수 있다는 점입니다.
- 데이터 활용: Image.uncategorized와 같은 실제 모델 데이터를 불러와 평가 샘플로 생성할 수 있습니다.
- 비교 분석: 각 실행(Run)마다 정확도, 비용, 소요 시간이 기록되며, 비교 도구를 통해 설정 변경에 따른 성능 변화를 직관적으로 파악할 수 있습니다.
- 운영 적용: 검증된 프롬프트는 데이터베이스에 저장된 설정을 기반으로 RubyLLM::Evals::Prompt.execute 명령어를 통해 운영 환경에서 즉시 실행 가능합니다.
5. 지속적인 모니터링과 프롬프트의 생명주기
프롬프트는 한 번 작성하면 끝나는 것이 아닙니다. 모델의 업데이트나 사용자 데이터 패턴의 변화에 따라 성능이 저하되거나 비용이 급증할 수 있습니다. RubyLLM::Evals와 함께 제공되는 Monitoring 도구를 활용하면 운영 중 발생하는 이슈를 감지하고, 문제가 된 사례를 다시 평가 샘플로 추가하여 프롬프트를 개선하는 선순환 구조를 구축할 수 있습니다.