본문 바로가기
C.W.K.
Stream
Lesson 03 of 04 · published

segment 위의 FTS

~11 min · fts, segments, inverted-index, derived

Level 0Empty Shelf
0 XP0/35 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete
"구조화된 진실을 색인해. export 는 절대 색인하지 마 — export 는 틀려도 되는 거야."

솔깃한 지름길

Recall 은 읽을 수 있는 Markdown transcript 를 만들어. 바로 거기 있잖아. 영상당 파일 하나, 네가 검색하고 싶은 바로 그 텍스트로 가득. 그러니 지름길이 저절로 떠올라. 검색 index 를 Markdown 폴더에 겨누면 끝. 온 본능이 그러라고 하지. Recall 은 아니라고 하고, 그 이유가 금방 쌓여.

  • Markdown 은 바뀔 수 있어. 사람이 손으로 고칠 수도 있고, 동기화 때문에 오래된 버전이 될 수도 있고, 재생성으로 교체될 수도 있는 디스크의 파일이야. 그걸 색인하면 export 가 입력이 되는 거고, 트랙 2 가 금지한 바로 그 loop 이 생겨. 손으로 고친 파일이 네 검색이 믿는 걸 조용히 다시 써버릴 거야.
  • Markdown 은 구조를 잃어버렸어. 여기서 제품은 검색이 아니라 영상으로 돌아가는 문이잖아. 그 문에는 segment 마다 절대 타임스탬프가 필요해. release 를 산문으로 납작하게 눌러버리면 타임스탬프가 사라져. 단어는 찾는데 두 시간짜리 영상 어디쯤에 있는지는 여전히 모르는 거지.
  • index 는 다시 지을 수 있어야 해. 파생 index 에는 purge 하고 replay 할 수 있는 canonical 소스가 있어야 하거든. 그 소스는 누가 손댔을지 모르는 파일이 아니라 DB 에 있는 release 야.

release 가 실제로 뭔지를 색인해

그래서 Recall 은 current release 에서 DB 안의 전문 index 로 투영된, 순서 있는 타임스탬프 segment 를 색인해. hit 마다 그 문을 여는 데 필요한 걸 다 들고 있어. 자기가 나온 current release, 절대 영상 타임스탬프, 주변 텍스트, source identity 와 경로, release 의 content hash, 그리고 rank. 그게 바로 행동할 수 있는 검색 결과야. 누르면 엔진이 정확히 어느 영상 어느 초인지를 알거든.

Markdown 은 여전히 있고 여전히 쓸모 있어. 사람이 읽는 용도로. 다만 철저히 하류에, 권위 없는 export 로 남아서 아무 데도 안 껴. index 에도, queue 완료에도, 요약의 진실에도. 레거시 corpus 도 이 규칙을 따랐어. 그 옛 Markdown 은 분명히 라벨을 단 구조화 증거로 한 번 import 됐고, 그 뒤로 검색은 파일이 아니라 구조화된 segment 위에서 돌았지.

세심함을 드러내는 디테일 둘

첫째, 제품 검색은 hit 을 영상별로 묶되 나머지를 버리지는 않아. 순진하게 묶으면, 그러니까 영상당 행 하나에 최고 hit 만 남기면 그 영상의 나머지 match 가 전부 조용히 사라지는데, 하필 그게 네가 찾던 순간인 경우가 많거든. 묶기는 표현 방식의 선택이지 데이터를 버리는 선택이 되면 안 돼.

둘째, 비슷한 영상을 찾아주는 결과는 지금은 lexical 방식이고, vector index 는 일부러 canonical 상태가 아니야. 나중에 붙인다 해도 규칙은 이미 정해져 있어. release 를 기준으로 주소가 잡히고 언제든 다시 지을 수 있어야 해. 같은 버전 있는 진실에서 파생되고, purge 하고 replay 할 수 있고, 두 번째 권위의 원천은 절대 되지 않게. 파생된 건 아무리 영리해져도 파생된 채로 남아.

Code

index 는 current release segment 의 투영이다·sql
-- release 의 순서 있는 타임스탬프 segment: 구조화된 진실.
CREATE TABLE transcript_segments (
  release_id   TEXT NOT NULL,
  seq          INTEGER NOT NULL,
  start_ms     INTEGER NOT NULL,   -- 절대 영상 타임스탬프
  end_ms       INTEGER NOT NULL,
  text         TEXT NOT NULL
);

-- 검색 가능한 투영. 파생됨 -> purge 하고 replay 해서 재구축.
CREATE VIRTUAL TABLE transcript_segment_fts USING fts5(
  text,
  content='transcript_segments'
);

-- hit 이 영상으로 돌아가는 문을 지닌다:
--   video_id + start_ms  -> 그 정확한 초에서 원본 열기
--   content_sha256       -> 어느 release 버전에서 왔나
--
-- 생성된 Markdown 은 아무것도 색인 안 한다. 그건 export.

External links

Exercise

네 일에서 검색 index 나 cache 나 파생 뷰를 찾아서 실제로 뭘 읽는지 따라가 봐. 소스가 canonical 한 구조화 record 야? 아니면 렌더되거나 export 된 산물(Markdown 파일, CSV dump, HTML 페이지, 생성된 리포트) 이야? export 라면 실패를 대봐. 누가 그 파일을 고치면 어떻게 돼? 오래되면? 그다음 구조화 소스 쪽으로 다시 겨누고, index 전체를 처음부터 purge 하고 다시 지을 수 있는지 확인해.
Hint
질문 두 개. 하나, index 를 통째로 지우면 canonical 소스에서 다시 지을 수 있어? 아니면 index 에만 있던 뭔가를 잃어? 뒤엣것에 해당하는 건 파생물이 아니라 선언 안 된 진실이야. 둘, index 가 사람이 손으로 고칠 수 있는 걸 하나라도 읽어? 그렇다면 export 가 입력이 된 거고, 시스템의 믿음을 이제 텍스트 편집기로 고칠 수 있게 된 거야.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.