현재 옵시디언 노트를 위한 시맨틱 검색 플러그인을 개발하고 있습니다.
개발 과정에서 가장 고민되는 부분은 '언제 노트를 임베딩할 것인가'였습니다.
노트가 수정될 때마다 임베딩하면 실시간성은 확보되지만 리소스 사용량이 증가하고,
반대로 스케줄러를 통해 일괄 처리하면 리소스는 절약되지만, 최신성이 떨어지는 trade-off가 있기 때문입니다.
이런 고민을 해결하기 위해 옵시디언에서 RAG 기능을 제공하는 주요 플러그인들의 임베딩 전략을 분석해 보았습니다.
각 플러그인은 서로 다른 접근 방식을 취하고 있어, 이를 비교 분석하면서 RAG 플러그인 설계 시 참고할 만한 인사이트를 얻을 수 있습니다.
Smart Composer: 선택적 업데이트 전략
Smart Composer는 필요한 시점에만 임베딩을 수행하는 효율적인 접근 방식을 채택했습니다.
임베딩 전략
- 수정 시간 기반 판단: 파일의
mtime
(수정 시간)을 체크하여 재임베딩 필요성을 결정 - 트리거 포인트:
- 수동 실행:
rebuild-vault-index
,update-vault-index
명령을 수행하는 시점 - 자동 실행: RAG 쿼리 실행 시점
- 수동 실행:
Copilot: 전략적 임베딩 스케줄링
Copilot은 사용자가 임베딩 전략을 선택할 수 있는 유연한 접근 방식을 제공합니다.
임베딩 전략
VAULT_VECTOR_STORE_STRATEGY
설정에 따라 다음과 같이 동작합니다:
ON_STARTUP
: 플러그인 시작 시 실행ON_MODE_SWITCH
: Vault QA 모드 전환 시 실행NEVER
: 수동 실행만 허용
주요 기능
- 증분 업데이트: 마지막 임베딩 이후 수정된 파일만 처리
- 파일 필터링: 포함/제외 패턴 기반 처리
- 진행 상태 표시: 임베딩 진행 상황을 사용자에게 알림
- 프로세스 제어: 임베딩 일시 중지/재개 기능
Smart2Brain: 실시간 동기화 접근
Smart2Brain은 파일 변경을 실시간으로 감지하고 즉시 임베딩하는 적극적인 전략을 채택했습니다.
이벤트 기반 처리
this.registerEvent(this.app.metadataCache.on('changed', async (file) => /*...*/));
this.registerEvent(this.app.vault.on('delete', async (file) => /*...*/));
this.registerEvent(this.app.vault.on('rename', async (file, oldPath) => /*...*/));
주요 프로세스
- 파일 변경 감지
- 제외 파일 패턴 확인
- 문서 로딩 및 임베딩 생성
- 벡터 스토어 데이터 업데이트 표시
결론: 임베딩 전략의 트레이드오프
각 플러그인의 접근 방식은 각각의 장단점이 있습니다:
- Smart Composer:
- 특징: RAG 쿼리나 수동 명령어 실행 시에만 선택적으로 임베딩
- 장점: 불필요한 임베딩 작업을 최소화하여 컴퓨팅 리소스 절약
- 단점: 노트 변경 직후 즉시 반영되지 않음
- Copilot:
- 특징: 사용자가 직접 임베딩 시점(시작, 모드 전환, 수동)을 선택
- 장점: 사용자의 워크플로우와 시스템 환경에 맞는 유연한 접근
- 단점: 자동 업데이트 메커니즘 부족
- Smart2Brain:
- 특징: 노트 변경 즉시 자동으로 임베딩 수행
- 장점: 항상 최신 노트 상태를 반영, 지연 없는 임베딩
- 단점: 빈번한 임베딩으로 인한 시스템 리소스 과부하 가능성
다양한 전략을 분석한 결과, 현재 개발 중인 플러그인은 Copilot과 유사한 사용자 제어 방식을 채택하기로 결정했습니다.
이 접근 방식을 선택한 주요 이유는 다음과 같습니다:
- 유연성 확보: 사용자가 자신의 워크플로우와 시스템 리소스에 맞게 임베딩 전략을 선택할 수 있습니다.
- 성능 최적화: 대규모 노트 볼트에서 무분별한 실시간 임베딩으로 인한 성능 저하를 방지할 수 있습니다.
- 사용자 경험 중심: 개별 사용자의 선호도와 컴퓨팅 환경을 고려한 맞춤형 접근이 가능합니다.
향후 개발 로드맵에서는 사용자 피드백을 바탕으로 임베딩 전략의 세부 옵션을 지속적으로 개선하고, 더욱 섬세한 제어 메커니즘을 도입할 계획입니다.
'개발 > 개발 로그' 카테고리의 다른 글
옵시디언에서의 하이브리드 검색 구현 도전기 (4) | 2024.12.01 |
---|---|
옵시디언 노트 시맨틱 검색 플러그인: 1차 개발 완료 (2) | 2024.11.22 |
옵시디언 Omnisearch 플러그인 검색 성능 비교 (2) | 2024.11.17 |
옵시디언 플러그인 개발에 Windsurf IDE 활용하기 (4) | 2024.11.16 |
최근 Grok AI를 사용해보니 Gemini보다 더 만족스러웠습니다 (2) | 2024.11.15 |