LLM 엔지니어링11장 · 폐쇄망 문서 파이프라인과 폐쇄형 RAG12 / 23← 이전목차다음 →MetaContents

11장. 폐쇄망 문서 파이프라인과 폐쇄형 RAG

폐쇄형 RAG 와 권한

회사 건물은 사원증 등급마다 들어갈 수 있는 층이 다릅니다. 안내 데스크도 찾아온 사람의 사원증을 보고, 그 사람이 들어갈 수 있는 층의 안내만 해 줍니다. 폐쇄형 RAG 도 질문한 사람의 등급을 보고 볼 수 있는 문서에서만 찾아 답합니다.

질문과 사용자 등급을 받아, 볼 수 있는 조각만 검색하고, 조각 세 개를 자료로 붙여, 로컬 LLM 이 답을 쓰고, 출처를 달아 기록하는 다섯 단계 흐름도

1번에서 질문과 함께 사용자의 등급을 받습니다. 2번 검색에서 등급보다 높은 조각을 거른 채 찾습니다. 3번에서 찾은 조각 세 개를 [자료]로 붙이고, 4번에서 사내의 Ollama 가 답을 쓰고, 5번에서 출처를 달고 기록을 남깁니다. 모든 단계가 사내 PC 안에서 돕니다. 여기서 사원증 등급이 사용자 등급, 들어갈 수 있는 층이 볼 수 있는 조각입니다.

협력사 직원은 등급 1, 정직원은 등급 1과 2, 인사팀은 등급 1부터 3까지 볼 수 있다는 것을 견준 세 카드

세 카드는 이 장의 사용자 셋입니다. 협력사 직원은 공개 문서(1)만, 정직원은 사내 문서(2)까지, 인사팀은 비밀 문서(3)까지 봅니다. 사용자의 등급 숫자보다 작거나 같은 등급의 조각만 검색에 넣습니다.

어디서 거르나

거르는 곳방법새어 나갈 위험
검색할 때(권장)벡터DB 의 조건(where, Filter)으로 볼 수 없는 조각을 아예 뺀다낮다. 모델이 그 글을 보지 못한다
검색한 뒤찾은 조각에서 등급이 높은 것을 버린다낮지만, 남는 조각이 모자랄 수 있다
프롬프트로"비밀 문서는 말하지 마세요"라고 지시한다높다. 모델이 지시를 어길 수 있다

등급으로 거르는 꼴

Chroma 에서는 where={"등급": {"$lte": 등급}} 조건을 검색에 함께 넘깁니다. $lte 는 "작거나 같다"입니다. 그 조건이 하는 일을 파이썬으로 풀면 아래와 같습니다. 실제 Chroma 호출은 실습 6에서 합니다.

Python
chunks = [{"글": "[휴가 규정] 반차는 오전 9시까지", "등급": 1},
          {"글": "[법인카드 규정] 한 번에 50만원까지", "등급": 2},
          {"글": "[인사평가 기준] S 등급은 10%", "등급": 3}]
where = {"등급": {"$lte": 2}}                     # 정직원(등급 2)의 조건. Chroma 의 col.query(..., where=where) 에 넘긴다

level = where["등급"]["$lte"]
visible = [c["글"] for c in chunks if c["등급"] <= level]     # 이 조각들만 검색 후보가 된다
print(visible)

코드에 나오는 함수

코드쉬운 뜻
chunks = [...]글과 등급을 가진 조각 세 개다
where = {"등급": {"$lte": 2}}Chroma 의 거르기 조건 꼴이다. "등급 칸이 2 이하"라는 뜻이다
"$lte"less than or equal(작거나 같다)의 줄임이다. 앞의 $ 는 칸 이름이 아니라 조건 기호라는 표시다
where["등급"]["$lte"]겹친 사전에서 조건의 숫자 2 를 꺼낸다
[c["글"] for c in chunks if c["등급"] <= level]등급이 2 이하인 조각의 글만 모은다

이 코드가 뜻하는 것

회사 엘리베이터로 읽어 봅니다. 사원증을 대면 들어갈 수 있는 층의 버튼만 불이 켜지고, 나머지 층은 눌러도 가지 않습니다. 여기서 사원증의 등급이 level, 불이 켜진 층이 visible, 엘리베이터가 버튼을 막는 규칙이 where 조건입니다.

줄하는 일쉽게 말하면
chunks = [...]등급 1, 2, 3 의 조각을 준비한다1층, 2층, 3층
where = {"등급": {"$lte": 2}}정직원의 조건을 적는다정직원 사원증
level = where["등급"]["$lte"]조건에서 숫자를 꺼낸다사원증의 등급 2
visible = [...]등급 2 이하 조각만 남긴다1층과 2층 버튼에만 불이 켜진다

교안을 만든 PC 에서는 ['[휴가 규정] 반차는 오전 9시까지', '[법인카드 규정] 한 번에 50만원까지'] 가 나왔습니다. 등급 3 인 인사평가 조각은 검색 후보에도 오르지 않았다는 뜻입니다. 이 블록은 조건이 하는 일을 파이썬으로 푼 것이고, 실제로는 Chroma 가 검색할 때 같은 일을 합니다.

주의할 점

  • 권한은 프롬프트가 아니라 검색에서 거릅니다. 모델에게 비밀 문서를 보여 주고 "말하지 마"라고 하는 것은 금고 문을 열어 둔 채 "가져가지 마세요"라고 써 붙이는 것과 같습니다.
  • 사용자의 등급은 사용자가 말한 것이 아니라 로그인 정보에서 가져옵니다. "저는 인사팀입니다"라는 질문 속 글을 믿으면 안 됩니다.
  • 기록(질문, 사용자, 찾은 조각, 답)을 남겨 두면, 무엇이 왜 보였는지 나중에 확인할 수 있습니다. 기록에도 개인정보가 들어가므로 보관 기간을 정합니다.
← 이전 절11장 · 인덱스의 속도와 정확도다음 절 →11장 · 색인 갱신