SITE SEARCH

검색

사이트 전체 글을 빠르게 찾을 수 있습니다.

RSS FEED

RSS 구독

RSS 리더에서 Project Research의 새 글을 바로 받아볼 수 있습니다.

EMAIL SUBSCRIBE

이메일 구독

새 글을 이메일로 받아봅니다. RSS는 별도 RSS 아이콘을 눌러 동일한 크기의 패널에서 열 수 있습니다.

이메일로 블로그 구독하기

이 블로그를 구독하고 이메일로 새글의 알림을 받으려면 이메일 주소를 입력하세요







Obsidian 노트를 앱 없이 검색한다 — 오픈소스 byeori(벼리): GPU·클라우드 없는 하이브리드 마크다운 RAG

시리즈

지난 글에서 제 노트 4만여 개를 5.5배 빠르게 검색한 과정을 공유했습니다. 그 글의 마지막 조각 — “글자는 달라도 뜻이 같은 노트”를 잡아내는 헤드리스 하이브리드 임베더 — 를 다듬어 오픈소스로 공개합니다.

이름은 byeori(벼리). 앱도, GPU도, 클라우드도 없이 마크다운 노트 폴더를 로컬에서 검색하는 명령줄 도구입니다. 정확매칭(ripgrep)과 의미검색(벡터)을 한 번에 묶어 순위를 매깁니다. 한국어·교차언어를 지원하고, 라이선스는 Apache-2.0입니다.

Claude Code 사용 분석 시리즈 — 공개에 앞서, 제가 앞세운 강점이 사실인지부터 직접 검증한 결과까지 정직하게 적었습니다(과장 없음).

바쁜 분을 위한 3줄 요약

byeori는 “앱 안에 사는” 의미검색의 반대입니다 — 앱을 안 켜도, GPU 없이, 데이터를 기기 밖으로 보내지 않고, 어디서든(크론·CI·노트북) 돕니다.
제가 앞세운 강점을 직접 검증했습니다. 한국어·교차언어는 사실(다만 특화 최고는 아님), 중소기업·1인 맞춤은 강점, 속도도 사실, 정확성은 “회수율은 오르되 정밀도는 보통”으로 정직하게 적었습니다. 공개 예제에서 영어 질의가 한국어 노트를 1순위(0.43)로 찾았습니다.
저장소는 이미 공개되어 있습니다github.com/peterkimpmp/byeori (Apache-2.0, 테스트 통과). 5분이면 설치·색인·검색까지 됩니다.

들어가며

의미검색만 ‘앱 안에’ 갇혀 있었습니다

“글자 검색은 앱 없이도 잘 됩니다. 그런데 ‘비슷한 뜻’까지 찾으려는 순간, 대부분 노트 앱의 플러그인에 손이 갑니다. 앱이 켜져 있어야 하고, 스크립트로 부를 수도 없죠. 그 마지막 한 층만 떼어내면, 완전히 앱 없는 검색이 됩니다.”

— 지난 글(벤치마크)이 남긴 숙제

지난 글의 결론은 “외부 도구로 갈아타지 말고, 내 직접 읽기 방식의 낭비만 고치면 더 빠르고 튼튼하다”였습니다. 다만 한 가지가 남았습니다 — 의미(임베딩) 검색입니다. 글자가 일치하지 않아도 뜻이 같은 노트를 찾는 이 기능은, 흔히 노트 앱의 플러그인에 묶여 있습니다.

그래서 그 한 층을 앱 없이 돌아가는 작은 도구로 직접 만들었고, 쓸 만하다고 판단해 오픈소스로 공개합니다. 이름은 byeori입니다.

이 글이 답하는 것
  1. byeori가 무엇인가 — 그리고 왜 또 하나의 검색 도구인가
  2. 강점이 진짜인가 — 제 주장(한국어/맞춤/속도·정확성)을 직접 검증한 결과
  3. 어떻게 동작하나 — 5단계, 그리고 5분이면 시작하는 법
  4. 정직한 한계 — 무엇을 못 하는지, 어디에 안 맞는지
Part 1 · byeori란

‘그물의 머리줄’을 당기면, 맞는 노트가 딸려 옵니다

벼리는 그물의 위쪽을 꿰어 잡아당기는 한 가닥 줄입니다. 그 줄을 당기면 그물 전체가 따라 올라오죠. 검색이 해야 할 일이 정확히 그것입니다 — 맞는 한 가닥을 당기면 나머지가 딸려 온다.

한 줄로 정의하면 — 앱도, GPU도, 클라우드도 없이 마크다운 노트 폴더를 로컬에서 검색하는 명령줄 도구입니다. “Obsidian 의미검색” 도구들은 대개 앱 안에 살지만, byeori는 그 반대로 어디에든 둘 수 있는 도구입니다.

항목 byeori 앱 종속 플러그인 검색
앱을 안 켜도 동작 그렇다 아니다
스크립트로 호출(크론·CI·파이프라인) 그렇다 대개 어렵다
GPU·torch 필요 필요 없음 자주 필요
데이터가 기기 밖으로 기본 로컬 경우에 따라
정확매칭+의미를 한 순위로 그렇다(RRF) 드물다
Part 2 · 강점 검증

제가 앞세운 강점을 직접 검증했습니다 (과장 없이)

오픈소스로 내면서, 제가 앞세웠던 강점 세 가지가 사실인지부터 확인했습니다. 마케팅 문구가 아니라 실측과 한계를 같이 적습니다.

앞세운 강점 판정 실제
한국어 부분 사실 다국어 모델이라 한국어를 다루고, 영어로 물어도 한국어 노트를 찾습니다(공개 예제: 영어 질의→한국어 노트 1순위 0.43). 한국어 특화 최고 성능은 아니지만, 정확도가 더 필요하면 두 길을 열어 뒀습니다 — (a) --remote로 OpenAI 임베딩(교차언어 강함, 단 텍스트가 기기 밖으로 나감) · (b) 더 강한 임베딩 모델(예: bge-m3·한국어 튜닝 모델)을 정적 모델로 변환해 BYEORI_MODEL로 지정.
중소기업·1인 맞춤 사실 (핵심) 클라우드 0, GPU 0, 의존성 2개뿐. 노트북에서도 돌고 데이터가 기기를 떠나지 않습니다. 머리말·태그를 검색 신호로 써서 업무 분류에 맞춰 커스터마이즈하기 쉽습니다.
속도 사실 색인은 점진적(바뀐 조각만 다시 임베딩). 의미검색의 진짜 비용은 검색이 아니라 모델을 한 번 올리는 1초라, 작은 상주 서버를 띄우면 질의가 수십 밀리초로 떨어집니다.
정확성 결이 있음 하이브리드는 어휘 단독보다 회수율(recall)이 오릅니다(표현·언어가 달라도 회수). 다만 정적 임베딩이라 절대 정밀도는 보통입니다. “검색 SOTA”가 아니라 “실용적이고 사적인, GPU 없는 하이브리드”가 정직한 위치입니다.
사실 1등 차별점은 따로 있습니다 — “앱·GPU·클라우드가 전부 필요 없다”

제가 처음 강조하지 못했지만, 실제로 가장 큰 차이는 헤드리스라는 점입니다. 크론·CI·에어갭 어디서나 돌고, 임베더가 없으면 글자 검색으로 우아하게 강등되며, 저장 형식이 numpy/json이라 들여다볼 수 있습니다(블랙박스 아님).

Part 3 · 성능

있을 때와 없을 때, 그리고 숫자

“하이브리드가 좋다”는 말보다 숫자가 정직합니다. byeori가 있을 때(어휘+시맨틱)없을 때(어휘 단독)를 같은 쿼리로 비교했습니다.

없을 때 · 어휘(글자) 단독

질문의 단어가 노트에 글자 그대로 없으면 놓칩니다. “직원 번아웃”으로 찾으면 “소진·탈진”이라 쓴 노트, 같은 주제를 영어로 적은 노트는 회수되지 않습니다.

있을 때 · 어휘 + 시맨틱(byeori)

뜻이 같으면 표현·언어가 달라도 끌어옵니다. 같은 6개 패러프레이즈·교차언어 쿼리에서, 어휘가 못 띄운 관련 노트를 합계 37건 추가 회수했고, 영어 질의는 어휘 0건 → byeori가 한국어 노트를 1순위로 찾았습니다.

속도도 숫자로 옮기면 — byeori의 엔진을 제 실제 vault(노트 약 1.5만 개)에 돌린 실측입니다.

항목 실측 한 줄 의미
첫 색인 노트 ~1.5만 → 청크 11.7만 / 11.4초 점진 색인이라 이후엔 바뀐 조각만 다시 임베딩
인덱스 크기 352MB (numpy 평면) 외부 DB·서버 없이 파일 하나
어휘 검색 ~0.5초 ripgrep, 앱 없이
하이브리드 (서버 데움) ~0.56초 어휘+시맨틱을 한 순위로, 1초 미만
시맨틱 코어 연산 37ms 검색 자체는 원래 빠름(병목 아님)
차가운 첫 질의 ~1.2초 95%가 ‘모델 한 번 올리기’ → 상주 서버로 데우면 사라짐

※ 제 실제 vault(노트 약 1.5만·청크 11.7만, 맥) 실측과 공개 예제 기준입니다. 절대값은 노트 규모·하드웨어·모델에 따라 달라지며, 핵심은 비율과 패턴입니다 — 병목은 검색이 아니라 모델 로드이고, 그래서 상주 서버가 답입니다.

Part 4 · 작동 원리

다섯 단계로 동작합니다

① 청킹

제목(#·##·###) 경계로 노트를 나누고, 각 조각 앞에 머리말 맥락(제목·태그)을 붙여 조각이 스스로 문맥을 갖게 합니다.

② 임베딩

정적 임베딩(numpy만, torch/GPU 없음). 기본은 다국어 모델, 환경변수로 더 강한 모델로 교체할 수 있습니다.

③ 저장 (점진)

numpy 평면 행렬 한 파일. 조각마다 내용 해시로 키를 매겨, 다시 색인할 때 바뀐 것만 임베딩합니다.

④ 하이브리드 (RRF)

어휘(ripgrep)와 의미(코사인 상위)를 상호 순위 융합(RRF)으로 병합. 색인·임베더가 없으면 글자 검색으로 강등됩니다.

⑤ 상주 서버

모델과 색인을 작은 통로(소켓) 뒤에 상주시켜 질의를 데워 둡니다(차가운 1초 → 따뜻한 수십 ms).

핵심 통찰 한 줄 — 의미검색의 병목은 검색이 아니라 모델을 매번 올리는 시간입니다(약 95%). 그래서 모델을 한 번만 올려 상주시키는 것이, 빠른 검색의 거의 전부입니다.

아키텍처 — byeori는 ‘vault’와 ‘LLM’ 사이에 있습니다

byeori는 그 자체로 답하지 않습니다. 노트 폴더(vault)와 LLM(Claude·Codex) 사이에 앉아, “맞는 노트를 찾아 순위 매겨 건네는” 검색 레이어 역할만 합니다.

📁 Markdown Vault
.md 노트 폴더 (Obsidian 등) — 진실의 원본

직접 읽기 (앱·GPU·클라우드 없음)
🪢 byeori — 검색 레이어
index · 청킹 → 임베딩(model2vec) → numpy 저장 .byeori/
serve · 모델+인덱스 상주(warm)
search · 어휘(ripgrep) + 시맨틱(cosine) → RRF 병합

순위 매긴 관련 노트 (top-k)
🤖 LLM — Claude / Codex
받은 노트를 근거로 답 생성 (RAG)

시퀀스 — 질문 하나가 흐르는 길

사용자 → LLM/하네스  “내 노트에서 ___ 찾아서 답해줘”
LLM/하네스 → byeori  search("___", --mode hybrid) 호출
byeori → 상주 서버  질의 임베딩(warm, 수십 ms)  +  ripgrep 어휘 검색 (동시)
byeori 내부  어휘 결과 ∪ 시맨틱 결과 → RRF 순위 병합 → 상위 k개
byeori → LLM  순위 매긴 노트 경로·스니펫 반환
LLM → 사용자  그 노트들을 근거로 답변 (RAG 완성)
설계 포인트 — byeori는 LLM에 묶이지 않습니다. Claude든 Codex든, 혹은 셸 스크립트든, “폴더를 검색해 순위 매긴 노트를 받고 싶은” 모든 곳에 ③~⑤ 부분만 끼우면 됩니다. 그래서 크론·CI·백그라운드 에이전트 어디서나 같은 방식으로 붙습니다.
Part 5 · 5분 시작

설치 → 색인 → 검색

파이썬만 있으면 됩니다. 첫 실행 때 작은 모델(수십 MB)을 한 번 내려받고, 이후엔 전부 로컬입니다.

# 설치
pip install git+https://github.com/peterkimpmp/byeori

# 1) 색인 (이후엔 바뀐 것만 다시 임베딩)
byeori index ~/notes

# 2) (선택) 데운 서버 — 질의가 수십 ms
byeori serve ~/notes &

# 3) 검색 — 기본은 하이브리드
byeori search ~/notes "회의 후 결정된 액션 아이템 정리"
byeori search ~/notes "model evaluation" --mode semantic --top-k 5

빠른 글자 검색을 함께 쓰려면 ripgrep을 설치해 두면 좋습니다(brew install ripgrep). 없으면 의미검색만으로도 동작합니다.

Part 6 · 누구에게 · 라이선스

작은 팀·1인을 위한, 사적이고 저렴한 검색

내 지식베이스를 사적으로(클라우드에 안 올리고), 저렴하게(인프라 없이), 커스터마이즈해서 검색하고 싶은 소규모 팀·1인 컨설턴트·지식근로자에게 맞습니다. 특히 한국어·혼합언어 노트를 쓰는 분에게요.

라이선스 — Apache-2.0

특허 부여 + 자유로운 재사용으로 상업·엔터프라이즈 환경에 적합합니다. byeori는 의도적으로 작고 독립적인, 공개·무료 검색 레이어입니다. 마음껏 쓰고, 고치고, 회사 안에 넣으셔도 됩니다.

Part 7 · 정직한 한계

무엇을 못 하는지도 적습니다

  • 정적 임베딩은 빠르지만 최고 정밀도는 아닙니다. 속도·무GPU를 위해 정밀도를 일부 양보합니다. 더 강한 모델로 교체하거나, 원격(클라우드) 임베딩을 옵션으로 켤 수 있습니다.
  • numpy 평면 저장은 수십만 조각까지 적합합니다. 그 이상 규모는 전용 벡터 저장소(예정)가 정답입니다.
  • v1엔 재랭킹(reranking)이 없습니다 — 자연스러운 다음 단계입니다.
  • 이건 풀 RAG(검색 증강 생성·Retrieval-Augmented Generation) 프레임워크가 아니라 초점을 좁힌 검색 도구입니다.
마무리

필요한 한 층만, 작게 — 그리고 공개

큰 프레임워크나 무거운 인프라가 답이 아닐 때가 많습니다. 제겐 “앱 없이 도는 의미검색 한 층”이 필요했고, 그래서 딱 그만큼만 작게 만들었습니다. 쓸 만하다고 판단해 오픈소스로 공개합니다 — 같은 고민을 하는 분께 그대로 쓸모가 있기를 바랍니다.

→ github.com/peterkimpmp/byeori (Apache-2.0)

※ 본 글의 수치(교차언어 1순위 0.43 등)는 공개 저장소의 합성 예제에서의 실측이며, 노트 규모·하드웨어·모델에 따라 달라집니다. byeori는 제 운영 하네스에서 쓰던 헤드리스 임베더를 독립 도구로 추출·일반화한 것입니다.

오픈소스 RAG 시맨틱 검색 Obsidian 한국어 Claude Code Agentic PM

Project Research에서 더 알아보기

지금 구독하여 계속 읽고 전체 아카이브에 액세스하세요.

계속 읽기