45:57Chase AI
Log in to leave a comment
No posts yet
로컬 환경에서 RAG 시스템을 구축할 때 가장 먼저 마주치는 벽은 VRAM 용량과 라이브러리 간의 지독한 버전 충돌입니다. 8비트 양자화 모델은 파라미터 10억 개당 약 1GB의 VRAM을 잡아먹습니다. 윈도우나 맥 OS 자체의 점유율을 생각하면 최소 20%의 여유 공간을 남겨둬야 합니다. 이 여유가 없으면 토큰 생성 속도가 초당 2개 수준으로 기어가는 처참한 성능을 보게 됩니다. 특히 lightrag-hku 프레임워크는 최신 numpy 2.x 버전과 만나면 런타임 오류를 뱉어내기 일쑤입니다.
일단 터미널을 열고 pip install numpy==1.26.4 --force-reinstall을 입력해서 버전을 고정하십시오. 그 다음 nest_asyncio를 설치하고 코드 맨 위에 nest_asyncio.apply()를 적어줘야 합니다. 이걸 안 하면 주피터 노트북에서 비동기 루프가 꼬여서 전체 프로세스가 멈춥니다. GPU 메모리가 8GB 이하라면 LightRAG를 초기화할 때 embedding_batch_num은 10 이하로, llm_model_max_async는 4 정도로 낮게 잡으세요. 이 설정만으로도 이유 없이 시스템이 죽는 OOM(Out Of Memory) 현상을 막고 삽질 시간을 2시간은 줄일 수 있습니다.
단순히 텍스트를 덩어리로 저장하면 정보 사이의 맥락이 다 잘려 나갑니다. 하지만 옵시디언의 위키링크([[link]]) 구조를 제대로 파싱하면 꽤 근사한 지식 그래프를 만들 수 있습니다. 핵심은 LLM이 읽기 전에 불필요한 마크다운 기호를 걷어내는 작업입니다. 지저분한 기호만 치워도 토큰 소모량을 30% 가까이 아낄 수 있습니다.
메모를 작성할 때 상단 YAML 영역에 type, domain 같은 필드를 넣는 습관을 들이세요. 검색 필터링 속도가 달라집니다. 파이썬 re 모듈에서 r"\[\[(.+?)\]\]" 패턴을 써서 문서 간의 연결 고리를 뽑아낸 뒤, 이를 JSONL 형식의 관계 데이터셋으로 변환하십시오. 파일 이름도 중요합니다. '2024-04-14' 같은 날짜보다는 지식의 핵심 주제를 제목으로 써야 인덱싱된 노드가 제 역할을 합니다. 이렇게 연결된 데이터는 단순 검색을 넘어 개념과 개념을 넘나드는 추론을 가능하게 만듭니다.
로컬 LLM을 돌릴 때 가장 아까운 게 이미 계산한 임베딩을 또 계산하느라 시간을 쓰는 겁니다. 파이썬 기본 캐시는 프로그램 끄면 다 날아갑니다. 그래서 SQLite 기반의 DiskCache를 써서 물리적인 저장소를 만들어야 합니다. 질문 사이의 코사인 유사도가 0.95를 넘으면 LLM을 호출하지 않고 캐시된 응답을 바로 돌려주도록 설계하세요. 이렇게 시맨틱 캐싱을 적용하면 응답 시간을 100ms 안팎으로 줄일 수 있습니다.
방법은 간단합니다. pip install diskcache로 라이브러리를 받고 임베딩 텍스트와 벡터 쌍을 저장하는 클래스를 하나 만드세요. 여기에 시간 가중치 알고리즘을 섞어주면 더 좋습니다.
방금 수정한 메모가 검색 결과 상단에 나오도록 로직을 짜는 겁니다. 임베딩 캐시의 TTL은 1시간, 생성 응답 캐시는 2시간 정도로 잡으면 반복적인 질문에 대해 즉각적인 응답 체계를 갖출 수 있습니다.
메모 안에 들어있는 아키텍처 도표나 스크린샷은 텍스트보다 훨씬 많은 정보를 담고 있습니다. 이걸 검색에서 빼놓는 건 손해입니다. CLIP 모델을 쓰면 이미지와 텍스트를 같은 공간에 배치해서 "데이터 흐름도"라고만 쳐도 관련 이미지를 찾아낼 수 있습니다. 고사양 GPU가 없다면 CLIP-ViT-B-32 모델을 OpenVINO 포맷으로 바꿔서 CPU로 돌리면 됩니다.
마크다운 파일에서 이미지 경로를 찾으면 그 앞뒤로 200자 정도의 텍스트를 같이 묶으세요. 그 다음 Phi-3.5-vision 같은 가벼운 로컬 VLM으로 이미지 캡션을 자동으로 뽑아냅니다. 이 캡션 벡터와 이미지 특징 벡터를 Qdrant 같은 로컬 벡터 DB에 같이 저장하면 됩니다. 이 작업을 거치면 텍스트로 설명하기 힘든 복잡한 그림까지 검색 결과에 포함됩니다.
파일 하나 고칠 때마다 보관함 전체를 다시 인덱싱하는 건 미련한 짓입니다. 파이썬 watchdog 라이브러리를 쓰면 파일이 저장되는 순간을 감지해서 바뀐 부분만 업데이트할 수 있습니다. 다만 글을 쓰는 도중에 계속 인덱싱이 돌면 CPU가 비명을 지를 테니 디바운싱 처리가 필수입니다.
스크립트를 짤 때 watchdog.observers로 폴더를 감시하다가 수정 이벤트가 발생하면 5초 정도 기다렸다가 작업을 시작하게 만드세요. 각 파일의 SHA-256 해시값을 따로 저장해두고 진짜 내용이 바뀌었는지 대조하는 과정도 넣어야 합니다. 해시가 달라진 파일만 골라내서 기존 노드를 지우고 새 벡터를 밀어 넣으세요. 이렇게 해두면 메모를 저장하자마자 검색 시스템에 반영되는 실시간 지식 베이스가 완성됩니다. 직접 수동으로 업데이트 버튼을 누를 필요가 없다는 뜻입니다.