Skip to main content
검색 증강 생성(Retrieval Augmented Generation, RAG)은 맞춤형 지식 베이스에 액세스하는 생성형 AI 애플리케이션을 구축할 때 흔히 사용하는 방법입니다. 이 튜토리얼에서는 RAG 애플리케이션을 구축한 다음, Weave로 검색 step을 추적하고 LLM 평가자로 응답을 평가하는 과정을 안내합니다. 이를 통해 애플리케이션이 반환하는 답변의 품질을 측정하고 개선할 수 있습니다. 이 가이드는 RAG 애플리케이션을 개발하면서 파이프라인에 관측성과 체계적인 평가를 도입하려는 개발자를 위한 것입니다. Evals 히어로 이미지

학습 내용

이 가이드에서는 다음 방법을 설명합니다.
  • 지식 베이스 구축하기
  • 관련 문서를 찾는 검색 step이 포함된 RAG 애플리케이션 만들기
  • Weave로 검색 step 추적하기
  • LLM 평가자로 RAG 애플리케이션을 평가하여 컨텍스트 정밀도 측정하기
  • 맞춤형 점수화 함수 정의하기

사전 요구 사항

  • CoreWeave Forge 계정
  • Python 3.10 이상 또는 Node.js 18 이상
  • 필수 패키지 설치:
    • Python: pip install weave openai
    • TypeScript: npm install weave openai
  • 환경 변수로 설정된 OpenAI API 키

지식 베이스 구축하기

지식 베이스는 RAG 애플리케이션이 쿼리 시점에 검색하는 말뭉치입니다. 이 섹션에서는 소수의 아티클에 대한 벡터 임베딩을 계산해 두고, 이후 주어진 질문과 가장 관련성이 높은 아티클을 검색할 수 있도록 합니다. 먼저 아티클의 임베딩을 계산합니다. 보통은 이 작업을 한 번만 수행한 뒤 임베딩과 메타데이터를 데이터베이스에 저장하지만, 여기서는 간단하게 하기 위해 스크립트가 실행될 때마다 계산합니다.

RAG 앱 만들기

지식 베이스가 준비되었으니 이제 RAG 애플리케이션을 구축해 보겠습니다. 이 섹션에서는 검색 step과 LLM Call을 결합하고, 두 단계를 모두 Weave로 래핑하여 모든 입력과 출력이 자동으로 추적되도록 합니다. 다음으로, 검색 함수 get_most_relevant_document를 weave.op() 데코레이터로 래핑하고 Model 클래스를 만드세요. 검색 함수를 weave.op()로 래핑하면 Weave가 호출될 때마다 입력과 출력을 캡처하므로, 나중에 검색 step을 확인할 수 있습니다. weave.init('<team-name>/rag-quickstart')를 호출하면 함수의 모든 입력과 출력이 추적되기 시작하며, 이를 나중에 확인할 수 있습니다. 팀 이름을 지정하지 않으면 Weave는 출력을 W&B 기본 팀 또는 entity에 기록합니다.

LLM 평가자로 평가하기

이제 RAG 애플리케이션이 실행되고 Weave로 추적되고 있으니, 다음 단계는 애플리케이션이 질문에 얼마나 잘 답변하는지 평가하는 것입니다. 이 섹션에서는 LLM을 자동 평가자로 활용해 레이블을 직접 작성하지 않고도 애플리케이션의 응답에 점수를 매기는 방법을 설명합니다. 애플리케이션을 평가할 단순한 방법이 없다면 LLM을 사용해 애플리케이션의 여러 측면을 평가할 수 있습니다. 다음은 LLM 평가자에게 주어진 답변을 도출하는 데 컨텍스트가 유용했는지 확인하도록 프롬프트를 제공해 컨텍스트 정밀도(context precision)를 측정하는 예시입니다. 이 프롬프트는 널리 사용되는 RAGAS 프레임워크의 프롬프트를 보강한 것입니다.

점수화 함수 정의하기

Evaluation 파이프라인 구축 튜토리얼에서와 마찬가지로, 앱을 테스트할 예제 행 세트와 점수화 함수를 정의합니다. 점수화 함수는 행 하나를 받아 평가합니다. 입력 인수는 행의 해당 키와 일치해야 하므로, 여기서 question은 행 딕셔너리에서 가져옵니다. output은 모델의 출력입니다. 모델의 입력도 입력 인수에 따라 예제에서 가져오므로, 여기서도 question이 사용됩니다. 이 예제에서는 함수가 병렬로 실행되도록 async 함수를 사용합니다. async를 간단히 알아보려면 Python asyncio 문서를 참조하세요.

선택: Scorer 클래스 정의하기

이전 섹션의 점수화 함수는 단순한 경우에 적합하지만, 여러 평가에서 동일한 평가자를 재사용하거나 점수 집계 방식을 사용자 지정하려면 Scorer 클래스를 사용하는 것이 좋습니다. 다음 단계에서는 이 클래스가 필요한 경우와 정의하는 방법을 설명합니다. 애플리케이션에 따라 맞춤형 평가 클래스(예: 채팅 모델, 프롬프트 등의 매개변수를 갖는 표준화된 LLMJudge 클래스)나 행별 맞춤형 점수화, 집계 점수의 맞춤형 계산이 필요할 수 있습니다. Weave는 바로 사용할 수 있는 Scorer 클래스 목록을 제공하며, 맞춤형 Scorer도 쉽게 만들 수 있습니다. 다음 예시는 맞춤형 class CorrectnessLLMJudge(Scorer)를 만드는 방법을 보여 줍니다. 맞춤형 Scorer를 만드는 단계는 대략 다음과 같습니다.
  1. weave.flow.scorer.Scorer를 상속하는 맞춤형 클래스를 정의합니다.
  2. score 함수를 재정의하고, 함수의 모든 호출을 추적하려면 @weave.op()를 추가합니다.
    • 이 함수에는 모델의 예측이 전달되는 output 인수를 정의해야 합니다. 모델이 “None”을 반환할 수 있으므로 Optional[dict] 유형으로 정의하세요.
    • 나머지 인수는 일반적인 Any 또는 dict로 정의하거나, weave.Evaluate 클래스로 모델을 평가할 때 사용하는 데이터셋의 특정 열을 선택하도록 정의할 수 있습니다. 이러한 인수의 이름은 열 이름과 정확히 일치해야 하며, preprocess_model_input을 사용하는 경우에는 이 함수를 거친 단일 행의 키와 정확히 일치해야 합니다.
  3. 선택: 집계 점수 계산 방식을 사용자 지정하려면 summarize 함수를 재정의합니다. 맞춤형 함수를 정의하지 않으면 Weave는 기본적으로 weave.flow.scorer.auto_summarize 함수를 사용합니다.
    • 이 함수에는 @weave.op() 데코레이터를 지정해야 합니다.
이를 Scorer로 사용하려면 다음과 같이 초기화한 다음 Evaluation의 scorers 인수에 전달하세요.

전체 통합하기

이 섹션에서는 앞선 단계의 모든 내용을 하나의 엔드투엔드 예시로 통합합니다. 이를 통해 각 구성 요소가 어떻게 맞물리는지 확인하고, 여러분의 RAG 애플리케이션에 맞게 응용할 수 있습니다. 여러분의 RAG 앱에서도 동일한 결과를 얻으려면 다음을 수행하세요.
  • LLM Call과 검색 step 함수를 weave.op()로 래핑하세요.
  • 선택: predict 함수와 앱 세부 정보를 포함하는 Model 서브클래스를 만드세요.
  • 평가할 예시를 수집하세요.
  • 예시 하나에 점수를 매기는 점수화 함수를 만드세요.
  • Evaluation 클래스를 사용하여 예시에 대한 평가를 실행하세요.
참고: Evaluation을 비동기로 실행하면 OpenAI, Anthropic 등의 모델에서 요청 속도 제한이 트리거되는 경우가 있습니다. 이를 방지하려면 환경 변수를 설정하여 병렬 워커 수를 제한하세요(예: WEAVE_PARALLELISM=3). 전체 코드는 다음과 같습니다.

결론

이 튜토리얼에서는 이 예제의 검색 step처럼 애플리케이션의 여러 단계에 관측성을 구축하는 방법을 살펴보았습니다. 또한 LLM 평가자처럼 더 복잡한 점수화 함수를 구축해 애플리케이션 응답을 자동으로 평가하는 방법도 알아보았습니다.
마지막 수정일 2026년 9월 30일