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

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

색인 갱신

도서관은 새 책이 오면 그 책만 꽂고, 폐기할 책만 뺍니다. 서가 전체를 매번 다시 꽂지 않습니다. RAG 의 색인도 문서가 바뀔 때마다 통째로 다시 만들면 시간이 들고, 그동안 서비스가 멈춥니다. 바뀐 문서만 골라 고치는 것이 증분 색인입니다.

파일마다 해시를 재고, 지난번 기록과 견주어 다른 것을 찾고, 추가와 수정과 삭제만 반영하고, 이번 해시를 파일로 남기는 네 단계 흐름도

1번에서 파일마다 해시를 잽니다. 2번에서 지난번에 저장한 해시와 견줘, 새로 생긴 것, 내용이 바뀐 것, 사라진 것을 고릅니다. 3번에서 그 문서의 조각만 넣고, 지우고, 바꿔 넣습니다. 4번에서 이번 해시를 파일로 남겨 다음 갱신 때 씁니다. 여기서 새 책과 폐기할 책이 추가와 삭제 문서입니다.

바뀐 것 고르기

Python
before = {"a.txt": "1f3c", "b.txt": "9d2e", "c.txt": "77aa"}    # 지난번에 저장한 경로 → 해시
after = {"a.txt": "1f3c", "b.txt": "05bc", "d.txt": "e41f"}     # 지금 폴더의 경로 → 해시

added = sorted(after.keys() - before.keys())                       # 새로 생긴 것
deleted = sorted(before.keys() - after.keys())                     # 사라진 것
changed = sorted(p for p in after.keys() & before.keys() if after[p] != before[p])   # 내용이 바뀐 것
print("추가", added, "· 수정", changed, "· 삭제", deleted)

수정된 문서는 "옛 조각을 모두 지우고 새 조각을 넣는다"로 처리합니다. 조각 수가 바뀌었을 수 있으므로, 조각을 하나씩 맞추는 것보다 문서 단위로 갈아 끼우는 편이 틀릴 일이 적습니다. 그래서 조각마다 경로를 메타데이터로 붙여 둡니다.

코드에 나오는 함수

코드쉬운 뜻
after.keys() - before.keys()지금에는 있고 지난번에는 없던 경로다. 사전의 키 묶음은 집합처럼 빼기를 할 수 있다
before.keys() - after.keys()지난번에는 있었는데 지금은 없는 경로다
after.keys() & before.keys()두 때에 모두 있는 경로다. & 는 "그리고", 곧 겹치는 것이다
after[p] != before[p]같은 경로인데 해시가 다르면 내용이 바뀐 것이다
sorted(...)결과를 가나다·알파벳 차례의 목록으로 만든다. 집합은 차례가 없어서 정리해 보인다

이 코드가 뜻하는 것

도서관의 장서 점검으로 읽어 봅니다. 지난달 장서 목록과 오늘 서가를 나란히 놓고, 오늘만 있는 책은 새 책, 지난달에만 있는 책은 빠진 책, 둘 다 있지만 판이 달라진 책은 바뀐 책으로 고릅니다. 여기서 지난달 목록이 before, 오늘 서가가 after, 판이 해시입니다.

줄하는 일쉽게 말하면
before = {...}지난번의 경로와 해시다지난달 장서 목록
after = {...}지금 폴더의 경로와 해시다오늘의 서가
added = sorted(after.keys() - before.keys())새로 생긴 것을 고른다새로 들어온 책
deleted = sorted(before.keys() - after.keys())사라진 것을 고른다폐기된 책
changed = sorted(p for p in ... if after[p] != before[p])둘 다 있는데 해시가 다른 것을 고른다판이 바뀐 책

교안을 만든 PC 에서는 추가 ['d.txt'] · 수정 ['b.txt'] · 삭제 ['c.txt'] 가 나왔습니다. a.txt 는 해시가 같아 어디에도 들지 않았습니다. 네 파일 가운데 세 파일만 손보면 되고, 바뀌지 않은 파일은 다시 임베딩하지 않아도 된다는 뜻입니다. 예시의 파일 이름과 해시는 설명을 위해 지어낸 짧은 값입니다.

주의할 점

  • 판이 올라간 문서가 들어오면 옛 판의 조각을 지워야 합니다. 파일이 남아 있어도 문서 목록에서 옛 판을 고르는 규칙(최신 판만)을 갱신 때마다 다시 적용합니다.
  • 임베딩 모델을 바꾸면 모든 조각을 다시 임베딩해야 합니다. 모델이 다르면 숫자 줄끼리 견줄 수 없기 때문입니다. 색인 기록에 모델 이름도 함께 적어 둡니다.
← 이전 절11장 · 폐쇄형 RAG 와 권한다음 절 →11장 · 실습 지도