LogoSEO Jing
  • All Posts
  • SEO Jing
  • okayJing
  • KD Team
  • CLab CoreTeam
  • Study

Contact Me

© 2026 SEOJing. All rights reserved.

okayJingmemoryvector-searchretrievalarchitecture

벡터 검색을 지금 붙이지 않는 이유 — FTS와 source discipline 이후의 순서

2026년 6월 15일·5분 읽기

0. 벡터 검색은 매력적인 지름길처럼 보인다

memory 이야기를 하면 거의 바로 vector search가 나온다. embedding을 만들고, query와 비슷한 chunk를 찾고, RAG로 context를 넣으면 될 것처럼 보인다. 말만 보면 자연스럽다. 오케이징처럼 과거 대화, repo 파일, ticket, cron output이 계속 쌓이는 시스템에서는 더더욱 그렇다.

그런데 지금 단계에서 vector search를 먼저 붙이면 문제를 숨길 수 있다. 검색이 안 되는 이유가 embedding 품질 때문인지, source catalog가 엉망이라서인지, path boost가 없어서인지, 오래된 문서가 섞여서인지 구분하기 어려워진다. 그래서 순서를 일부러 늦췄다.


1. 지금 권위는 FTS와 path discipline에 있다

local-first Hermes memory의 현재 기준은 deterministic retrieval first다. SQLite catalog, FTS, path boost, source quality가 먼저다. 이 구조는 화려하지 않지만, 실패했을 때 이유를 추적하기 쉽다.

예를 들어 SEOJing 작업을 시작할 때 package.json, turbo.json, pnpm-workspace.yaml 같은 파일은 lockfile보다 우선되어야 한다. 이건 semantic similarity 문제가 아니라 작업 맥락의 문제다. embedding이 알아서 이 우선순위를 잡아주길 기대하면 안 된다.

단계먼저 안정화할 것이유
1source catalog무엇을 검색하는지 알아야 한다

포스트 목록

/okayJing/memory
파일 10개, 폴더 0개
작업 시작 전에 기억을 먼저 조회한다 — hermes-memory CLI를 붙인 이유기억은 요약이 아니라 증거여야 했다 — local-first Hermes memory를 만든 이유로컬 LLM worker를 믿기 전에 — summary, classification, reranking 평가 기준맥미니 M4 2TB를 산 이유 — 오케이징의 기억은 디스크에서 시작한다Honcho를 다시 검토할 때 — 오케이징의 장기 기억을 어디에 둘 것인가기억이 skill을 자동으로 고치면 안 되는 이유오케이징의 기억은 하나가 아니다 — memory, ticket, session_search의 역할 분담context pack은 요약본이 아니다 — 오케이징 기억에 source_id를 붙인 이유오래된 기억을 어떻게 믿을 것인가 — stale-check와 promotion queue 기준벡터 검색을 지금 붙이지 않는 이유 — FTS와 source discipline 이후의 순서
2chunk/source_id결과가 원문으로 돌아가야 한다
3FTS/path boostdeterministic하게 재현 가능해야 한다
4stale/freshness flag오래된 근거를 현재 판단과 분리해야 한다
5vector search위 기준을 보조하는 semantic recall로 붙인다

2. vector search가 필요한 순간은 따로 있다

그렇다고 vector search가 필요 없다는 뜻은 아니다. FTS는 단어가 맞아야 강하다. 사용자가 "아침마다 상황 정리해주는 거"라고 말했을 때, 실제 파일 제목이 briefing-automation-report-skill이면 FTS만으로는 놓칠 수 있다. 이런 경우 semantic retrieval이 도움이 된다.

다만 이때도 vector search는 첫 번째 권위가 아니라 recall 보조로 붙는 편이 낫다. 후보를 넓히고, 그 후보를 source quality와 freshness로 다시 거르는 구조가 더 안전하다.

text
query
→ FTS/path candidates
→ vector candidates
→ source quality + freshness + project boost
→ context pack
→ 직접 source 확인

이 흐름이면 vector search가 틀린 후보를 가져와도 마지막 단계에서 걸러질 수 있다. 반대로 vector result를 곧바로 context로 넣으면, 모델이 그럴듯한데 엉뚱한 근거를 붙들고 작업할 수 있다.


3. 도입 조건을 먼저 적어둔다

vector search를 붙이는 조건은 기능 구현보다 먼저 정해야 한다. 지금 기준에서는 최소한 아래 조건이 필요하다.

  1. source_id/chunk_id가 모든 retrieval 결과에 붙어 있을 것
  2. FTS baseline으로도 주요 작업 query의 top-k가 설명 가능할 것
  3. vector 결과가 source로 돌아가는 link를 잃지 않을 것
  4. stale/freshness 정보와 결합될 것
  5. 평가 query set이 있을 것
  6. vector result만으로 memory promotion이나 skill patch를 자동 수행하지 않을 것

이 조건을 통과하지 못하면 vector search는 검색 개선이 아니라 opaque layer가 된다. 오케이징 memory의 원칙은 local-first와 source-linked인데, opaque retrieval은 그 원칙과 잘 맞지 않는다.


4. 이번에 남은 기준

벡터 검색은 나중에 붙일 수 있다. 하지만 지금 당장 붙이지 않는 것도 설계다. 먼저 source discipline을 세우고, FTS와 path boost로 재현 가능한 baseline을 만든 뒤, 그 위에 semantic recall을 얹는 순서가 맞다.

오케이징에게 필요한 것은 검색이 똑똑해 보이는 것이 아니라, 틀렸을 때 왜 틀렸는지 추적할 수 있는 기억이다. vector search는 그 추적 가능성을 해치지 않는 범위에서 들어와야 한다.