MR Eval Gate
MR Eval Gate
머지 리퀘스트(MR)를 평가 회귀(regression) 기준으로 게이트하는 기능이에요. 준비된 머지 리퀘스트로 설정하거나 직접 수동으로 설정할 수 있어요.
MR Eval Gate는 매 머지 리퀘스트마다 고정된 데이터셋으로 LLM 앱을 실행하고, 메트릭 컬렉션으로 결과를 채점한 뒤 GitLab 커밋 상태(commit status) (머지 리퀘스트에는 노트 포함)를 게시해요. 메트릭 점수가 대상 브랜치 대비 회귀했는지(설정한 허용 오차 범위 안에서)에 따라 통과, 실패, 또는 중립(neutral) 으로 표시돼요.
이를 위해 프로젝트에 두 가지가 필요해요:
.gitlab-ci.yml— Confident가 제공하는 CI/CD 컴포넌트를 포함해서, 앱(Python + 의존성)을 준비하고 매 머지 리퀘스트마다 게이트를 실행해요.confident_eval.py— 앱을 호출해 그 출력을 문자열로 반환하는run(input)함수예요. Confident는 데이터셋의 골든(golden)마다 이 함수를 한 번씩 호출해요.
어느 쪽이든 GitLab 계정 연결이 필요해요 — 매 머지 리퀘스트마다 커밋 상태와 MR 노트를 게시하기 때문이에요. 아래 설정 옵션은 그 두 파일을 프로젝트에 어떻게 추가하느냐만 달라져요.
출처: 문서
본문
게이트 구성 (Configure the gate)
GitLab 연결 및 구성 (Connect GitLab and configure)
설정 (Settings) → 통합 (Integrations) → MR Eval Gate 로 이동해서 GitLab을 연결하고, 프로젝트, 데이터셋, 메트릭 컬렉션, 회귀 허용 오차(regression tolerance)(게이트가 실패하기 전에 메트릭당 허용되는 최대 평균 점수 하락)를 선택한 뒤 Save 를 클릭해요.
Confident Cloud vs. 셀프 호스팅에서의 연결. Confident Cloud에서는 GitLab OAuth로 한 번의 클릭으로 연결해요 — GitLab으로 리다이렉트되어
api스코프를 부여한 뒤 프로젝트를 고르게 돼요. 셀프 호스팅 Confident 배포에서는 OAuth를 쓸 수 없기 때문에, 대신api스코프를 가진 GitLab 개인 액세스 토큰(personal access token) 을 붙여넣어요. 어느 쪽이든 프로젝트의 Maintainer여야 하는데(CI/CD 변수 관리에 필요), Maintainer 권한이 있는 프로젝트만 선택기에 표시돼요.
설정 머지 리퀘스트 열기 (Open the setup merge request)
Open setup merge request 를 클릭해요. 저장은 설정을 저장할 뿐이고, 이 단계가 두 파일을 프로젝트에 연결하고 CONFIDENT_API_KEY CI/CD 변수를 자동으로 추가해 줘요.
설정 방법 (Setup methods)
설정 머지 리퀘스트 (Setup merge request)
Confident가 CI/CD 컴포넌트 include와 confident_eval.py 스텁(stub)을 추가하는 머지 리퀘스트를 열어요 — AI가 코드를 읽지 않아요. 머지하기 전에 run()을 채우고 컴포넌트 입력을 조정하면 돼요.
완전 수동 (Fully manual)
두 파일(그리고 CI/CD 변수)을 직접 추가해요. Confident는 머지 리퀘스트를 열지 않고 — 연결은 커밋 상태와 노트만 게시해요. 아래 단계를 따라 하면 돼요.
직접 설정하기 (Set it up yourself)
Confident가 머지 리퀘스트를 열지 않게 하고 싶다면, 모든 것을 직접 추가할 수 있어요. 가장 폐쇄적인 옵션이고, API 키 변수도 직접 추가해요.
CI/CD 컴포넌트 포함 (Include the CI/CD component)
.gitlab-ci.yml 에 Confident의 컴포넌트를 추가해요. 앱의 런타임에 맞게 image와 install_command를 설정해요.
include:
- component: gitlab.com/confident-ai/eval-gate/eval-gate@v1
inputs:
base_url: "<your-region-api-base-url>"
dataset_alias: "<your-dataset-alias>"
dataset_version: "latest"
image: "python:3.12" # match your app's runtime
install_command: "pip install -r requirements.txt" # match your project (poetry/uv/etc.)
base_url은 리전에 따라 달라져요: 미국은https://api.confident-ai.com, EU는https://eu.api.confident-ai.com을 사용해요. 게이트를 구성한 데이터셋에dataset_alias(그리고 선택적으로dataset_version)를 설정해요.
평가 콜백 추가 (Add the eval callback)
저장소 루트에 confident_eval.py를 만들어요. run(input)은 데이터셋 입력 하나를 받아 앱을 호출하고 그 출력을 반환해요 — Confident는 데이터셋의 모든 골든에 대해 이 함수를 실행하고 결과를 채점해요.
def run(input):
"""Return your LLM app's output for a single dataset input."""
from my_app import agent # import your application
return agent(input) # return the output as a string
CI/CD 변수 추가 (Add the CI/CD variables)
설정 → API 키에서 프로젝트 API 키를 만든 뒤, GitLab의 설정 (Settings) → CI/CD → 변수 (Variables) 에 CONFIDENT_API_KEY라는 이름의 CI/CD 변수로 추가해요. 마스킹(Mask) 처리하고 Protect variable은 체크 해제해 두어요 — 보호된 변수는 게이트가 실행되는 머지 리퀘스트 파이프라인에 보이지 않기 때문이에요. 앱이 필요로 하는 런타임 시크릿(예: OPENAI_API_KEY)도 같은 방식으로 추가해요.
컴포넌트 include와 confident_eval.py가 기본 브랜치에 올라오면, 이후의 모든 머지 리퀘스트가 게이트를 실행하고 대상 브랜치 대비 Confident MR Eval Gate 커밋 상태(점수 비교가 담긴 노트 포함)를 게시해요.
머지 리퀘스트의 추가 파이프라인. 프로젝트에
workflow:rules가 없다면, GitLab은 같은 푸시에 대해 브랜치 파이프라인과 머지 리퀘스트 파이프라인을 모두 만들 수 있어요 — 게이트 잡 자체가 중복되진 않지만 추가 파이프라인이 보일 수 있어요. 변경마다 파이프라인을 하나만 실행하려면.gitlab-ci.yml에workflow:rules를 추가해요.
문제 해결 (Troubleshooting)
대부분의 잘못된 설정은 크게 실패해요 — 러너가 Confident MR Eval Gate 커밋 상태와 파이프라인 잡 로그에 이유를 보고해요. 소수는 조용히 실패하는데, 아래에 따로 표시해 두었어요.
| 증상 (Symptom) | 예상 원인 (Likely cause) | 해결 방법 (Fix) |
|---|---|---|
| MR에서 게이트가 실행되지 않음 (조용히) | 컴포넌트 include:가 제거되었거나, 프로젝트의 workflow:rules가 머지 리퀘스트 파이프라인을 제외함 |
컴포넌트 include를 유지하고 merge_request_event 파이프라인을 허용해요 |
| 점수가 의미 없음 — 모든 것이 "None"과 비교됨 (조용히) | run()이 None이나 문자열이 아닌 값을 반환함 |
run()에서 앱 출력을 문자열로 반환해요 |
could not import confident_eval.run |
confident_eval.py가 저장소 루트에 없거나, 함수 이름이 run이 아님 |
파일을 저장소 루트에 두고 함수 이름을 run으로 유지해요 |
app raised while producing outputs |
run()이 input 인자를 하나만 받지 않거나, 앱 런타임 시크릿이 빠졌음 |
run(input) 시그니처를 맞추고, 앱 시크릿(예: OPENAI_API_KEY)을 CI/CD 변수로 추가해요 |
could not pull dataset |
CONFIDENT_API_KEY가 없거나 회전/폐지되었거나, 데이터셋 별칭/버전/base_url이 잘못됨 |
변수를 다시 추가하고 데이터셋 별칭, 버전, 리전 base_url을 확인해요 |
잡에서 CONFIDENT_API_KEY가 비어 있음 (조용히) |
변수가 Protected여서 머지 리퀘스트 파이프라인에 숨겨짐 | 변수를 편집하고 Protect variable을 해제해요 (Masked는 유지) |
| 선택기에 프로젝트가 안 보임 | 프로젝트의 Maintainer가 아님 | CI/CD 변수 관리에는 Maintainer가 필요해요 — 오너에게 부여를 요청해요 |
| 일부 또는 모든 행에서 오류 발생 | 데이터셋에 다중 턴(multi-turn) 골든이 포함됨 | v1은 단일 턴 데이터셋만 지원해요 — 게이트를 단일 턴 데이터셋으로 지정해요 |