사내 vLLM 기반 Ragas 평가 및 튜닝
RagService의 평가 job은 외부 평가 API를 호출하지 않는다. registry에서 RLS-visible document/chunk 표본을 선택하고, 사내 vLLM OpenAI-compatible endpoint로 질문·reference answer를 생성한 뒤 Ragas metric evaluator로 평가한다. Ragas의 single-turn contract는 user_input, retrieved_contexts, response, reference로 구성된다. [1]
| 지표 | RagService 저장 key | 판정 목적 |
|---|---|---|
| Context Precision | contextPrecision | 실제 답에 유용한 context가 search rank 상단에 배치되는 정도 |
| Faithfulness | faithfulness | 생성 answer의 claim이 retrieved context로부터 지지되는 정도 |
| Answer Relevance | answerRelevance | answer가 question에 직접 답하는 정도 |
Faithfulness는 response claim 중 context로부터 추론 가능한 claim의 비율로 해석한다. 낮은 score는 prompt instruction보다 retrieval context·citation/output validation을 우선 점검해야 한다. [2]
Dataset 생성과 실행
평가 job은 admin principal을 요구한다. RAG_EVAL_TENANT_ID, RAG_EVAL_ORGANIZATION_ID, RAG_EVAL_ACTOR_SUBJECT는 deployment secret/environment에서 주입하며 browser body에서 받지 않는다.
set -a; source .env.offline; set +a
docker compose -f docker-compose.offline.yml --profile evaluation run --rm rag-evaluator \
--samples 20 --profiles '500:5:30,500:5:60,500:5:100' --output /tmp/rag-eval-500.jsonragcenter.evaluation.RegistryDatasetBuilder는 RLS transaction에서 tb_ai_document_registry와 vector chunk를 deterministic random order로 sample한다. generator vLLM에는 해당 sample의 visible context만 전달하고 question 및 reference_answer JSON을 요구한다. sample corpus가 personal data를 포함할 수 있으므로 evaluator vLLM은 private network에만 위치해야 하며 evaluation output file의 retention policy를 audit policy와 함께 설정해야 한다.
Chunk-size isolation
300/500/1000 character chunk size는 이미 색인된 vector boundary를 바꾸므로 production index의 chunk_size를 즉시 바꿔 비교하면 안 된다. 동일 registry snapshot에서 별도로 reindex한 evaluation database를 만든 후 RAG_EVAL_DATABASE_URL_300, _500, _1000으로 연결한다.
| Profile | 예시 | activation 규칙 |
|---|---|---|
| Retrieval-only | 500:5:60 | DB에 CANDIDATE로 저장 후 admin 승인 시 runtime setting으로 적용 가능 |
| Chunk size change | 300:5:60, 1000:5:60 | requires_reindex=true; candidate만 저장되며 reindex job 완료 전 activation을 거부 |
tuning_recommendation의 최고 composite score는 자동 활성화되지 않는다. tb_rag_tuning_recommendation은 CANDIDATE → APPROVED → APPLIED 상태를 유지하고, tb_rag_runtime_setting에는 승인된 retrieval-only contextLimit/rrfK만 저장된다. 이는 small or biased sample의 결과가 production RLS retrieval behavior를 자동 변경하지 못하게 한다.
Optional dependency isolation
Ragas와 OpenAI client는 requirements-evaluation.txt에만 포함된다. API image와 CDC worker는 평가 package를 import하지 않는다. evaluation image는 Dockerfile.evaluation로 별도 build하며 Python 3.11 runtime을 사용한다.
vLLM은 /v1/chat/completions OpenAI-compatible server를 제공하므로 evaluator는 temperature 0과 JSON object response format을 사용한다. parser/schema error는 metric score로 강제 변환하지 않고 job failure로 처리한다. [3]
테스트 범위
tests/test_evaluation.py는 profile validation, dataset-size persistence, candidate sorting/storage contract를 검증한다. tests/test_rag_pipeline.py의 RLS isolation scenario와 함께, 실제 local vLLM model cache·Ragas installed evaluator·isolated index database가 준비된 on-prem staging에서 end-to-end benchmark를 실행해야 한다.