이 문서를 통해 아래 질문들에 답할 수 있게 됩니다.

  • RAG에서 권한 필터는 왜 모델이 아니라 서버 책임인가?
  • 문서 삭제와 권한 변경은 index에 어떻게 반영해야 하는가?
  • source id와 document version은 왜 중요한가?

개요

RAG에서 가장 위험한 실수는 권한 없는 문서나 삭제된 문서가 모델 context에 들어가는 것이다. 이 경우 모델이 답변하지 않더라도 이미 데이터가 외부 provider나 로그에 노출될 수 있다.

권한과 최신성은 RAG의 부가 기능이 아니라 핵심 설계다.

권한 필터

권한 필터는 retrieval 전에 적용한다.

  • tenant id
  • role
  • document ACL
  • project membership
  • deleted flag

검색 후에도 source id를 기준으로 서버 DB에서 읽기 권한을 다시 확인할 수 있다. 특히 vector metadata와 실제 DB 권한이 동기화되지 않을 수 있는 환경에서는 이중 확인이 안전하다.

최신성

vector similarity는 최신성을 모른다. 오래된 문서가 질문과 더 비슷하면 상위에 올 수 있다.

최신성 관리:

  • document version
  • updated_at
  • deprecated flag
  • effective date
  • source priority

답변에 source version을 남기면 CS와 개발자가 원인을 추적하기 쉽다.

코드로 이해하기

검색 결과를 source metadata와 함께 조립한다.

def format_sources(chunks):
    lines = []
    for chunk in chunks:
        lines.append(
            f"[source_id={chunk.source_id}, version={chunk.version}, updated_at={chunk.updated_at}]\n"
            f"{chunk.text}"
        )
    return "\n\n".join(lines)

source metadata는 모델용이면서 동시에 디버깅용이다.

문서 삭제와 권한 변경

문서 삭제:

  • 원본 삭제 이벤트 발행
  • vector delete job 생성
  • source id 기준 chunk 삭제
  • reconcile job으로 잔존 확인

권한 변경:

  • metadata update 또는 재색인
  • 검색 후 권한 재검증
  • 권한 경계 eval 추가

장애 상황과 대응

증상:

  • 퇴사자 문서가 검색된다.
  • 삭제된 문서가 답변 source로 나온다.
  • A팀 문서가 B팀 사용자에게 노출된다.
  • 오래된 정책이 최신 정책보다 우선된다.

대응:

  • source id로 index 상태를 확인한다.
  • metadata와 DB 권한을 비교한다.
  • 삭제 이벤트 처리 실패를 재처리한다.
  • freshness ranking을 조정한다.

인프라 협업 포인트

권한과 최신성은 데이터 파이프라인과 연결된다. 인프라팀과 event delivery, retry, dead letter queue, index update lag, reconcile job을 논의한다.

실전 팁

  • 권한 없는 chunk는 prompt에 넣지 않는다.
  • source id와 version을 답변과 trace에 남긴다.
  • 삭제 이벤트는 idempotent하게 처리한다.
  • document version이 다른 chunk가 섞이지 않게 한다.

위험 신호!

  • vector index가 원본 DB 권한 변경을 모른다.
  • source id가 없어 삭제 추적이 어렵다.
  • 오래된 문서를 deprecated 처리하지 않는다.
  • 권한 필터 테스트가 없다.

확인 질문

확인 질문

  • RAG 권한 필터를 모델에게 맡기면 안 되는 이유는 무엇인가?
    • 권한 없는 데이터가 이미 모델 입력에 들어가 유출 위험이 생기기 때문이다.
  • source id와 document version이 중요한 이유는 무엇인가?
    • 답변 근거, 장애 분석, 삭제, 재색인, 최신성 관리를 연결하기 위해서다.

Spring AI 적용 연결

참고 문서