Skip to main content
이 문서는 한국어 RAG 최적화 의 일부입니다.
한국어 임베딩 모델 선택, RAG 베스트 프랙티스(Re-ranking 포함), 한국어 특화 전처리, 평가 주의사항, 트러블슈팅을 다룹니다.

5. 한국어 임베딩 모델 선택 가이드

임베딩 모델 선택은 RAG 검색 품질에 직접적인 영향을 미칩니다. 한국어 환경에서는 다국어 모델한국어 특화 모델 중 사용 환경에 맞는 것을 선택해야 합니다.

multilingual-e5 vs KoSimCSE: 언제 어떤 모델을 선택할 것인가

기준multilingual-e5-large-instructKoSimCSE (SKT)bge-m3 (BAAI)
한영 혼용 문서최적영어 성능 약함우수
순수 한국어 문서우수최적우수
Databricks 기본 제공가능 (Foundation Model API)불가 (직접 배포 필요)불가 (직접 배포 필요)
운영 복잡도낮음높음 (Model Serving 배포)높음 (Model Serving 배포)
추론 속도보통빠름 (768차원)보통
Dense + SparseDense만Dense만둘 다 지원
권장 선택 기준:
  1. 빠른 시작 + 한영 혼용: multilingual-e5-large-instruct (Databricks 기본 제공, 추가 배포 불필요)
  2. 순수 한국어 + 최고 품질: KoSimCSE-roberta-multitask (한국어 STS 벤치마크 최상위)
  3. 하이브리드 검색 내장: bge-m3 (Dense + Sparse 벡터를 하나의 모델에서 동시 생성)
  4. 비용 최적화: gte-multilingual-base (768차원, 빠른 추론, 스토리지 절약)

모델 비교 테이블

모델차원한국어 성능Databricks 지원비고
multilingual-e5-large-instruct1024우수Foundation Model API다국어, Databricks 기본 제공
bge-m3(BAAI)1024우수Model Serving 배포Dense + Sparse 하이브리드 지원
KoSimCSE(SKT)768매우 우수Model Serving 배포한국어 특화, STS 벤치마크 상위
gte-multilingual-base(Alibaba)768우수Model Serving 배포경량, 빠른 추론 속도

KoSimCSE를 Model Serving에 배포하는 방법

한국어 특화 모델을 사용하려면 Databricks Model Serving에 직접 배포해야 합니다.
import mlflow
from sentence_transformers import SentenceTransformer

# 1. 모델 로드 및 MLflow에 로깅
model = SentenceTransformer("BM-K/KoSimCSE-roberta-multitask")

with mlflow.start_run():
    mlflow.sentence_transformers.log_model(
        model=model,
        artifact_path="kosimcse",
        registered_model_name="catalog.schema.kosimcse_embedding",
        input_example=["한국어 임베딩 테스트"],
    )

# 2. Model Serving Endpoint 생성
from databricks.sdk import WorkspaceClient
from databricks.sdk.service.serving import EndpointCoreConfigInput, ServedEntityInput

w = WorkspaceClient()
w.serving_endpoints.create_and_wait(
    name="kosimcse-embedding",
    config=EndpointCoreConfigInput(
        served_entities=[
            ServedEntityInput(
                entity_name="catalog.schema.kosimcse_embedding",
                entity_version="1",
                workload_size="Small",
                scale_to_zero_enabled=True,
            )
        ]
    ),
)

Databricks Foundation Model API 활용

from langchain_databricks import DatabricksEmbeddings

# Databricks에서 기본 제공하는 다국어 임베딩
embeddings = DatabricksEmbeddings(
    endpoint="databricks-gte-large-en"  # 또는 커스텀 배포 엔드포인트
)

# 한국어 텍스트 임베딩
vectors = embeddings.embed_documents([
    "Databricks에서 RAG 파이프라인을 구축합니다",
    "데이터 레이크하우스 아키텍처 개요"
])
한국어 전용 임베딩 모델(KoSimCSE 등)은 한국어 내부 유사도 측정에서는 뛰어나지만, 한영 혼용 문서가 많은 환경에서는 다국어 모델(multilingual-e5-large-instruct, bge-m3)이 더 적합합니다.

6. 한국어 RAG 베스트 프랙티스

왜 Re-ranking이 한국어 RAG에서 특히 중요한가

Re-ranking은 단순히 “검색 결과를 더 잘 정렬하는 것”이 아니라, LLM이 최종 답변을 생성하는 품질에 직접적으로 영향 을 미칩니다. “Lost in the Middle” 문제: LLM은 컨텍스트의 위치에 민감하다 2023년 스탠포드 연구(“Lost in the Middle: How Language Models Use Long Contexts”)에서 밝혀진 핵심 발견은, LLM이 긴 컨텍스트를 받았을 때 처음과 끝에 있는 정보는 잘 활용하지만, 중간에 있는 정보는 간과하는 경향 이 있다는 것입니다.
LLM에 전달되는 컨텍스트 (5개 문서):

  [문서 1] ← 높은 활용도   (컨텍스트의 시작)
  [문서 2] ← 보통
  [문서 3] ← 가장 낮은 활용도   (컨텍스트의 중간 = "사각지대")
  [문서 4] ← 보통
  [문서 5] ← 높은 활용도   (컨텍스트의 끝)
Re-ranking 전후 비교 예시:
질문: "Databricks에서 Delta Lake 테이블의 OPTIMIZE 명령 실행 주기는?"

── Re-ranking 없이 (1차 검색 결과 그대로) ──
1위: Delta Lake 개요 및 특징 소개          ← 주제는 맞지만 답변 없음
2위: OPTIMIZE와 VACUUM 명령어 상세 가이드   ← 정답이 여기에! (2위)
3위: Delta Lake 트랜잭션 로그 구조          ← 관련은 있지만 답변 없음

── Re-ranking 후 (Cross-encoder가 재정렬) ──
1위: OPTIMIZE와 VACUUM 명령어 상세 가이드   ← 정답! 최상위로 올라옴
2위: 파티셔닝 전략과 Z-ORDER               ← OPTIMIZE와 직접 연관
3위: Delta Lake 개요 및 특징 소개
한국어에서 Re-ranking이 특히 효과적인 이유:
  1. 조사 변형에 의한 노이즈: Cross-encoder는 표면적 차이를 무시하고 핵심 의미만으로 판단합니다.
  2. 한영 혼용 매칭: “벡터 검색”과 “Vector Search”가 동일 개념임을 정밀 포착합니다.
  3. 전문 용어 문맥 이해: “Unity Catalog의 권한”이라는 구체적 문맥을 이해하여 정밀하게 순위를 매깁니다.
참고 실전 수치: 한국어 기술 문서 RAG에서 Re-ranking을 추가하면 Top-5 Precision이 일반적으로 10~25%p 향상 됩니다. Re-ranking의 구체적인 구현 방법과 모델 비교는 Re-ranking 개념Reranking 전략 페이지를 참조하세요.

한국어 특화 전처리

import re
from kiwipiepy import Kiwi

kiwi = Kiwi()

def preprocess_korean(text: str) -> str:
    """한국어 RAG를 위한 텍스트 전처리"""
    # 1. 불필요한 공백 정리
    text = re.sub(r'\s+', ' ', text).strip()

    # 2. 특수문자 정리 (문장부호는 유지)
    text = re.sub(r'[^\w\s가-힣a-zA-Z0-9.,!?·\-()]', '', text)

    # 3. 한자 → 한글 변환 (Kiwi 내장 기능)
    # Kiwi는 분석 시 자동으로 한자를 한글로 매핑

    return text

평가 시 주의사항

  • 한국어 평가 데이터셋을 직접 구축 해야 합니다. 영어 벤치마크 결과가 한국어 성능을 보장하지 않습니다.
  • 평가 지표: Retrieval에는 Recall@K (상위 K개 결과 중 정답이 포함된 비율), MRR(Mean Reciprocal Rank), 생성에는 정확성, 근거 충실도(Faithfulness) 를 측정합니다.
  • MLflow Evaluate를 활용한 평가 방법은 RAG 평가 가이드를 참조하세요.
주의 한국어 RAG 시스템을 평가할 때, LLM-as-Judge를 사용한다면 평가 프롬프트도 한국어로 작성하거나, 한국어 이해도가 높은 모델(Claude, GPT-4 등)을 Judge로 사용해야 합니다.

7. 한국어 RAG 실전 트러블슈팅

자주 발생하는 문제와 해결법

문제원인해결 방법
”데이터브릭스”를 검색하면 “데이터브릭스에서”가 포함된 문서가 안 나옴공백 기반 BM25에서 조사 결합 형태를 다른 단어로 인식Kiwi 토크나이저를 적용한 BM25 사용
한영 혼용 문서에서 영어 키워드 검색이 안 됨한국어 특화 임베딩 모델이 영어 표현을 잘 이해하지 못함다국어 모델(multilingual-e5, bge-m3) 사용
청크 중간에서 문장이 잘림영어 기반 구분자만 사용한국어 종결어미 구분자 추가 (“다. ”, “요. “)
토큰 비용이 예상보다 높음한국어가 영어 대비 2~3배 많은 토큰 소비청크 크기를 문자 수로 관리, 컨텍스트 길이 최적화
검색 결과는 좋은데 답변이 부자연스러움LLM의 한국어 생성 품질 문제Claude 또는 GPT-4 등 한국어 성능이 좋은 모델 사용
동의어/유의어 검색이 안 됨”자동차”와 “차량” 등 동의어의 임베딩 거리가 멀 수 있음Query Expansion 또는 Multi-Query Retriever 적용

성능 벤치마크 참고값

한국어 기술 문서 기반 RAG 시스템의 일반적인 성능 범위입니다 (참고용):
지표양호우수최적화 목표
Recall@5> 0.75> 0.85> 0.90
Faithfulness> 0.80> 0.90> 0.95
Answer Relevancy> 0.80> 0.85> 0.90
검색 지연< 500ms< 200ms< 100ms
전체 응답 시간< 8초< 5초< 3초
참고 위 수치는 한국어 기술 문서 기준의 참고값입니다. 도메인(법률, 의료 등)에 따라 기대치가 다를 수 있으며, 반드시 해당 도메인의 평가 데이터셋으로 측정해야 합니다.

참고 문서