NEW코딩일지 · 11.05코퍼스 메인에 주장 연구실을 세웠다: 사유고2 주장 29만 개를 자동 등록하고 스파크 두 대가 반증 조건까지 검토한다
← 개발로그
·2분

위키룸 개발로그 · 2화

카톡 검색기를 유튜브 타임코드 검색으로 바꿔 끼웠다

원자력 이야기가 나온 영상을 날짜와 몇 분 몇 초까지 찾고 싶었다. 카카오톡의 방과 메시지를 유튜브의 채널과 영상과 타임코드로 바꿔 끼웠다. 그리고 클립 목록 대신 영상 한 편을 보여 주기로 했다.

▸ 위키룸#youtube#rag#embeddinggemma#swiftui

8월 8일에 질문이 하나 생겼다. 경제 유튜브 채널 대본을 1년치 모아 두었는데, 그 안에서 원자력 이야기가 나온 곳을 전부 찾고 싶었다. 영상 제목만이 아니라 날짜와, 영상 안의 몇 분 몇 초인지까지.

카카오톡 검색기로 이미 비슷한 일을 하고 있었다. 대화를 구간으로 나누고, 키워드와 의미로 찾고, 원문으로 돌아간다. 자료가 대화에서 자막으로 바뀌었을 뿐이다.

복제하지 않고 바꿔 끼웠다

카카오톡용 데이터 모델을 그대로 복사하면 안 됐다. 카카오톡의 단위는 방과 메시지와 보낸 사람이다. 유튜브는 채널과 영상과 타임코드다. 메시지 모델에 자막을 억지로 넣으면 “몇 분 몇 초”라는 정보가 사라진다.

그래서 검색 계층은 그대로 두고 자료를 읽는 입구만 새로 만들었다. 채널이나 주제 하나가 프로젝트 하나가 되고, 프로젝트마다 자기 SQLite DB와 벡터 색인을 따로 가진다. 타임코드가 붙은 대본 파일을 가져와 구간으로 자르고 색인한다. 질문은 그 프로젝트 안의 기록으로 남고, 전체 검색은 프로젝트별 결과를 합친다.

명령줄에는 가져오기, 색인, 검색, 전체 검색, 영상 보기, 상태 확인 명령이 생겼다. 테스트는 실제 자막 대신 타임코드가 붙은 합성 파일로 짰다.

클립이 아니라 영상 한 편

처음 검색 결과는 관련 클립을 줄줄이 나열했다. 3분 12초, 17분 40초, 다른 영상의 5분 3초. 찾는 데는 맞는 단위였다. 그런데 결과를 보다 보니 나는 클립이 아니라 영상을 판단하고 있었다. 이 영상이 원자력을 주제로 다룬 건지, 지나가며 한 번 언급한 건지가 궁금했다.

근거의 최소 단위와 사람이 판단하는 단위가 달랐다. 결과를 영상 단위로 묶고, 영상을 누르면 상세 화면에서 질문과 관련된 클립과 영상 전체 타임라인을 함께 보여 주게 바꿨다. 이틀 걸렸다.

이때 역할도 나눴다. 근거를 찾는 건 로컬 EmbeddingGemma가 한다. 고른 영상 한 편의 주장과 근거와 사례를 정리하는 건 외부 언어 모델(GPT-5.6 Luna)이 한다. 타임코드를 원본 영상 링크로 잇고 질문 이력을 남기는 건 앱이 한다. 외부 모델에 가는 건 사용자가 고른 영상 한 편의 대본뿐이다.

앱이 생겼다

이 무렵부터 명령줄만으로는 불편해서 맥 앱을 따로 만들기 시작했다. SwiftUI로 화면을 짜고 Rust 검색 엔진을 앱 안에 넣었다. 처음 이름은 “기억 작업실”이었다.

지금 위키룸에는 유튜브 21개 채널, 대본이 있는 영상 15만여 편이 들어 있다. 원자력 질문 하나로 시작한 구조가 그대로 커졌다. 채널이 늘어도 프로젝트가 하나 더 생길 뿐, 검색 엔진은 바뀌지 않았다.

위키룸 개발로그 · 전 6화

  1. 1화카톡 검색 도구 첫 색인: '전부 찾기'는 분모부터 정해야 했다
  2. 2화카톡 검색기를 유튜브 타임코드 검색으로 바꿔 끼웠다
  3. 3화사유고 책을 붙여 위키룸이 됐다: '새 화면 적용'과 실제 연결은 달랐다
  4. 4화근거 번호 없는 문장은 버린다: 교재가 근거 30개 중 4개만 썼다
  5. 5화예측 사건 자동 연결 12,490건, 감사하니 절반도 맞지 않았다
  6. 6화AI 세션 41개로 인수인계 원장과 개발 타임라인을 엮었다