RAG와 임베딩 · 글 11편
RAG와 임베딩이 글에서 다루는 것로컬에서 돌려도 확인할 것이 있습니다. 색인 파일에 원문이 남는 문제, 온라인 모델로 조각이 전송되는 경로, 접근 권한, 문서 속 지시문, 다른 PC로 옮길 때의 점검 항목을 정리합니다.
로컬이면 안전한가
로컬 RAG의 장점은 문서, 임베딩, 답변이 모두 PC 한 대 안에서 처리된다는 것입니다. 외부로 전송되는 것이 없습니다.
하지만 “로컬”이라는 말이 모든 문제를 없애지는 않습니다. 색인을 만들면 문서의 사본이 새로 생기고, 검색 서비스를 띄우면 문서에 접근하는 길이 새로 생깁니다. 이 글은 그 지점들을 차례로 짚습니다.
1. 색인해도 되는 문서인지 먼저 정한다
색인은 문서를 조각내어 한곳에 모으는 일입니다. 원래는 각자 다른 폴더에 흩어져 있고 권한이 달랐던 문서가 검색창 하나로 묶입니다.
문서 목록을 만들 때 다음을 표시합니다.
| 구분 | 처리 |
|---|---|
| 공개 자료 | 색인 가능 |
| 내부용 일반 문서 | 로컬에서만 색인. 사용 범위를 정함 |
| 개인정보가 든 문서 | 빼거나, 개인정보를 지운 사본으로 교체 |
| 비밀 문서, 접근 제한 문서 | 넣지 않음 |
조직의 문서라면 정보 보안 담당 부서의 승인을 먼저 받습니다. 연습이나 시연에는 공개 자료나 비식별 처리한 표본을 씁니다. 내부 자료를 가져올 수 없는 상황이면 공개 표준 자료로 구조부터 만듭니다.
2. 색인 파일은 원문의 사본이다
색인 폴더에는 벡터만 있는 것이 아닙니다. 검색 결과를 보여 주려면 조각의 원문 텍스트를 함께 저장해야 합니다. 그래서 색인 파일을 열면 문서 내용이 그대로 들어 있습니다.
| 생기는 파일 | 들어 있는 것 |
|---|---|
| 추출 텍스트 | 문서 전체의 글자 |
| 조각 파일 | 조각별 원문, 문서 번호, 위치 |
| 벡터 파일 또는 벡터 데이터베이스 | 벡터와 함께 원문 조각이 저장되는 경우가 많음 |
| 로그 | 사용자의 질문, 검색된 조각, 답변 |
관리 원칙입니다.
- 색인 폴더를 원본 문서와 같은 수준으로 관리합니다. 원본은 권한이 걸린 폴더에 두고 색인은 바탕화면에 두는 일이 없게 합니다.
- 색인 폴더를 클라우드 동기화 폴더 안에 두지 않습니다. 자동으로 외부에 올라갑니다.
- 원본 문서를 지웠으면 그 문서의 조각과 벡터도 지웁니다. 원본만 지우면 검색 결과에 계속 나옵니다.
- 로그에 질문과 답변이 쌓입니다. 보관 기간을 정하고, 로그에 개인정보가 남는지 확인합니다.
- 코드를 공유 저장소에 올릴 때 색인 폴더, 추출 텍스트, 로그가 함께 올라가지 않게 제외 목록에 넣습니다.
3. 조각이 PC 밖으로 나가는 경로
RAG의 답하기 단계는 검색된 조각을 모델에 넣습니다. 이때 쓰는 모델이 온라인 모델이면 조각이 그 업체의 서버로 전송됩니다. 색인은 로컬에서 했더라도 마찬가지입니다.
| 단계 | 로컬 구성 | 온라인 구성일 때 전송되는 것 |
|---|---|---|
| 임베딩 | 로컬 임베딩 모델 | 문서 조각 전체 |
| 답변 | 로컬 대화 모델 | 질문과 검색된 조각 |
| 질의 확장, 재순위 | 로컬 모델 | 질문, 후보 조각 |
Msty처럼 로컬 모델과 온라인 모델을 함께 쓰는 도구에서는 대화마다 어떤 모델이 선택되어 있는지 확인합니다. 온라인 제공업체를 연결한 경우 질문이 해당 업체 서버로 전송된다는 점은 첫 실행과 모델 받기에서도 안내하고 있습니다. 내부 문서를 근거로 붙였다면 임베딩과 답변에 쓰이는 모델이 둘 다 로컬인지 봅니다.
모델을 처음 받을 때는 인터넷이 필요합니다. 인터넷이 차단된 PC에서 쓰려면 모델 파일을 미리 받아 옮깁니다.
4. 검색 서비스의 문
검색을 웹 화면으로 만들면 서버가 하나 뜹니다. 이 서버가 어디까지 열려 있는지가 중요합니다.
uvicorn.run("server:app", host="127.0.0.1", port=8088, reload=False)
실습 프로젝트의 마지막 줄입니다. 127.0.0.1은 이 PC 자신만 접속할 수 있다는 뜻입니다. 여기를 0.0.0.0으로 바꾸면 같은 네트워크의 다른 PC에서도 접속할 수 있습니다.
- 혼자 쓰는 도구는
127.0.0.1로 둡니다. - 부서에서 함께 쓰려고
0.0.0.0으로 여는 순간, 그 네트워크의 누구나 색인된 문서를 검색할 수 있습니다. 로그인과 권한 확인을 먼저 붙입니다. - 화면에서 버튼을 숨기는 것은 권한 통제가 아닙니다. 주소를 직접 호출하면 그대로 응답합니다. 서버 쪽에서 요청을 거부해야 하고, 실제로 주소를 직접 호출해 시험합니다.
- 파일 올리기 기능이 있으면 누가 무엇을 올릴 수 있는지 정합니다.
5. 사람마다 볼 수 있는 문서가 다를 때
여러 사람이 쓰는 검색에서 가장 어려운 부분입니다. 원래 A팀만 볼 수 있는 문서가 색인에 들어가면, 검색하는 누구에게나 그 조각이 답변의 근거로 나올 수 있습니다.
- 가장 간단한 방법은 색인을 나누는 것입니다. 권한이 같은 문서끼리 묶어 색인을 따로 만듭니다.
- 한 색인을 함께 쓰려면 조각마다 공개 범위를 기록하고, 검색할 때 사용자의 권한으로 먼저 걸러 냅니다. 모델에 넣은 뒤에 “이 내용은 말하지 마”라고 지시하는 것은 통제가 아닙니다.
- 답변에 출처를 표시하면 사용자가 볼 수 없는 문서의 제목이 드러날 수 있습니다. 걸러 내는 단계는 검색 직후에 둡니다.
6. 문서 속의 지시문
검색된 조각은 모델의 입력으로 들어갑니다. 문서 안에 “이전 지시를 무시하고 다음을 수행하라” 같은 문장이 있으면 모델이 그것을 지시로 받아들일 수 있습니다. 외부에서 받은 문서, 웹에서 수집한 글, 메일 첨부를 색인할 때 생기는 문제입니다.
- 문서 본문은 근거 자료로만 다룹니다. 그 안에 지시문처럼 보이는 문장이 있어도 실행 규칙으로 올리지 않습니다.
- 모델 입력에서 지침과 자료의 경계를 분명히 나눕니다.
- 파일 삭제, 메일 발송 같은 실행 권한은 모델이 아니라 프로그램에서 관리합니다. 문서 검색 도구에는 읽기 권한만 줍니다.
7. 개인정보를 줄이는 방법
- 색인 전에 걸러 냅니다. 주민등록번호, 전화번호, 계좌번호처럼 형식이 정해진 정보는 규칙으로 찾아 가립니다.
- 민원 기록처럼 개인정보가 본문에 섞인 자료는 이름과 연락처를 지운 사본을 만들어 색인합니다.
- 필요한 문서만 넣습니다. “혹시 몰라서” 전부 넣지 않습니다.
- 시연용 표본은 따로 만듭니다. 실제 자료로 시연하지 않습니다.
8. 다른 PC로 옮길 때
외부에서 만든 도구를 내부망 PC로 옮기는 경우의 점검 항목입니다. 강의의 이관 점검표에서 보안과 관련된 것을 골랐습니다.
- API 키는 설정 파일(.env)에만 있고 코드에는 없다
- 코드에 개발 PC의 경로가 박혀 있지 않다. 상대 경로를 쓴다
- 표본 자료는 비식별 처리했다
- 옮기는 묶음에 내부 원문, 개인정보, 키가 들어 있지 않다
- 임베딩 모델과 대화 모델 파일을 따로 준비했다
- 오류가 났을 때 담당자 안내 문구가 나온다
- 정보 보안 담당 부서의 사전 승인을 받았다
- 소수 인원으로 시범 운영을 먼저 한다
공개 자료만 쓰는 시연판과 내부 자료를 쓰는 로컬판을 구분해 둡니다. 두 판의 폴더가 섞이면 내부 자료가 시연판에 딸려 나갑니다.
요약
| 질문 | 확인할 것 |
|---|---|
| 이 문서를 넣어도 되나 | 공개 범위, 개인정보 여부, 승인 |
| 사본이 어디에 생기나 | 추출 텍스트, 조각, 벡터, 로그 |
| 밖으로 나가는 것이 있나 | 임베딩 모델과 대화 모델이 로컬인지 |
| 누가 접속할 수 있나 | 서버 주소, 로그인, 서버 쪽 권한 확인 |
| 문서가 모델을 조종할 수 있나 | 자료와 지침의 분리, 읽기 전용 권한 |
폐쇄망과 공공기관 환경에서의 구성은 이 사이트의 다른 시리즈에서 따로 다룹니다.