옵시디언에 작성한 노트와 스크랩한 글들이 쌓이다 보니, 필요한 정보를 찾는 것이 점점 힘들어지고 있습니다.
이러한 문제를 해결하기 위해 RAG 기술을 활용한 노트 검색 기능에 집중하여 옵시디언 플러그인을 개발하려고 합니다.
관련 지식을 쌓기 위해 기존의 RAG 기반 옵시디언 플러그인들을 분석해보았습니다. 분석 과정에서는 Grok API(무료)를, 자료 조사에는 Perplexity(유료)를 활용했습니다.
Copilot
https://github.com/logancyang/obsidian-copilot
이 프로젝트는 Orama를 벡터 데이터베이스로 사용하고 있습니다.
기본 개요
Orama는 TypeScript로 작성된 오픈소스 검색 엔진으로, 전체 텍스트 검색과 벡터 검색 기능을 제공하는 하이브리드 데이터베이스입니다. 특히 의존성이 전혀 없는 것이 큰 특징입니다.
주요 기능
벡터 검색 지원
- 전체 텍스트 검색과 벡터 검색을 동시에 지원
- 자동 임베딩 생성 기능 제공
- 코사인 유사도 기반의 벡터 검색 구현
임베딩 생성
- Orama 자체 임베딩 모델 또는 OpenAI 모델 사용 가능
- 대규모 문서의 경우 NLP 기반 청킹을 자동으로 수행
- 데이터 배포 시 자동으로 임베딩 생성
사용 방법
import { create, insert, search } from '@orama/orama'
const db = create({
schema: {
title: 'string',
embedding: 'vector[1536]'
}
})
// 벡터 검색 수행
const results = search(db, {
mode: 'vector',
vector: {
value: [...], // 검색할 벡터
property: 'embedding'
},
similarity: 0.85
})[2]
장점
- 빠른 검색 속도와 메모리 기반 작동
- 간단한 설치와 사용법
- 활발한 커뮤니티 지원
- 지리적 검색 기능 지원
- 클라우드 버전을 통한 글로벌 검색 네트워크 제공
Smart Connections
https://github.com/brianpetro/obsidian-smart-connections
이 프로젝트는 OpenAI 임베딩을 사용해 vault/.smart-env/multi
폴더에 ajson
파일 형태로 임베딩 데이터를 저장하며, 별도의 벡터 DB는 사용하지 않고 있습니다. 벡터 계산에 필요한 로직은 jsbrains에 구현되어 있습니다.
Smart Second Brain
https://github.com/your-papa/obsidian-Smart2Brain
이 프로젝트는 Copilot과 마찬가지로 Orama를 벡터 데이터베이스로 사용합니다.
Smart Composer
https://github.com/glowingjade/obsidian-smart-composer
이 프로젝트는 PostgreSQL을 벡터 데이터베이스로 사용하며, PGlite를 통해 JavaScript 환경에서 PostgreSQL을 서버 없이 실행할 수 있습니다.
기본 개요
PGlite는 브라우저, Node.js, Bun 환경에서 PostgreSQL을 실행할 수 있는 WASM 기반 데이터베이스로, 작은 용량으로 고성능을 제공합니다. 기존 브라우저 기반 PostgreSQL 솔루션들과 달리 Linux 가상머신을 사용하지 않고 순수 WASM으로 구현되었습니다.
주요 특징
기술적 특징
- 3.7MB로, 가볍고 독립적인 시스템
- TypeScript/JavaScript 클라이언트 라이브러리 패키징
- PostgreSQL 확장 기능 활용
저장 옵션
- 임시 인메모리 데이터베이스로 사용 가능
- Node/Bun에서는 파일 시스템에 영구 저장
- 브라우저에서는 IndexedDB를 통한 영구 저장
pgvector 확장 기능
- 정확한 최근접 이웃 검색과 근사 최근접 이웃 검색
- 단정밀도, 반정밀도, 이진, 희소 벡터 지원
- L2 거리, 내적, 코사인 거리, L1 거리, 해밍 거리, 자카드 거리 계산 지원
활용 사례
PGlite는 유닛 테스트 및 CI 환경에 적합하며, 빠른 시작과 종료 시간으로 효율적인 테스트 환경을 제공합니다. 또한 PostgreSQL 기반 시스템과 AI 기반 기능에 확장 기능을 활용할 수 있습니다.
사용 예시
기본 설정 및 초기화
import { PGlite } from "@electric-sql/pglite";
import { vector } from '@electric-sql/pglite/vector';
// PGLite 인스턴스 생성 및 vector 확장 설정
const pg = new PGlite({
extensions: { vector }
});
// vector 확장 활성화
await pg.sql`CREATE EXTENSION IF NOT EXISTS vector`;
// 벡터 데이터를 저장할 테이블 생성
await pg.sql`CREATE TABLE items (
id bigserial PRIMARY KEY,
embedding vector(3)
)`;
// HNSW 인덱스 생성 (성능 최적화)
await pg.sql`CREATE INDEX ON items USING hnsw (embedding vector_cosine_ops)`;
데이터 삽입 예제
// 단일 벡터 데이터 삽입
await pg.sql`INSERT INTO items (embedding) VALUES ('[1, 2, 3]')`;
// 여러 개의 랜덤 벡터 데이터 삽입
for (let i = 0; i < 1000; i++) {
const randomVector = `[${Math.random()}, ${Math.random()}, ${Math.random()}]`;
await pg.sql`INSERT INTO items (embedding) VALUES (${randomVector})`;
}
벡터 검색 예제
// 검색할 쿼리 벡터 생성
const queryVector = `[${Math.random()}, ${Math.random()}, ${Math.random()}]`;
// 코사인 유사도 기반 최근접 이웃 검색
const results = await pg.sql`
SELECT * FROM items
ORDER BY embedding <-> ${queryVector}
LIMIT 10
`;
// 유클리디안 거리 기반 검색
const euclideanResults = await pg.sql`
SELECT * FROM items
ORDER BY embedding <-> ${queryVector}
LIMIT 5
`;
데이터 백업 및 복원
// 데이터베이스 덤프 생성
await fs.writeFile('backup.gz', (await pg.dumpDataDir('gzip')).stream());
// 데이터베이스 복원
const chunks = [];
await pipeline(
createReadStream('backup.gz'),
zlib.createGunzip(),
async function* (source) {
for await (const chunk of source) {
chunks.push(chunk);
}
}
);
// 새로운 인스턴스에 복원
const pg2 = new PGlite({
extensions: { vector },
loadDataDir: new Blob(chunks)
});
Orama와 PGlite/vector의 주요 특징을 비교 분석
기본 특징 비교
구분 | @orama/orama | @electric-sql/pglite/vector |
---|---|---|
유형 | 검색 엔진 및 RAG 파이프라인 | WASM 기반 PostgreSQL 벡터 확장 |
주요 기능 | 전문 검색, 벡터 검색, 하이브리드 검색 | PostgreSQL 호환 벡터 유사도 검색 |
배포 환경 | 브라우저, 서버, 엣지 네트워크 | 브라우저, Node.js, Bun, Deno |
설치 크기 | 2KB 미만 | 3MB (gzip 압축) |
기술적 특징
구분 | @orama/orama | @electric-sql/pglite/vector |
---|---|---|
검색 방식 | BM25, 벡터 검색, 하이브리드 검색 | 정확한/근사 최근접 이웃 검색 |
벡터 지원 | 임베딩 플러그인 시스템 | 단정밀도, 반정밀도, 이진, 희소 벡터 |
거리 측정 | 코사인 유사도 중심 | L2, 내적, 코사인, L1, 해밍, 자카드 거리 |
확장성 | 플러그인 시스템으로 확장 가능 | PostgreSQL 확장 시스템 활용 |
장단점
구분 | @orama/orama | @electric-sql/pglite/vector |
---|---|---|
장점 | • 30개 언어 지원 • 가벼운 용량 및 설치 • 통합 RAG 파이프라인 • 300개 글로벌 로케이션 지원 |
• PostgreSQL 호환성 • 다양한 벡터 연산 지원 • 실시간 동기화 기능 • 영구 저장소 지원 |
단점 | • 데이터 영구 저장 제한적 • 실시간 업데이트 제한 |
• 상대적으로 큰 설치 크기 • 리소스 사용량 높음 |
마치며
결론적으로, Orama를 선택해서 옵시디언 노트 검색 플러그인을 개발하는 게 훨씬 더 효율적일 것 같습니다. Orama는 설치와 사용이 정말 간단해서 개발자 입장에서 빠르게 구현할 수 있는 점이 큰 장점입니다.
Orama는 벡터 검색과 텍스트 검색을 모두 지원하고, 별도의 의존성도 없어서 유지 관리가 편리합니다. 게다가 다국어 검색과 자동 임베딩 기능 덕분에 다양한 언어로 작성된 노트도 일관성 있게 검색할 수 있어 사용에 있어서 더 편할 것 같습니다.
'개발 > 개발 로그' 카테고리의 다른 글
옵시디언 RAG 플러그인 임베딩 시점 조사하기 (0) | 2024.11.20 |
---|---|
옵시디언 Omnisearch 플러그인 검색 성능 비교 (2) | 2024.11.17 |
옵시디언 플러그인 개발에 Windsurf IDE 활용하기 (4) | 2024.11.16 |
최근 Grok AI를 사용해보니 Gemini보다 더 만족스러웠습니다 (2) | 2024.11.15 |
파인콘(Pinecone) 벡터 DB의 무료 플랜 알아보기 (1) | 2024.11.12 |